RS485 多机通信(一主多从)
一、本例程实现功能
一个 RS485 主机和多个 RS485 从机进行通信,形成一对多的星型网络,整个网络的通信流程为:主机发起通信,从机响应的机制。
主机和某个从机的具体通信流程如下:
主机发送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灯会闪烁一次。
二、接线图
三、材料清单
名称 | 推荐购买链接(或者您可以自己制作) | 模块/芯片硬件资料下载 |
---|---|---|
RS485模块 |
四、完整代码
注意:本例程只演示一个主机和一个从机(从机地址为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
五、代码运行结果
可以看到当主机和从机通过485总线连接后,主机和从机上的LED1灯同时开始闪烁,每闪烁一次就表示主机和从机完成了一次数据交互。