跳到主要内容

RS485 多机通信(一主多从)

一、本例程实现功能

一个 RS485 主机和多个 RS485 从机进行通信,形成一对多的星型网络,整个网络的通信流程为:主机发起通信,从机响应的机制。

master-slave-star-connection

主机和某个从机的具体通信流程如下:

主机发送5个字节数据(1,2,3,4,5)给某个从机,然后从机收到(1,2,3,4,5)后向主机返回(6,7,8,9,10) 5个字节的数据。

上面的过程中,主机收到(6,7,8,9,10) 后LED1灯会闪烁一次,从主机收到(1,2,3,4,5) 也后LED1灯会闪烁一次。

二、接线图

layout1

三、材料清单

名称推荐购买链接(或者您可以自己制作)模块/芯片硬件资料下载
RS485模块

product0

product1

四、完整代码

注意:本例程只演示一个主机和一个从机(从机地址为4)的通信,实际应用中如果需要接多个从机,主机可以通过不同的从机地址来实现和每个从机的通信。

主机代码:

--[[
RS485主机程序
]]--
--配置Uart1作为485接口,初始默认波特率9600,并且D6作为自动收发切换引脚
LIB_Uart1Rs485Config("BAUDRATE_9600","D6")
LIB_GpioOutputConfig("D8","OPENDRAIN") --LED1
--使能10毫秒定时器开始工作
LIB_10msTimerConfig("ENABLE")
cnt_10ms = 0
--定义10毫秒定时器的中断函数
function LIB_10msTimerCallback()
cnt_10ms = cnt_10ms + 1
end
--开始大循环
while(GC(1) == true)
do
--每1秒发送 1+5 字节数据给从机
if cnt_10ms >= 100 then --1000ms
cnt_10ms = 0
send_data = {4,1,2,3,4,5} --4表示希望通信的从机地址
LIB_Uart1BlockSend(send_data)
end
--查询是否收到从机发来的5字节数据,并验证
recv_flag,recv_data = LIB_Uart1Recv()
if recv_flag == 1 and #recv_data == 5 then
if recv_data[1] == 6 and recv_data[2] == 7 and recv_data[3] == 8 and recv_data[4] == 9 and recv_data[5] == 10 then
LIB_GpioToggle("D8") --切换LED状态
end
end
end

从机代码(从机地址=4):

--[[
RS485从机程序
]]--
--配置Uart1作为485接口,初始默认波特率9600,并且D6作为自动收发切换引脚
LIB_Uart1Rs485Config("BAUDRATE_9600","D6")
LIB_GpioOutputConfig("D8","OPENDRAIN") --LED1
--开始大循环
while(GC(1) == true)
do
--查询是否收来自主机发来的6字节数据,并验证
recv_flag,recv_data = LIB_Uart1Recv()
--确保收到的数据长度为6字节,并且地址等于自身的地址4,并验证5个数据为12345
if recv_flag == 1 and #recv_data == 6 and recv_data[1] == 4 then
if recv_data[2] == 1 and recv_data[3] == 2 and recv_data[4] == 3 and recv_data[5] == 4 and recv_data[6] == 5 then
LIB_GpioToggle("D8") --切换LED状态
--响应主机
send_data = {6,7,8,9,10}
LIB_Uart1BlockSend(send_data)
end
end
end
如果感兴趣,上面代码中出现的LIB开头的库函数可以在 API文档 中通过Ctrl+F查询。

五、代码运行结果

可以看到当主机和从机通过485总线连接后,主机和从机上的LED1灯同时开始闪烁,每闪烁一次就表示主机和从机完成了一次数据交互。