Uart接收正确的字节但是按照混乱的顺序

时间:2017-03-23 12:59:19

标签: c atmel atmelstudio

使用Atmel studio 7,STK600和32UC3C MCU

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

经过调查,我发现应该是“p00”的事实上是“0p0”或“00p”或(仅在重新启动微型“p00”后才开始尝试)。我在调试器的内存视图中查找了它。然后我启动了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);
//  }
//      

};

我欢迎您的任何想法和建议。

Regarts Someo

P.S。我放了Atmel工作室标签,以防万一与AS的无数调试器错误有关。

1 个答案:

答案 0 :(得分:0)

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

另外,我首先尝试更简单的ISR,不依赖于其他软件模块来排除硬件分配。注册处理问题。

方法:

{{1}}