跳到主要内容

4G转485透传(DTU)

注意:本例程使用的 4G 模块为 SB-C17(EC800 4G 模块),ML302 4G 模块由于停产这里并不推荐使用。

一、实现的功能描述

实现4G TCP通信和RS485总线通信数据的透传。并且每次透传数据时开发板上的黄色LED会闪烁一次,绿色LED灯用来指示是否已经和服务器连接。

本例程的通信是基于TCP方式,如果希望改成UDP、MQTT方式,或者更多详细细节,可以参考前面的

《4G通信(TCP/UDP/MQTT)》教程。

二、本实验教学目的

掌握基于ShineBlink的:

  • 4G TCP通信

  • RS485通信(占用UART1的RX1,TX1引脚)

  • GPIO控制LED灯(黄灯占用D8引脚,绿灯占用D9引脚)

三、本实验涉及的模块

4G模块,RS485模块在开发板上的位置如下:

C2DevKit

注意,为了使用485接口,必须将P7和P8跳线帽短接才能让TX1引脚、RX1引脚和485转换芯片连接。

四、完整源代码

源码(ML302,已停产)

LIB_GpioOutputConfig("D8","STANDARD") --初始化GPIO D8控制黄色LED1
LIB_GpioOutputConfig("D9","STANDARD") --初始化GPIO D9控制绿色LED2
LIB_GpioOutputConfig("D2","STANDARD") --初始化GPIO控制Max485 RE DE 收发控制
--配置Uart1串口波特率为19200,用作485通讯
LIB_Uart1Config("BAUDRATE_19200")
--初始化4G TCP模式
server_addr = "47.92.146.210" --这里也可以写服务器域名,比如"abc.com"等
server_port = 8888
LIB_Cat1TcpUdpConfig("UART0","D5","HIGH","D6","HIGH",server_addr,server_port,0,"TCP","NO_GPS")
--定义使能MAX485发送函数
function SendEn()
LIB_GpioWrite("D2",1)
end
--定义使能MAX485接收函数
function RecvEn()
LIB_GpioWrite("D2",0)
end
--开始大循环
while(GC(1) == true)
do
--查询是否收到服务端tcp下发的数据
recv_flag,recv_tab = LIB_Cat1TcpUdpRecv()
if recv_flag == 1 then
LIB_GpioToggle("D8")--黄色LED闪烁
--将服务器TCP下发的数据通过485总线透传出去
SendEn()
LIB_Uart1BlockSend(recv_tab)
RecvEn()
end
--查询是否收到485总线发来的数据
recv_flag,recv_data = LIB_Uart1Recv()
if recv_flag == 1 then
LIB_GpioToggle("D8")--黄色LED闪烁
--将485总线发来的数据通过TCP透传给服务器
LIB_Cat1TcpUdpSend(recv_data)
end
--读取一次4G状态信息
State,IMSI,ICCID,CSQ = LIB_Cat1StatusQuery()
if State == "Connected" then
LIB_GpioWrite("D9", 0) --4G模块已和服务器建立连接,绿灯亮
else
LIB_GpioWrite("D9", 1) --4G模块未和服务器建立连接,绿灯灭
end
end

源码(EC800,推荐)

LIB_GpioOutputConfig("D8","STANDARD") --初始化GPIO D8控制黄色LED1
LIB_GpioOutputConfig("D9","STANDARD") --初始化GPIO D9控制绿色LED2
LIB_GpioOutputConfig("D2","STANDARD") --初始化GPIO控制Max485 RE DE 收发控制
--配置Uart1串口波特率为19200,用作485通讯
LIB_Uart1Config("BAUDRATE_19200")
--初始化4G TCP模式
server_addr = "47.92.146.210" --这里也可以写服务器域名,比如"abc.com"等
server_port = 8888
LIB_Cat1TcpUdpEC800Config("UART0","D5","HIGH","D6","HIGH",server_addr,server_port,0,"TCP","NO_GPS")
--定义使能MAX485发送函数
function SendEn()
LIB_GpioWrite("D2",1)
end
--定义使能MAX485接收函数
function RecvEn()
LIB_GpioWrite("D2",0)
end
--开始大循环
while(GC(1) == true)
do
--查询是否收到服务端tcp下发的数据
recv_flag,recv_tab = LIB_Cat1TcpUdpEC800Recv()
if recv_flag == 1 then
LIB_GpioToggle("D8")--黄色LED闪烁
--将服务器TCP下发的数据通过485总线透传出去
SendEn()
LIB_Uart1BlockSend(recv_tab)
RecvEn()
end
--查询是否收到485总线发来的数据
recv_flag,recv_data = LIB_Uart1Recv()
if recv_flag == 1 then
LIB_GpioToggle("D8")--黄色LED闪烁
--将485总线发来的数据通过TCP透传给服务器
LIB_Cat1TcpUdpEC800Send(recv_data)
end
--读取一次4G状态信息
State,IMSI,ICCID,CSQ = LIB_Cat1StatusQuery()
if State == "Connected" then
LIB_GpioWrite("D9", 0) --4G模块已和服务器建立连接,绿灯亮
else
LIB_GpioWrite("D9", 1) --4G模块未和服务器建立连接,绿灯灭
end
end

五、实验现象

注意:上面代码中用到的"47.92.146.210"的8888端口是一个实际存在的TCP测试服务器,向它发送什么就会返回什么,开发者如果没有自己的TCP服务器的话可以用它作为测试,但这里不保证该服务器一直能用。

所以利用这个服务器,我们可以测试TCP数据是否发送到服务器,并接收服务器原封不动返回的数据,再通过开发板的USB虚拟串口,我们就可以在电脑端的串口调试助手上看到服务区回传的数据了(和我们发送给服务器的数据一模一样)。

(1)用485转USB工具将电脑和开发板上的RS485接口连接。

(2)将代码复制到开发板的虚拟TF卡中开始运行。

(3)在电脑端打开《串口调试助手》工具,波特率设置为19200,其他设置如下图。

  • 我们可以看到在《串口调试助手》中发送 01 02 03 04 05 五个字节数据后,随后会收到服务器返回的 01 02 03 04 05
  • 我们可以看到在《串口调试助手》中发送 06 07 08 09 0A 五个字节数据后,随后会收到服务器返回的 06 07 08 09 0A

pic1

pic2