OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11289|回复: 3

DMA串口接收一帧数据,但是第一个字节丢失

[复制链接]

1

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2013-12-23
在线时间
11 小时
发表于 2013-12-23 09:59:07 | 显示全部楼层 |阅读模式
DMA串口接收一帧数据,但是第一个字节丢失,求大家帮忙,谢谢!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

10

帖子

0

精华

新手上路

积分
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语句不成立,所以就直接跳走了,所以再来第二个字节的话,就可能第一个字节就被覆盖了,从而导致丢字节


如果串口被复用则建议采用保险的做法,亦即楼主给出的解决方案,虽然该方案会浪费一点点时间和略有些麻烦。
回复 支持 1 反对 0

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2013-12-23 10:19:06 | 显示全部楼层
帮顶
回复 支持 反对

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2013-12-23 12:59:11 | 显示全部楼层
你问的太笼统了,仿真看看吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-12 12:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表