历史上的今天
今天是:2025年06月24日(星期二)
2021年06月24日 | 单片机串口编程的优劣
2021-06-24 来源:eefocus
这些日子做项目,在串口上耽误了不少时间,原来一直使用中断接收和查询发送,程序代码合起来时,程序竟然死在串口发送上,程序在那里等待,过不去,一直在做这个事情,今天总结一个专题,和大家分享。
51单片机的串口,是个全双工的串口,发送数据的同时,还可以接收数据。当串行发送完毕后,将在标志位 TI 置 1,同样,当收到了数据后,也会在 RI 置 1。无论 RI 或 TI 出现了 1,只要串口中断处于开放状态,单片机都会进入串口中断处理程序。
在中断程序中,要区分出来究竟是发送引起的中断,还是接收引起的中断,然后分别进行处理。看到过一些书籍和文章,在串口收、发数据的处理方法上,很多人都有不妥之处。
接收数据时,基本上都是使用“中断方式”,这是正确合理的。即:每当收到一个新数据,就在中断函数中,把 RI 清零,并用一个变量,通知主函数,收到了新数据。
发送数据时,很多的程序都是使用的“查询方式”,就是执行 while(TI ==0); 这样的语句来等待发送完毕。这时,处理不好的话,就可能带来问题。
看了一些网上编写的程序,发现有如下几条容易出错:
1.发送数据之前,先关闭了串口中断!等待发送完毕后,再打开串口中断。这样,在发送数据的等待期间内,如果收到了数据,将不能进入中断函数,也就不会保存的这个新收到的数据。
这种处理方法,就会遗漏收到的数据。
2.有人在发送数据之前,并没有关闭串口中断,当 TI = 1 时,是可以进入中断程序的。但是,却在中断函数中,将 TI 清零!这样,在主函数中的while(TI==0);,将永远等不到发送结束的标志。
3.还有人在中断程序中,并没有区分中断的来源,反而让发送引起的中断,执行了接收中断的程序。
对此,正确的方法:接收数据时,使用“中断方式”,清除 RI 后,用一个变量通知主函数,收到新数据。
发送数据时,也用“中断方式”,清除 TI 后,用另一个变量通知主函数,数据发送完毕。这样一来,收、发两者基本一致,编写程序也很规范、易懂。更重要的是,主函数中,不用在那儿死等发送完毕,可以有更多的时间查看其它的标志。
举个个子说明,中断发送比查询发送效率高的原因:
如果要发送一组十六进制的数据:01 02 03 04 05 06 07 FF
(FF是字符串结束的标志)。
查询发送一个字节例子如下:
TI0=0;
While(TI==0)
在发送上述数据时,主程序等待7个发送字节的时间,才能过去。
如果用中断发送,发送每个字节的期间(发送字节由硬件完成),主程序可以做其它事情,如刷新显示数据,只有发送完一个字节时,才进入中断装入要发送的下一个数据,发送的数据多时,效率是很明显的,硬件的开销虽然一样,都要发送这么多数据,但程序的执行效率大大提高了,就好像,主程序把这工作交给硬件了,只是发送完告诉我一下就可以了,主程序在硬件完成工作期间,可以做其它事情,而查询发送数据,你做这个活,主程序还得在这等着你做完才能做其它事情。程序效率提高这是肯定的。
上一篇:8051单片机的中断发送
下一篇:单片机流水灯小程序
史海拾趣
|
数字万用表是利用模/数转换原理,将被测量转化为数字量,并将测量结果以数字形式显示出来的一种测量仪表。数字万用表与指针式万用表相比,具有精度高、速度快、输入阻抗大、数字显示、读数准确、抗干扰能力强,测量自动化程度高等优点而被广泛应用 ...… 查看全部问答> |
|
corelibc.lib(pegwmain.obj) : error LNK2019: unresolved external symbol WinMain referenced in function WinMainCRTStartup ARMV4IRel/test_t.exe : fatal error LNK1120: 1 unresolved externals Error executing link.exe. 请高手赐教 ...… 查看全部问答> |
|
各位 我的 ucos 中断一直进不去 static void BSP_IntHandler (CPU_DATA int_id) { #if (CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL) CPU_SR cpu_sr; #endif CPU_FNCT_VOID isr; CPU ...… 查看全部问答> |
|
我用的是F123,使用汇编语言编程AQ430开发; 跟踪调试发现02F4H~02FFH(RAM最后10 个空间)的发生变化,而我未对该空间进行任何操作 这是什么原因造成的… 查看全部问答> |
|
我的机子里面装 过了ew430v210.exe。就是用来给430仿真用的软件,现在我要重新安一个。可以系统提示不能安了。有什么方法可以把原来的那个软件?载干净?谢谢了。… 查看全部问答> |
|
主攻“高频无线电类”赛题方向的同学注意了--南华大学黄智伟系列 本帖最后由 paulhyde 于 2014-9-15 03:38 编辑 1. “高频无线电类赛题”每届都有 在9届电子设计竞赛中,“高频无线电类赛题” 除了1994年外,每届都有:简易无线电遥控系统(1995年C题) 调幅广播收音机(1997年D题) 短波调频接收机(1999年D题 ...… 查看全部问答> |
|
2011-10-14-23:37回来继续MARK,原来帖子还是可以重复编辑的,不错刚刚发了个win7下面那个LaunchPad_Temp_GUI.exe有毛病的帖子貌似还没审核通过?恩,是的,等通过了一并贴过来================================2011-10-14-xx:xx:xx如题,做个记号 ...… 查看全部问答> |




