谷动谷力

标题: 尝鲜赤菟CH32V307-基于RT-Thread和LwIP实现八串口服务器 [打印本页]

作者: sunsili    时间: 2022-1-25 22:10
标题: 尝鲜赤菟CH32V307-基于RT-Thread和LwIP实现八串口服务器
本帖最后由 sunsili 于 2022-2-7 17:10 编辑

尝鲜赤菟CH32V307-基于RT-Thread和LwIP实现八串口服务器

2022-01-24 18:35
串口服务器,提供串口转网络的功能,将串口转换成TCP/IP协议网络接口,实现串口和网络接口的数据双向透明传输,扩展串口设备的通讯距离。

赤菟V307是搭载沁恒自研RISC-V内核青稞V4F的高性能互联型MCU,主频支持144MHz,支持硬件浮点运算(FPU),提供八个UART接口、USB2.0高速接口(480Mbps)并内置了PHY收发器、千兆以太网MAC并集成10M PHY、2个CAN接口等丰富的外设资源。



基于八个UART接口、10M以太网的强大外设,通过单片赤菟V307即可实现八串口服务器,每个串口独立工作。



源码仓库地址:https://github.com/openwch/ch32v ... tion/8_uarts_server
下载源码工程后,可直接导入到RT-Thread Studio即可打开工程体验。


网口端设计


网口端采用的是开源的轻量级TCP/IP协议栈LwIP,可以轻松实现赤菟V307网口端的TCP、UDP通信。

例程中默认开启的是TCP Client模式,采用单向循环链表的方式接收TCP Server发过来的数据。


当串口端接收到数据时,直接启动TCP Client的发送函数,并更新队列的读指针。

串口端设计

串口端为了加快数据的收发,采用DMA循环队列的方式接收数据,通过查询接收DMA 传输数据数目寄存器CNTR,与上一次该值进行比较,有变化则说明串口接收到数据,此时便更新队列写指针,并计算队列中数据长度。


根据网口接收端的链表中的数据地址及长度,启动串口端的发送DMA进行数据发送。

多任务设计

通过RT-Thread操作系统,创建两个线程,分别为用于网口端接收数据的“eth_rev”线程和用于串口端接收数据的“uart_rev”线程。

采用时间片轮转方式进行这两个线程的调度,当“eth_rev”线程收到网口端的数据时,启动串口端的发送DMA将数据通过串口发送出去;当“uart_rev”线程收到串口端的数据时,启动网口端的发送函数将数据通过网口发送出去,这样就实现了串口和网络接口的数据双向透明传输。




验证

串口默认波特率为115200,实测八个串口独立工作,可以实现收发10+KB/s的速度。


该例程目前仅实现了TCP Client的收发,还有TCP Server、UDP Server/Client等需要完善,希望各位开发者能够积极提交pr,一起完善该项目。







欢迎光临 谷动谷力 (http://bbs.sunsili.com/) Powered by Discuz! X3.2