1、聊一聊
今天分享一首解压的歌曲," I’m a new soul,I came to this strange world" ,想过怎样的生活,都由自己决定,不管是 "三点一线、准点下班"还是" 996随叫随到 ",最重要的还是要开心!
2、正文部分
1
需求
在学校的时候跟着我的boss(也就是我的实验室老师)做过非常多的奇葩项目,其中今天所要谈到的这个项目是最为深刻的,也是给我帮助较大的一个项目,今天把这块的方案分享给大家。
boss当时应该是和校外的一个企业合作开发一款物联网系统,然后给我分配了一个任务说 : "我这边有N个不同的串口模块,不想每次使用都要配置一次,你跟我开发一个自适应串口参数的功能,1个月时间够了吧"。
当时的我还是太年轻,答应的贼快,还以为就检测个波特率完事,其实还有串口的数据位数、奇偶校验位、停止位等等都需要尽可能的识别出来,不过回头想想这个项目对我处理问题的思维转变是非常有意义的。
2
作用与意义
现在常规的模块对于串口通信的支持算是标配了,廉价、简单便于维护是其被选择的原因,然而在通信过程中,只有通信双方采用几乎相同的串口参数时,才能保障数据的正确传输,这为串行通信设备的使用带来不便,特别是对于串口参数易变的情况。
一种接收端串口的波特率自适应的实现方案将会极大的提高串行通信设备使用的灵活性和通用性,你想想当开发了一个模块给别人进行集成开发,其参数一般都需要进行配置等等,这样一个模块还好,多个模块确实就有点繁琐了。
3
实现办法
应该很多伙计跟我当初的想法一样,识别一个波特率不就搞定了吗?很容易的事情呀,其实再仔细想想,该如何检测波特率呢 ? 就算你波特率识别准确了,就能保证通讯正常了吗 ? 数据位个数分别有6,7,8位,奇偶校验位,停止位也不管了吗?等等。
不要总是嘴上的巨人,行动的矮子,下面bug菌就跟大家分享一下自适应串口开发方案。
1
串口重要特点
1 ) 我们都知道串口的参数主要是 : 波特率、数据位、奇偶校验位、停止位,基本上在进行串口通信的时候都会进行这4个参数的配置,似乎在大部分人眼中串口连接的接收方与发送方必须要这4个参数一模一样才能进行通信,其实不然。
如上图所示左边是接受方,右边是发送方,当发送方和接收方波特率与数据位一致且接收方无校验位时,不管发送方校验位和停止位是否匹配,发送方数据均能在接收方正确接收。
2)在波特率匹配的情况下,当接受方无校验位,发送方其他配置与之不匹配,接受方均可以获得相对比较稳定的数据,当然该数据与原数据基本不一样。
如上图所示左边是接受方,右边是发送方,当发送方和接收方波特率匹配,发送方以7bit数据位分别以无校验、偶校验、奇校验进行发送,接收方均可以接收到相对比较稳定且不同的数据。
大伙如果不太理解这两大特点,可以看看bug菌之前模拟串口文章 :
2
自适应步骤
01
整体实现流程图
02
波特率匹配
现在很多伙计做的自适应串口都仅仅只是一个波特率自适应串口,而且大部分都是采用的一种 " 标准波特率表遍历匹配 " 的办法,比如主机发送一串特征数据,如果从机接收不正确就重新换一种标准波特率初始化,再次进行接受,直到接收成功,其实这种办法对于仅仅只是波特率不同的应用还是有效的,但是当遇到非标准的波特率,数据位等配置不同就不是那么稳定靠谱了!
其实串口波特率检测对于目前性能还稍微过得去的芯片是比较简单的,直接通过高精度定时器实时检测串口RX引脚的一个bit的脉宽即可。
当然从机检测bit就需要主机发送的数据有明显的bit位供检测,否则发个0x00那从机是比较难判断的,所以这里要求主机所发送的特征码起始位后的第一个bit需为高电平,如下图所示。
要保证第一数据的第一位为高电平即可通过高精度定时器获得T0和T1的值,最终波特率 = 1/(T1 - T0)。
03
数据位的确定
在前面bug菌提到了两个串口的重要特点,其实就是为这里进铺垫的,一旦数据位和波特率与主机匹配,从机设置为无校验和1个停止位,其他无需与主机一致即可正确接收主机发过来的数据,这样就为后面主机发送自己的串口配置信息给从机,从机正确接收主机的配置信息并初始化完成匹配提供了条件。
那么如何进行串口数据位的确定呢 ? 当时是利用上面提到的串口第二大特点 - 特征表匹配法。
为了说明该办法,bug菌首先做了一个简单示例,从机采用8bit-无校验-1停止位进行数据接收,而主机通过不同的5、6、7bit数据位;奇、偶、无校验位;1,2停止位任意组合进行发送,从而得到如下图所示实验数据。
从而我们可以观察得到当主机以不同格式发送E9 29 EA,其从机均会收到不同的数据,于是从机把这些数据组成一个表格来进行查询匹配,最终即可获得主机发送数据位数,所以E9 29 EA就是特征码,而这些测试数据就形成了特征表。
04
其他位的确定
一旦前面主从机的波特率和数据位匹配成功,且从机设置为无校验位模式,不管主机其他配置信息如何,从机均可正确接收。这样主机主动把自身串口配置信息以特定的协议发给从机即可,从机接受到配置信息解析后重新初始化对应串口,即可完成后续的正确交互了。
enjoy!!
3、结束语
最近许多人问道:一直玩MCU,要不要学习Linux?bug菌会说如果有精力推荐学习,我推荐学习的理由不是说要你放弃MCU转Linux,而是程序员需要更加开阔的技术视野,而不是只关顾着自己的小池塘!
好了,这里是公众号:“最后一个bug”,一个为大家打造的技术知识提升基地,创作不易,您的"点赞""转发"都是对我最大的支持。
推荐好文 点击蓝色字体即可跳转
☞【经验】bug菌谈单片机编程"十层功力",你练到了第几层?