gpt4 book ai didi

c - Uart 接收到正确的字节,但顺序困惑

转载 作者:行者123 更新时间:2023-11-30 16:48:23 25 4
gpt4 key购买 nike

使用Atmel studio 7,搭配STK600和32UC3C MCU

我正在为此拉扯我的头发。我每 5 秒通过 UART 发送一次可变大小的字符串。该字符串由一个字母作为操作码组成,然后是两个字符,它们告诉后面的数据字符串的长度(没有零,任何这些字符串的末尾都不会有零)。在大多数情况下,字符串的大小为 3 个字符,因为它没有数据(“p00”)。

经过调查,我发现应该是“p00”的实际上是“0p0”或“00p”或(仅在重新启动微型“p00”后第一次尝试)。我在调试器的内存 View 中查找了它。然后我启动 hTerm 并确认数据实际上是“p00”。因此,过了一会儿,hTerm 显示了“p00p00p00p00p00p00p00...”,而我的循环 uart 缓冲区的内存读取为“p000p000p0p000p0p000p0p0...”

编辑:实际上“0p0”和“00p”是交替的。

波特率为9600。以前我只发送单封信。所以一切都运行良好。

这是接收器中断的代码:我尝试了不同的代码变体,它们都以不同的方式执行相同的操作。但它们都表现出了完全相同的行为。

lastWebCMDWritePtr 是 uint8_t* 类型,lastWebCMDRingstartPtr 也是如此。lastWebCMDRingRXLen 是 uint8_t 类型。

__attribute__((__interrupt__))
void UartISR_forWebserver()
{
*(lastWebCMDWritePtr++) = (uint8_t)((&AVR32_USART0)->rhr & 0x1ff);
lastWebCMDRingRXLen++;
if(lastWebCMDWritePtr - lastWebCMDRingstartPtr > lastWebCMDRingBufferSIZE)
{
lastWebCMDWritePtr = lastWebCMDRingstartPtr;
}
// Variation 2:
// advanceFifo((uint8_t)((&AVR32_USART0)->rhr & 0x1ff));

// Variation 3:
// if(usart_read_char(&AVR32_USART0, getReadPointer()) == USART_RX_ERROR)
// {
// usart_reset_status(&AVR32_USART0);
// }
//

};

欢迎您提出任何想法和建议。

问候Someo

附注我添加了 Atmel studio 标签,以防这与 AS 的无数调试器错误有关。

最佳答案

要获得完整的图片,您必须显示 lastWebCMDWritePtrlastWebCMDRingRXLenlastWebCMDRingstartPtrlastWebCMDRingBufferSIZE 的位置和方式在其他地方使用(在消费端)

此外,我会首先尝试一个更简单的 ISR,不依赖于其他软件模块来排除硬件响应。寄存器处理问题。

方法:

#define USART_DEBUG
#define DEBUG_BUF_SIZE 30

__attribute__((__interrupt__))
void UartISR_forWebserver()
{
uint8_t rec_byte;
#ifdef USART_DEBUG
static volatile uint8_t usart_debug_buf[DEBUG_BUF_SIZE]; //circular buffer for debugging
static volatile int usart_debug_buf_index = 0;
#endif

rec_byte = (uint8_t)((&AVR32_USART0)->rhr & 0x1ff);

#ifdef USART_DEBUG
usart_debug_buf_index = usart_debug_buf_index % DEBUG_BUF_SIZE;
usart_debug_buf[usart_debug_buf_index] = rec_byte;
usart_debug_buf_index++

if (!(usart_debug_buf_index < DEBUG_BUF_SIZE)) {
usart_debug_buf_index = 0; //candidate for a breakpoint to see what happened in the past
}
#endif
//uart_recfifo_enqueue(rec_byte);

};

关于c - Uart 接收到正确的字节,但顺序困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42976780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com