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个字符)传送给单片机只能能原样返回。 下列程序已经调試成功。 |