你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

串口错误怎么恢复?

[复制链接]
everkimage 提问时间:2018-6-20 17:05 /
芯片是STM32F0系列的。调试的时候,板子进入某个断点,而PC端一直在发串口数据,这个时候只要再按F10就会跑到串口中断里面,但是不一定是收数据,也不知道串口的什么标记置位了,在串口状态寄存器有好多错误标记都置位了。
错误原因估计是中断的时候串口的硬件缓存区溢出了或什么的,反正它知道有很多数据没有来得及接收。
请问下这个时候怎么恢复串口,有库函数吗?
收藏 评论13 发布时间:2018-6-20 17:05

举报

13个回答
he129807 回答时间:2018-6-21 11:00:28
一般进行2个操作就可以了
1,清除错误标志。
2,读一次DR寄存器。
但是要不要记录错误,并作一些处理,就是你应用程序的事了。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

zhdzhd 回答时间:2018-6-21 10:14:27
基本的中断服务函数:
if(USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET)
{
USART_ClearFlag(USART2, USART_FLAG_ORE); //清除溢出中断
}

if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART2, USART_IT_RXNE);
//rebuf[num++] = USART_ReceiveData(USART2); 读取串口数据
}

具体的可以参考以下链接:
http://blog.csdn.net/qq_34401994/article/details/76359581
https://www.stmcu.org.cn/module/ ... p;page=1#pid2346823

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

电子星辰 回答时间:2018-6-20 17:09:23
我看着有点混乱,要不你先把程序发上来,说说大概哪些有问题

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

GKoSon 回答时间:2018-6-20 17:23:21
库函数 和 寄存器都有 防止串口溢出错误的。
比如放2个进去
   if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)            
//    {
//        USART_ITConfig(USART1, USART_IT_TXE, DISABLE);                  
//    }

//    if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)==SET)
//    {
//        USART_ClearFlag(USART1,USART_FLAG_ORE);        
//        USART_ReceiveData(USART1);                                
//    }

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

z258121131 回答时间:2018-6-20 17:53:44
检测到串口错误后进行清除处理

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

radio2radio 回答时间:2018-6-20 20:36:21
我的经验是,如果使用RTE的串口库,就没有这样的问题,所有出错情况无需理会。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

TLLED 回答时间:2018-6-21 08:45:51
这是在仿真模式吗,进入中断后,清除标志位会不会有改善啊。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

STM1024 回答时间:2018-6-21 08:49:22
你使用的JLink调试吗?还是用的仿真调试?
一般情况是,出现串口错误,把串口的GPIO配置、工作模式什么的都全重新设置一遍,就可以恢复了。不过这是治标不治本,一定要定位到出错的地方

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

everkimage 回答时间:2018-6-21 10:15:20
本帖最后由 everkimage 于 2018-6-21 10:17 编辑
stm1024 发表于 2018-6-21 08:49
你使用的JLink调试吗?还是用的仿真调试?
一般情况是,出现串口错误,把串口的GPIO配置、工作模式什么的都 ...

jlink调试。程序正常运行是没事的,就是调试的时候有点别扭。PC端没100毫秒发一次数据,某一次执行到我们设定的中断了,人的反映当然没那么快,所以CPU处于停止状态,而串口一直有数据到,但是因为没有执行中断来接收数据,串口状态寄存器很多错误标记被置位了。我用的是IAR,调试不论是单步还是连续执行,程序中设置的断点就不会被执行到,也不知道在执行什么,串口中断也不再进去了,似乎串口硬件也不再响应数据了,所以想怎么复位串口。
如果说重新初始化,不知道那个错误标记被设置时,重新初始化。
有没有官方的处理方式?
随风飘扬 回答时间:2018-6-21 11:45:32
调试的时候肯定会打乱单片机运行的时序,尤其是单步运行,设置断点,虽然单片机程序停止不运行了,但是内部的时钟,外设却不一定停下,对于通讯类的代码调试有时不是特别好用

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

everkimage 回答时间:2018-6-22 16:16:38
zhdzhd-174422 发表于 2018-6-21 10:14
基本的中断服务函数:
if(USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET)
{

谢谢你,帮助很大。

点评

先按结贴处理了啊,求助位置要让给更多未解决的问题,也等吼住后续分享原因和结果  发表于 2018-6-27 13:16
不客气,互相帮助,发挥论坛的最大作用!  发表于 2018-6-22 18:12

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版