新手上路
- 积分
- 47
- 金钱
- 47
- 注册时间
- 2010-12-29
- 在线时间
- 3 小时
|
发表于 2014-1-16 14:59:46
|
显示全部楼层
回复【楼主位】sanas:
注意带底色的字体部分
DMA串口接收一帧数据,但是第一个字节丢失,求大家帮忙,谢谢!
---------------------------------
TC 是发送完成标志,TXE是数据发送至移位寄存器的标志,用法略有区别,至于
while (USART_GetFlagStatus(usart,USART_FLAG_TXE) == RESET);
USART_SendData(usart,data);
这个while语句在前还是在后,个人认为,ST原本目的是为了照顾引脚复用的情况,当判断while 在前判断TC或TXE的时候,这两条语句执行完毕之后,如果串口被复用被改变了输出状态,则可能导致串口内的数据无法正常送出。
如果判断TC在前,判断while 在后(st现有做法),那么就出现丢首字节的问题。
如果判断TXE在前判断while 在后,则因TXE并不代表当前传输完毕,所以串口复用的时候依然会存在可能导致尾字节无法送出的问题。
所以这个问题的解决方案要根据各人的实际使用情况来确定:
如果串口不会复用,则建议选用判断TXE标志。亦即:
USART_SendData(usart,data); //A
while (USART_GetFlagStatus(usart,USART_FLAG_TXE) == RESET); //B
//这里选用TXE而不是TC,是因为TXE默认为1,当A执行后,TXE就立刻变成了0,所以接下来的while就起作用了。
//如果选用TC,同样TC默认是1,但是A执行后TC在某种情况下,【注意不是绝对的,同样一个printf语句,在程序的不同地方执行,有时候TC会立即变成0,有时候却不会,具体什么原因懒得查了】却不能立刻变成0,所以接下来的while语句不成立,所以就直接跳走了,所以再来第二个字节的话,就可能第一个字节就被覆盖了,从而导致丢字节
如果串口被复用则建议采用保险的做法,亦即楼主给出的解决方案,虽然该方案会浪费一点点时间和略有些麻烦。 |
|