51单片机串口如何通讯相互通信问题

51单片机的串口是个全双工的串ロ,发送数据的同时还可以接收数据。


当串行发送完毕后将在标志位 TI 置 1,同样当收到了数据后,也会在 RI 置 1
无论 RI 或 TI 出现了 1,只要串ロ中断处于开放状态单片机都会进入串口中断处理程序。
在中断程序中要区分出来究竟是发送引起的中断,还是接收引起的中断然後分别进行处理。
看到过一些书籍和文章在串口收、发数据的处理方法上,很多人都有不妥之处
接收数据时,基本上都是使用“中断方式”这是正确合理的。
即:每当收到一个新数据就在中断函数中,把 RI 清零并用一个变量,通知主函数收到了新数据。
发送数据時很多的程序都是使用的“查询方式”,就是执行 while(TI ==0); 这样的语句来等待发送完毕
这时,处理不好的话就可能带来问题。
看了一些网友編写的程序发现有如下几条容易出错:
1.有人在发送数据之前,先关闭了串口中断!等待发送完毕后再打开串口中断。
这样在发送数据的等待期间内,如果收到了数据将不能进入中断函数,也就不会保存的这个新收到的数据
这种处理方法,就会遗漏收到的数据
2.有人在发送数据之前,并没有关闭串口中断当 TI = 1 时,是可以进入中断程序的
但是,却在中断函数中将 TI 清零!
这样,在主函数中的while(TI ==0);将永远等不到发送结束的标志。
3.还有人在中断程序中并没有区分中断的来源,反而让发送引起的中断执行了接收中断的程序。
對此做而论道发表自己常用的方法:
接收数据时,使用“中断方式”清除 RI 后,用一个变量通知主函数收到新数据。
发送数据时也鼡“中断方式”,清除 TI 后用另一个变量通知主函数,数据发送完毕
这样一来,收、发两者基本一致编写程序也很规范、易懂。
更重偠的是主函数中,不用在那儿死等发送完毕可以有更多的时间查看其它的标志。

下面是个实际的问题答案在附件里。 求一个单片机串口如何通讯通信程序  悬赏分:50 | 解决时间: 22:39 |


求一个PC与单片机串口如何通讯通信的程序要求如下:
1、如果在电脑上发送以$开始的字符串,则将整个字符串原样返回(字符串长度不是固定的)
2、如果接收到1,则将P10置高电平接收到0,P10置低电平(用来控制一个LED)
问题补充:可能会将【$ABCD,654ccc,aasdasd,aaaa,sssd,4D】这样的字符串(字符串长度约为50-150个字符)传送给单片机,只能能原样返回

问题答案:下面看一个网上的题目,以及做而論道的解答

求一个单片机串口如何通讯通信程序  悬赏分:50 | 解决时间: 22:39 |


求一个PC与单片机串口如何通讯通信的程序,要求如下:
1、如果在電脑上发送以$开始的字符串则将整个字符串原样返回(字符串长度不是固定的)。
2、如果接收到1则将P10置高电平,接收到0P10置低电平。(用来控制一个LED)

问题补充:可能会将【$ABCD,654ccc,aasdasd,aaaa,sssd,4D】这样的字符串(字符串长度约为50-150个字符)传送给单片机只能能原样返回。

下列程序已经调試成功。

我要回帖

更多关于 单片机串口如何通讯 的文章

 

随机推荐