AVR单片机通讯用发送标识UDRE和TXC的区别:
AVR的说明书上说:
“TXC标志位可以用来检验一个数据帧的发送是否已经完成,RXC标志位可以用来检验接收缓冲器中是否还有数据未读出。在每次发送数据之前(在写发送数据寄存器UDR前)TXC标志位必须清零。”
“数据寄存器空UDRE标志位表示发送缓冲器是否可以接受一个新的数据。该位在发送缓冲器空时被置"1”;当发送缓冲器包含需要发送的数据时清零。”
“当整个数据帧移出发送移位寄存器,同时发送缓冲器中又没有新的数据时,发送结束标志TXC置位。TXC在传送结束中断执行时自动清零,也可在该位写"1”来清零。”
看完上述的说明之后,我一直疑惑在发送数据时,是不是要同时进行两种操作:
1、判断UDRE为1。
2、清除TXC标识。
但是在网上见到的实用程序中,并没有上面的第二项操作,似乎也可以行得通。带着这个疑惑,我在网上搜到了一个比较好的回答:
“关于AVR的串口,解释如下:
对于发送,有一个UDR缓冲寄存器,还有一个移位寄存器。当你写一次UDR时,单片机会立即把这个数据转到移位寄存器,所以你还可以立即写第二个数据。以后每当UDR缓冲寄存器空的时候,就会产生UDRE中断,而要产生TXC中断,就必须等移位寄存器的数据都发送完毕后才会产生。
对于接收,有两个UDR缓冲寄存器,还有一个移位寄存器。两个接收缓冲器相当于一个FIFO结构。当有数据接收时,如果一个完整的数据被接收到移位寄存器,会将其转到缓冲寄存器。这样会产生RXC中断。
AVR和51不同,这样的结构会更好。例如当你的程序很忙在另外一个中断里,这时有串口接收数据。两个缓冲器会为你赢得时间,而不会丢失数据。发送数据也一样。而51就不是这样的。”