OpenEdv-开源电子网

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

STM32F103串口首字符丢失问题

[复制链接]

2

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
714
金钱
714
注册时间
2011-5-15
在线时间
147 小时
发表于 2016-5-22 23:17:41 | 显示全部楼层 |阅读模式
5金钱
大家好,现在遇到的问题是这样的:
一般都在USART初始化的时候加一句
USART_ClearFlag(USART1, USART_FLAG_TC); 清除标志位,就可以解决了,但是
我今天在调试的时候发现加上面的语句不起作用,首字符还是会丢失,但是加上
USART1->SR,首字符就可以发送成功,大家有遇到这样的情况吗?

最佳答案

查看完整内容[请看2#楼]

我们例程就没有丢失第一个字节哦。 参考下我们例程的写法。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-5-22 23:17:42 | 显示全部楼层
我们例程就没有丢失第一个字节哦。
参考下我们例程的写法。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

13

主题

201

帖子

0

精华

高级会员

Rank: 4

积分
671
金钱
671
注册时间
2015-4-26
在线时间
173 小时
发表于 2016-5-23 09:37:45 | 显示全部楼层
网上关于发送字符的代码大多如下: USART_SendData(USART1, (uint8_t)ch);  while( USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET);  其实咋一看是说的通的,但是在仔细看手册的时候发现 TC 和 TXE 标志位在复位的时候被置1 ,这样第一次while循环就是没有用的。这样导致了首次第一个字符还没有被输出,就被后面的字符覆盖掉,造成实际看到的丢失现象。解决办法就很简单:在前面加上一句 USART1->SR;  具体代码如下: USART1->SR;  USART_SendData(USART1, (uint8_t)ch);  while( USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET);  下面我来说说原因: 第一句读取SR寄存器,第二句写DR寄存器 刚好清除了TC标志位 。第一次while循环就起作用了。   我在使用库函数中的printf函数时,添加的fputc函数。 int fputc(int ch, FILE *f) {     /* TC TXE 标志位在复位的时候被置1 */  /*第一句读取SR寄存器,第二句写DR寄存器*/  /* 如果不这样操作,首次发送的第一个字符会丢失 */ USART1->SR;  USART_SendData(USART1, (uint8_t)ch);  while( USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET); return (ch); }   也可将USART1->SR;替换为USART_GetFlagStatus(USART1, USART_FLAG_TC)
回复

使用道具 举报

2

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
714
金钱
714
注册时间
2011-5-15
在线时间
147 小时
 楼主| 发表于 2016-5-23 20:46:54 | 显示全部楼层
康仔呦 发表于 2016-5-23 09:37
网上关于发送字符的代码大多如下: USART_SendData(USART1, (uint8_t)ch);  while( US ...

第一句读取SR寄存器,第二句写DR寄存器 刚好清除了TC标志位,
直接用 USART_ClearFlag(USART1, USART_FLAG_TC);也是清除TC标志位的,为什么不起
作用呢?有遇到这样的情况吗?
回复

使用道具 举报

2

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
714
金钱
714
注册时间
2011-5-15
在线时间
147 小时
 楼主| 发表于 2016-5-25 22:51:19 | 显示全部楼层
正点原子 发表于 2016-5-25 21:10
我们例程就没有丢失第一个字节哦。
参考下我们例程的写法。

原子哥,我今晚测试确认是用printf输出的时候会丢失首字符,用USART_SendData发送时,例程和我自己的都不会丢失(初始化部分不清除TC标志位)。
printf这样的问题有人遇到过吗?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-5-28 22:21:54 | 显示全部楼层
chunglin 发表于 2016-5-25 22:51
原子哥,我今晚测试确认是用printf输出的时候会丢失首字符,用USART_SendData发送时,例程和我自己的都不 ...

直接移植过来就可以了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 19:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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