单片机模拟串口发送数据有时会漏发几个字节是什么原因?

2019-07-15 07:33发布

MCU:SC92F7321。之前我便发过串口的类似问题,在各位坛友的指点下已经得到解决,但经过反复测试,模拟发送串口存在如下问题:在发送过程中,有时会出现字节漏发的情况,本来想用分析仪之类的抓一下波形,但奈何在抓取过程中从不出现,真是让人无奈。功能就是硬件串口中断接收,再转IO口发送数据,实现一个IO口通信。           现在有两个怀疑对象:一个是程序写出BUG;一个是并非是MCU漏发,而是波形在那几个字节这儿畸变了,串口助手接收不认为是数据。(稍后附上发送相关代码),望各位大大指点下迷津
13.png
14.png
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
horayte
1楼-- · 2019-07-15 15:43
接收用的硬件串口中断,发送时转为IO发送,也就是RX转为普通IO口比如P12,单线通信,在发送时需要将串口关闭且不允许接收数据,您觉得会是哪里的问题呢?  
Green_LJ
2楼-- · 2019-07-15 21:18
原来是单线通信,还以为是用其它GPIO转发。
你这个定时器定时发送程序,显然有很多需要完善的细节。
除了定时器,是否还有其它中断?
定时器的程序也不够精细,MCU机器周期是多少?从代码看,应该是1us,这个已经是比较慢速的MCU了。
定时器里关闭T0,赋值,计算输出是0还是1,都需要时间,导致实际输出波形严重偏离设计初衷。
1、进定时器,不可以暂时关闭T0
2、TH0永远赋值0xff,TL0是-103,也就是153,如果设置T0是16bit定时器,直接:
TL0+=153;TH0=0XFF;
这样没有计时误差。
由于TH永远是0XFF,直接用8bit重装载模式,更简单,也没有累计计时误差。
3、关于1和0的输出,中间计算判断占用时间,导致时序错误抖动,应该本次中断计算是1还是0,下次进中断时立即输出,这样每次输出不会前后抖动。
这些都是自己都可以分析出来的问题,示波器一看波形就知道了。
Green_LJ
3楼-- · 2019-07-15 21:41
修正,这个MCU速度还是比较快的,不是1us。
但是1个bit时间是104us,还是需要考虑误差和抖动。
学生物的程序猿
4楼-- · 2019-07-16 00:19
最好定义一个半双工通信协议,即平时接收命令时绝不会发送;发送应答时决不会接收新命令。
这样发送时就可以关闭中断,通过纯软件或查询定时器计数寄存器的方法来算延时,发送时序可以非常精准。
zhuzb0754
5楼-- · 2019-07-16 05:59
 精彩回答 2  元偷偷看……
xiaolu511
6楼-- · 2019-07-16 11:06

这种发送还不如直接软件延时,禁止中断,波特率搞高点,毕竟发送的数据应该不多
每发送完一个字节重新开一下中断,这样最多中断延时一个字节时间,大多数应用是满足要求的
你这样逻辑复杂了,容易出错,

定时中断应该最高优先级,同时要自动重装才好,中断函数不够简练

一周热门 更多>