两个51单片机485串口通信接收数据出错原因?大概发送三、五次会有一次全部接收正确。程序如下:
答案:3 悬赏:70 手机版
解决时间 2021-01-12 14:14
- 提问者网友:活着好累
- 2021-01-12 04:41
两个51单片机485串口通信接收数据出错原因?大概发送三、五次会有一次全部接收正确。程序如下:
最佳答案
- 五星知识达人网友:底特律间谍
- 2021-01-12 05:55
按你说的,要看你的数据长度及波特率,有可能是发送频率过快。
注意一下你的发送端的数据长度以及发送频率追问数据仅4个字节,波特率9600追答发现频率是多少,发送周期应该不少于10mS ,你可以用10、20 ms试一下。追问应该不是这个问题的,因为我是按键按下一次就把四个数发送出去。我把程序截图补发上来了,麻烦您帮我看看。追答你是按键发送的话,这样吧,不知道你那有示波器没?你可以把发送端接上示波器,检测一下发送的数据是否正常。比如你按键后,它是否发数据出去了,是否发正确的数据了。
注意一下你的发送端的数据长度以及发送频率追问数据仅4个字节,波特率9600追答发现频率是多少,发送周期应该不少于10mS ,你可以用10、20 ms试一下。追问应该不是这个问题的,因为我是按键按下一次就把四个数发送出去。我把程序截图补发上来了,麻烦您帮我看看。追答你是按键发送的话,这样吧,不知道你那有示波器没?你可以把发送端接上示波器,检测一下发送的数据是否正常。比如你按键后,它是否发数据出去了,是否发正确的数据了。
全部回答
- 1楼网友:一把行者刀
- 2021-01-12 07:13
最近在做一个类似的实验,一开始总是出错,单片机用的12MHz晶振,设置9600的波特率,误差很大,每个字节的高四的经常出错。后来把波特率设置为4800,修改计数器T1的初值F3,这个精度更高,居然没有出错了。希望有人可以借鉴一下。
- 2楼网友:拾荒鲤
- 2021-01-12 07:02
1.有人在发送数据之前,先关闭了串口中断!等待发送完毕后,再打开串口中断。
这样,在发送数据的等待期间内,如果收到了数据,将不能进入中断函数,也就不会保存的这个新收到的数据。
这种处理方法,就会遗漏收到的数据。
2.有人在发送数据之前,并没有关闭串口中断,当 TI = 1 时,是可以进入中断程序的。
但是,却在中断函数中,将 TI 清零!
这样,在主函数中的while(TI ==0);,将永远等不到发送结束的标志。
3.还有人在中断程序中,并没有区分中断的来源,反而让发送引起的中断,执行了接收中断的程序。
对此,做而论道发表自己常用的方法:
接收数据时,使用“中断方式”,清除 RI 后,用一个变量通知主函数,收到新数据。
发送数据时,也用“中断方式”,清除 TI 后,用另一个变量通知主函数,数据发送完毕。
这样一来,收、发两者基本一致,编写程序也很规范、易懂。
更重要的是,主函数中,不用在那儿死等发送完毕,可以有更多的时间查看其它的标志。
这样,在发送数据的等待期间内,如果收到了数据,将不能进入中断函数,也就不会保存的这个新收到的数据。
这种处理方法,就会遗漏收到的数据。
2.有人在发送数据之前,并没有关闭串口中断,当 TI = 1 时,是可以进入中断程序的。
但是,却在中断函数中,将 TI 清零!
这样,在主函数中的while(TI ==0);,将永远等不到发送结束的标志。
3.还有人在中断程序中,并没有区分中断的来源,反而让发送引起的中断,执行了接收中断的程序。
对此,做而论道发表自己常用的方法:
接收数据时,使用“中断方式”,清除 RI 后,用一个变量通知主函数,收到新数据。
发送数据时,也用“中断方式”,清除 TI 后,用另一个变量通知主函数,数据发送完毕。
这样一来,收、发两者基本一致,编写程序也很规范、易懂。
更重要的是,主函数中,不用在那儿死等发送完毕,可以有更多的时间查看其它的标志。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯