使用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的无数调试器错误有关。
答案 0 :(得分:0)
要获得完整的图片,您必须显示 lastWebCMDWritePtr , lastWebCMDRingRXLen , lastWebCMDRingstartPtr 和 lastWebCMDRingBufferSIZE 的位置和方式在其他地方(在消费方面)使用
另外,我首先尝试更简单的ISR,不依赖于其他软件模块来排除硬件分配。注册处理问题。
方法:
{{1}}