2014-09-02 92 views
-1

我在同步模式下使用USART从主机与固件进行通信(驻留在ATMega 1284P中)。我在固件端的最大缓冲区大小是20,如果我连续从主机发送数据到固件,并且一些从固件到主机的应答,通信锁定了。我怀疑发送数据缓冲区(TXB)和接收数据缓冲区(RXB)公用的UDR寄存器是否锁定,从而导致通信中断。对此问题有何建议?AVR ATMega1284P USART通信锁定

PS: 对于从固件transmisson到主机时,codition是: UCSRA &(1 < < UDRE)应为TRUE

对于从主机接收到固件,条件是: UCSRA &(1 < < RXC)应该为TRUE

我正在使用硬件中断M_USARTx_RX_vect来检查主机串行字符的可用性。

更新:Firmware - Initial Source:MarlinSerial.cpp:USART定义,Marlin_main.cpp:程序流

+3

关于嵌入式编程,如何在atmega器件中使用UART。没有涉及网络! – Klaus 2014-09-02 11:50:44

+0

你真的是指“同步”模式吗?这总是使用一个单独的时钟线。如果您通过rs232与PC进行通信,则必须使用异步模式!也许这个问题从这里开始...... – Klaus 2014-09-02 11:52:59

+0

不,我不使用rs232,主机(运行arch linux)和控制器都在两个不同的板上绑定在一起。所以没有涉及电缆。 – Nagarjun 2014-09-02 11:58:41

回答

0

UDR寄存器是实际存在在AVR地址空间的同一地址两次(特殊IO寄存器映射) 。硬件中的uxrt和rx的udr之间没有锁定。

显示的条件似乎对我确定,但我没有看过avr数据表。

也许你在写/读循环时遇到一些问题? 20个字符缓冲区?请显示您的代码(请缩小我们需要了解的最小值)。

+0

如果我将主机发送给固件的数据限制在20以内,那么它工作的很好。然后,根据从固件端到主机的确认,我发送更多数据。缓冲区是char类型的。只有持续从主机传输数据时才会出现此问题。一旦超过20的限制,固件将停止响应(固件不能发送确认,主机正在等待确认发送下一个数据)。 – Nagarjun 2014-09-02 12:18:18

+2

所以请你必须告诉我们你的代码,也许我们可以找到问题。我不是远程分析黑盒子的专家:-) – Klaus 2014-09-02 12:47:06