前言
该远程方案已上传至GitHub:
项目地址:
https://github.com/ZhiyuanYuanNJ/SerialToIocHub
演示视频:
CH9114应用:基于IocHub跨网段透传的远程串口方案演示
远程串口
串口通信由于结构简单在物联网等场景下被广泛运用,但与网络传输相比通讯距离较短,而远程串口通 过网络可对串口数据进行距离拓展。
传统远程串口通过TCP通讯实现远程透传,多适用于局域网。这时需要一款跨网段透传的程序来帮助我们 实现真正意义上的远程串口。
IocHub简介
IocHub(Internet of Chip Hub)为开发者提供了多平台的MCU接口联网透传开发库,该方案来自于南京沁 恒微电子公司(WCH),开发库包含Windows、Linux、MCU等多平台的的接口,实现了多平台跨网段的 透传。重点:经向厂商咨询,该方案不涉及中间服务器,意味着透传数据安全得到保障!
IocHub库地址:https://www.wch.cn/downloads/WCHIoCHubLib_MultiOS_ZIP.html
CH9114介绍
由于IocHub在局域网中速率可接近配置上限,因此非常适合搭配一款波特率较高的串口使用来尽量减少 带宽浪费。 本次使用的USB转四路串口芯片CH9114,厂商驱动下该U串连续通信最高波特率为15Mbps,支持CDC 免驱、24路GPIO输入输出等功能。
使用串口助手传输文件测试: 设置波特率为15Mbps,8数据位,1停止位,无校验位,无流控。
文件大小 | 104996709B | 137487454B |
---|---|---|
耗时 | 71S | 93S |
实际波特率 | 14.788Mbps | 14.783Mbps |
经过测试可以看出,设置波特率与实际波特率近乎相同,且经过对比,未发现文件错误。
实际测试15Mbps波特率下,一位数据耗时84ns,很接近理论值。
芯片详情:
方案介绍
本文远程串口方案名为SerialToIocHub,顾名思义就是将串口数据与IocHub进行透传,实际应用场景有:
1、远程采集数据,如温湿度传感器数据通过SerialToIocHub传输至远程上位机,或借助CH9114的高波特率特点进行较大文件传输。
2、对远程电机等设备进行控制;
3、对远程设备进行控制,如远程调试交换机。
其中的IocHub上位机可使用IocHub库中的Demo程序,也可使用功能更加强大的TcpIpDebug网络调试工具:
TcpIpDebug:https://www.wch.cn/downloads/TcpIpDebug_exe.html
该上位机支持除了支持IocHub,还支持创建TCP服务器,自定义发送IP包等,是一款在网络开发中的调试利器。
实现逻辑
代码逻辑为设置串口参数,并利用两个环形缓冲区做FIFO,作为IocHub与串口之间的桥梁。
1、IocHub初始化
// 初始化IocHub库
IoCHub_Init();
// 注册IocHub事件的回调函数
IoCHub_RegisterEvent(IochubEvent);
// 启动IoCHub_Start
IoCHub_Start(ServerAddr, DEFAULT_IOCHUB_START_TIMEOUT, true);
// 设置iochub访问模式,是否需要验证密码
IoCHub_SetAccessMode(&mode);
// 打开会话
Session_Open(iochubInfo.opId, iochubInfo.opPassword, \
DEFAULT_IOCHUB_START_TIMEOUT, true);
2、串口初始化
Windows平台下的串口编程有一整套的接口函数,这里不再赘述。
// 串口初始化,输入要设置的波特率、数据位、停止位等参数
g_serial.init_port(index, serialInfo.Baud, serialInfo.checkBit,\
serialInfo.dataBit, serialInfo.stopBit, \
(unsigned int)serialInfo.flowCtrl);
// 开启数据接受监听
g_serial.start_monitoring();
3、使用两个线程去分别处理IocHub的读写
iocwt = std::thread(IocWriteRun);
iocrt = std::thread(IocReadRun);
使用方法及效果
首先使用-h参考下使用方法:
SerialToIoCHub.exe -h
Usage:
-h, --help display this message
-c, --comname <COM num> specify serial name, like:COM32
-b, --baud <baud rate> specify serial baud rate, default: 115200
-d, --databit <date bit> specify serial databit(5, 6, 7, 8), default: 8
-s, --stopbit <stop bit> specify serial stopbit(1, 1.5, 2), default: 1
-v, --checkbit <check bit> specify serial checkbit(N(None), O(Odd), E(Even), M(Mask), S(Space)), default: N
-f, --flowctl <flow ctrl> specify flow ctrl way(0(None), 1(RTS/CTS), 2(DTR/DSR), 3(XON/XOFF), default: 0)
-i, --peerid <Peer ID> specify the ID number of the iochub peer
-ip, --ipaddress <local ip address> specify local NIC ip address
-p, --peerpw <xxxxxxxx> specify the password of the iochub peer
-l, --list show all current serial ports and friendly names
例如要将CH9114(假设为COM4)实现远程串口,波特率设置为15000000,对端的IocHub的ID为7671A67F59F97732,那么命令为:
Example: SerialToIoCHub.exe -b 15000000 -i 7671A67F59F97732 -c COM4
指定对端id:SerialToIoCHub.exe -b 115200 -i 7671A67F59F99332 -c COM4
局域网自动搜索iochub设备并连接: SerialToIoCHub.exe -ip 192.168.50.2 -c COM15 -b 15000000
实测在百兆局域网环境下,SerialToIocHub搭配CH9114传输文件速率如下:
文件大小 | 104996709B | 137487454B |
---|---|---|
耗时 | 75S | 96S |
实际波特率 | 14.788Mbps | 14.783Mbps |
注:若在Windows系统下需实现远程串口,也可直接使用串口调试软件COMTransmit,支持多串口调试通讯、串口数据波形显示、十六进制数据输入、自定义帧格式等。
软件截图: