两个51单片机485串口通信接收数据出错原因?大概发送三、五次会有一次全部接收正确。程序如下:

发送机主要程序:

接收机主要程序:

1.有人在发送数据之前,先关闭了串口中断!等待发送完毕后,再打开串口中断。
这样,在发送数据的等待期间内,如果收到了数据,将不能进入中断函数,也就不会保存的这个新收到的数据。
这种处理方法,就会遗漏收到的数据。
2.有人在发送数据之前,并没有关闭串口中断,当 TI = 1 时,是可以进入中断程序的。
但是,却在中断函数中,将 TI 清零!
这样,在主函数中的while(TI ==0);,将永远等不到发送结束的标志。
3.还有人在中断程序中,并没有区分中断的来源,反而让发送引起的中断,执行了接收中断的程序。
对此,做而论道发表自己常用的方法:
接收数据时,使用“中断方式”,清除 RI 后,用一个变量通知主函数,收到新数据。
发送数据时,也用“中断方式”,清除 TI 后,用另一个变量通知主函数,数据发送完毕。
这样一来,收、发两者基本一致,编写程序也很规范、易懂。
更重要的是,主函数中,不用在那儿死等发送完毕,可以有更多的时间查看其它的标志。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-07-19
按你说的,要看你的数据长度及波特率,有可能是发送频率过快。
注意一下你的发送端的数据长度以及发送频率追问

数据仅4个字节,波特率9600

追答

发现频率是多少,发送周期应该不少于10mS ,你可以用10、20 ms试一下。

追问

应该不是这个问题的,因为我是按键按下一次就把四个数发送出去。我把程序截图补发上来了,麻烦您帮我看看。

追答

你是按键发送的话,这样吧,不知道你那有示波器没?你可以把发送端接上示波器,检测一下发送的数据是否正常。比如你按键后,它是否发数据出去了,是否发正确的数据了。

本回答被网友采纳
第2个回答  2018-05-28
最近在做一个类似的实验,一开始总是出错,单片机用的12MHz晶振,设置9600的波特率,误差很大,每个字节的高四的经常出错。后来把波特率设置为4800,修改计数器T1的初值F3,这个精度更高,居然没有出错了。希望有人可以借鉴一下。
相似回答