历史上的今天
返回首页

历史上的今天

今天是: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个发送字节的时间,才能过去。


如果用中断发送,发送每个字节的期间(发送字节由硬件完成),主程序可以做其它事情,如刷新显示数据,只有发送完一个字节时,才进入中断装入要发送的下一个数据,发送的数据多时,效率是很明显的,硬件的开销虽然一样,都要发送这么多数据,但程序的执行效率大大提高了,就好像,主程序把这工作交给硬件了,只是发送完告诉我一下就可以了,主程序在硬件完成工作期间,可以做其它事情,而查询发送数据,你做这个活,主程序还得在这等着你做完才能做其它事情。程序效率提高这是肯定的。


推荐阅读

史海拾趣

BJB公司的发展小趣事

BJB公司的创立源于对照明电器领域的深刻理解和市场需求的敏锐洞察。创立初期,公司面临着资金短缺、技术挑战和市场竞争等多重困难。然而,通过创始人的坚定信念和团队的共同努力,BJB逐渐攻克技术难关,推出了一系列高质量的照明配件产品,初步在市场中获得了认可。

BeagleBoard公司的发展小趣事

随着技术的不断进步,BeagleBoard公司始终保持着对创新的追求。他们不断研发新的技术,优化产品设计,推出了一系列具有创新性的产品。其中,BeagleBone Black是该公司的一款明星产品,它集成了高性能处理器、丰富的外设接口和强大的扩展能力,为开发者提供了更加便捷的开发体验。此外,公司还推出了工业宽温应用的变体,以满足不同领域的需求。

方向电子公司的发展小趣事

作为一家以开源硬件为核心的公司,BeagleBoard深知教育和人才培养的重要性。他们积极与学校、教育机构合作,提供教育支持和培训服务,帮助更多的学生了解嵌入式系统开发的魅力。同时,公司还设立了奖学金和竞赛项目,鼓励年轻开发者积极参与创新实践,为行业培养了一批批优秀的人才。

Anders DX公司的发展小趣事

作为一家以开源硬件为核心的公司,BeagleBoard深知教育和人才培养的重要性。他们积极与学校、教育机构合作,提供教育支持和培训服务,帮助更多的学生了解嵌入式系统开发的魅力。同时,公司还设立了奖学金和竞赛项目,鼓励年轻开发者积极参与创新实践,为行业培养了一批批优秀的人才。

Antenna Factor公司的发展小趣事

随着公司实力的不断增强,Antenna Factor公司开始将目光投向国际市场。他们积极参加国际电子展会和技术交流活动,与全球各地的客户和合作伙伴建立了广泛的联系。同时,公司还加大了对海外市场的研发投入和市场推广力度,逐步实现了产品的全球化销售。这一战略不仅为公司带来了更广阔的发展空间,也提升了其在全球电子行业中的竞争力。

通过以上五个故事,我们可以看到Antenna Factor公司在电子行业中的发展历程和取得的成就。他们以技术创新为驱动,不断突破自我,积极拓展市场,加强质量管理和品牌建设,逐步实现了公司的快速发展和壮大。未来,随着无线通信技术的不断进步和应用领域的不断拓展,相信Antenna Factor公司将继续保持领先地位,为电子行业的发展做出更大的贡献。

CTC Coils Ltd公司的发展小趣事

随着国内市场的逐渐饱和,CTC Coils Ltd公司开始将目光投向海外市场。公司首先在欧洲设立了销售分支机构,通过参加国际电子展会、与当地企业建立合作关系等方式,逐步打开了欧洲市场。随后,公司又进一步拓展到北美和亚洲其他地区,实现了业务的国际化布局。

问答坊 | AI 解惑

数字万用表故障排除的一般方法

数字万用表是利用模/数转换原理,将被测量转化为数字量,并将测量结果以数字形式显示出来的一种测量仪表。数字万用表与指针式万用表相比,具有精度高、速度快、输入阻抗大、数字显示、读数准确、抗干扰能力强,测量自动化程度高等优点而被广泛应用 ...…

查看全部问答>

keil 3.8使用j-link的问题

keil3.8想要使用j-link进行在线仿真调试的话需要怎么设置,望得到大家的帮助…

查看全部问答>

WINCE,视频抓取问题

WINCE中IMediaDet 接口用不了,还有其他接口吗?大家是怎么抓取视频文件中的图像帧的,有什么好的办法。。。…

查看全部问答>

编译的时候出现如下错误

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. 请高手赐教 ...…

查看全部问答>

请问:STM32能支持从机模式下的SSP通信吗?

                                 请问:STM32 能支持从机模式下的 SSP通信吗? 一定要用硬件的,因为是从机,要用中断方式…

查看全部问答>

stm32ucosisr

各位 我的 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 ...…

查看全部问答>

【求助】斑竹帮看下RAM的问题

我用的是F123,使用汇编语言编程AQ430开发; 跟踪调试发现02F4H~02FFH(RAM最后10 个空间)的发生变化,而我未对该空间进行任何操作 这是什么原因造成的…

查看全部问答>

ew430v210.exe

我的机子里面装 过了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如题,做个记号 ...…

查看全部问答>