背景
很多传感器现在都做成了串口模块,如激光测距传感器TOF050,在开发时使用串口功能模块不仅大大加快了我们的开发进度,还能降低功能模块直接的耦合度,专业是功能交给专业的模块做,也能保证质量。
图:TOF050激光测距模块
以TOF050模块为例,当我们同时需要接4个激光测距模块时,显然需要使用4个UART串口,分别读取距离值,这限制了我们可以外接的模块数量。
基于modbus协议,对UART串口进行改造,就可以实现单个串口同时外接多个UART设备,互不干扰。
MODBUS协议介绍
modbus介绍可以参考如下:https://cloud.tencent.com/developer/article/1540241
简而言之,在串口中使用modbus协议,主机需要先发送要读取的设备编号,相应设备编号的设备回传主机要读取的数据,而不符合该设备编号的设备保持静默状态。在主设备读取从设备时,遵循下面的通信协议:
UART接口改一对多
参考如下链接:https://blog.csdn.net/Ajisa_i/article/details/124731439
UART为点对点通信,直接将多个从机的TX线接到主机的RX上,是不能通信的。原因如下:
- 主机发送信息: 当主机发送信息时,由于主机TX上接了多个从机RX,每个RX都处于接收状态,因此都可以正常接收到TX发送的信息。
- 从机发送信息: 当从机发送信息时,由于多个从机的TX连在了一起,当其中一个从机TX发送信息时,另一个从机的TX没发送信息,没发送信息的从机TX为空闲状态处于高电平,会影响发送信息的从机,导致从机TX无法发送信息到主机的RX。
因此需要做如下改造:
这样改造后的原理是:
- 当从机都不发送信息时,从机的TX端都为高电平,主机的RX端为弱上拉,因此主机RX处于等待接收状态。
- 当从机1的TX发送信息时,从机1的TX会首先发送一个低电平起始位,由于从机1的二极管上端RX为高电平,下端从机1的TX发送了一个低电平的起始位,因此二极管导通,TX端电压为0V,则主机RX端收到的电压为0V加二极管压降0.26V。因此主机RX可以正确收到低电平信号。当从机1的TX发送高电平时,由于主机RX存在弱上拉,因此二极管不导通时,RX端会收到高电平。
注意注意注意:
上拉电阻1K必不可少,如果不上拉,115200波特率时RX总线上波形如下:
加上1K上拉电阻之后,115200波特率时,总线上电平如下:
这样,结合MODBUS协议,从机同时只会有1个在发送数据,不会互相干扰。
其中,二极管的选型较为关键,如果选择的二极管压降较大,如为1.4V,则从机TX发送低电平时,主机RX收到的电压为1.4V,因此不能正常通信。二极管的速度也应当足够快,才能满足通信要求。
结合以上要求,二极管可以选用肖特基二极管SS14,其压降只有0.26V,响应速度10ns,实际测试,可以支持2Mbps的串口波特率。文章来源:https://www.toymoban.com/news/detail-720873.html
参考链接
MODBUS协议介绍
UART改一对多文章来源地址https://www.toymoban.com/news/detail-720873.html
到了这里,关于单片机UART一对多:同时读取多个传感器基于modbus协议的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!