[开源工具] 串口转wifi —— 两个串口之间通过网络进行通信

article/2025/9/24 4:00:11

之前有个项目,要求无人机与地面站直接的通信由之前的数传改为wifi,搜了一圈,很多都属于手工调试,而且包含复杂的界面。然而实际需求要求稳定,自动化。因此为了满足这个需求只能是自己开发一个小工具。

在当前项目背景下,要实现的需求如下图所示

串口发送
串口发送
数据传递
数据传递
TCP发送
TCP发送
串口发送
串口发送
无人机飞控串口A
无人机上位机串口B
无人机客户端
地面站服务端
无人机地面站

实际上,正常的无人机与地面之间的通信用的是数传模块,无人机和地面站之间都是通过串口连接到这个模块上。模块和模块之间的通信利用远程无线电进行通信。

但是,在一些特殊场景中,比如不能用无线电台的地方,敏感区域等,就只能想办法用其他的手段实现无人机与地面站的通信,而利用网络通信就是一个非常有效的手段。

项目开源在Github,下载地址:https://github.com/Li-Zhaoxi/uart2net

如果两端都在Windows下,可以直接下载编译好的exe,下载地址:https://github.com/Li-Zhaoxi/uart2net/releases/tag/v0.1

1 应用前景

简单来说,串口转wifi干了什么事呢,就是将下图这个串口线,线的部分变成了无线网,或者局域网之间。

别看问题简单,应用的场景可多了:

  • 局域网范围优势。拿校园网来说,校园网实际上是个超大规模的局域网,传输速度高达100MB/s,所以串口两端的设备都连上校园网,我可以在任何地方快速地控制设备。
  • 局域网频段优势。数传模块的频段会有冲突,但网络不会,适用于大规模控制。
  • 便宜。搞研究一般都在室内,有个路由器就够了(省下好几百数传模块的钱投资在头发上不香吗)。
  • 应用范围广。可以远程调试串口,可以模拟任何两个串口之间的通信,省下一大堆串口线。
  • 公网扩展。两个设备之间既然是利用网络通信就不仅仅局限于局域网,在无人机设备上插入SIM卡并不是什么难事,而且利用现在的5G技术,是可以快速传输无人机大量的图像数据的(5G尽管在民用上很贵,似乎不划算,但在工业圈非常重要,突破了网速限制,真的可以为所欲为)。

当然,缺点很明显,延迟会很高,受限于网络覆盖范围,如果需要野外大范围的飞行,还是得安装数传图传模块。

TB上是有卖串口转wifi的硬件,我这个是软件,跨平台,可以安装在x86平台,也可以安装在aarch64架构的嵌入式平台(比如jetson系列的嵌入式系统)。

2 使用说明

2.1 程序编译

改程序基于QT,所以无论在哪个平台,都要安装QT所支持的库。Windows下去下载exe安装包就行,Linux下用apt-get install 命令是可以直接安装QT的。

sudo apt-get install qt5-default
sudo apt-get install libqt5serialport5-dev

WINDOWS 下的使用方法

  1. 使用QTCreator加载当前uart2net.pro文件
  2. 在release模式下编译。
  3. 找到release版本的exe,与uart2net.ini单独放进一个文件夹。
  4. 如果需要发布到别的电脑,按照《QT 发布release版本》的方法,补充对应的dll文件。
  5. 编译通过后,此工程可以删掉。
  6. 配置ini文件,双击exe即可执行。

Linux下的使用方法(包含嵌入式Linux)

  1. 下载代码git clone https://github.com/Li-Zhaoxi/uart2net
  2. 进入文件路径cd uart2net
  3. 输入qmake uart2net.pro
  4. 编译make all -j6
  5. 编译无错通过后,根据设备修改对应的ini文件
  6. 输入sudo ./uart2net (串口读写必须是管理员权限,也可以用chmod改掉这个串口权限)

2.2 配置文件用法

配置文件可以用记事本打开,切记修改时候里面不能有中文
在这里插入图片描述

  • uart2net
    • type:表示是服务端还是客户端,1表示服务端,2表示客户端
    • heartbeattime:检测心跳,客户端必须设置(默认2000即可),否则无法检测断线并自动重连,服务器如果通信频繁可以设置0。(网络断开时候,程序是没法自动检测的,只能通过心跳)。
    • RecordLog:默认0不要动,本意是想记录通信之间传递的数据(因为我实现一半时候觉得没必要)。
    • showmessage:在控制台显示传递的数据,设置0就行。(因为设置1时候,满屏的二进制数,你也看不过来,前期自己调试用的)。
  • serial-port
    • **number **:串口号。windows下一般为 COM3 (3根据实际情况调整),Linux下一般为 /dev/ttyS3,后面的数字同样根据实际设备号调整。
    • btl:串口波特率。
  • TCP
    • hostip:服务端IP地址(仅用于客户端,但在服务端你不能删掉这行)。
    • port:服务端端口号。

2.3 一些效果图

服务端,设备连接上之后会有显示,设备重连也会有显示。
在这里插入图片描述

客户端,最开始时候服务端还没开,一直在重连。
在这里插入图片描述

客户端,根据设置的心跳,2秒内没消息就重连。
在这里插入图片描述

3 总结

写这个小工具大概花了我2周左右的时间,主要就利用QT的串口和网络通信,并没有使用多高深的软件技术。后面移植到无人机系统中前前后后联调修了一堆bug,对于我来说,这个东西的最大价值也许就是其稳定性,在不断的调试中得到了最优版本。

在未来有需求的话也会对其进行进一步升级(毕竟这东西思想上容易,实际上调试巨麻烦),比如:

  • 心跳包不再占用数据通信的socket,两端都可以检测对方是否还活着
  • 现在是一对设备就创建一个服务端和客户端,后续也会升级为创建一个服务器,每个设备都是一个客户端(类似局域网聊天器那种)。
  • 有效的记录Log。设备发生意外,后续检查时候可以通过日志查看最后发送消息。(如果追求数据完整性,就得进来个数据存一次,导致IO变多,如果满足缓存再存,设备出故障容易异常关机,导致数据丢失)。

这次公布的是稳定版本,当然后续要是自己碰到需要更高级的需求,自己也会升级下这个。


http://chatgpt.dhexx.cn/article/9R5KguUh.shtml

相关文章

串口转WIFI的工作方式理解

串口无线 AP(COM-AP)、串口无线 STA(COM-STA)和 串口无线 APSTA(COM-APSTA)3 个模式 串口WIFI模块是基于Uart接口的符合wifi无线网络标准的嵌入式模块,内置无线网络协议IEEE802.11协议栈以及TC…

【串口服务器】串口转WIFI

做工业互联网项目,难免会遇到通讯口转换的情况,比如智能仪表的RS-485需要转成以太网或WIFI才能与服务器通讯,方法也很简单,用串口服务器就能解决。 下面以有人的USR-W610为例来说明如何配置实现串口转WIFI的功能。 TIPS&#xf…

Linux 内核交互图

来源:www.linuxstory.org/linux-kernel-map

linux更新系统内核,Linux内核升级方法详解

Linux的内核是系统的核心,所以升级内核是Linux系统管理员的一项基本技能,所以我就分享了系统运维实务上的一篇文章,当然我对源文件稍做了一些内容的增加,就是把遇到的问题及解决方案也加上了,希望对各位Linux系统管理员有所帮助! 1.下载内核 cd /usr/src wget linux/kerne…

Linux内核态和用户态的socket编程

文章目录 前言一、内核态socket API二、server内核态编程1.源代码:server.c2.Makefile 三、用户态编程1.源代码 client.c2.Makefile 总结 前言 在实际中,有些时候我们底层驱动有数据发生时,需要立即通知应用层获取数据。当然网上的方法有很多…

CentOS7.6升级内核

CentOS7.6升级内核 方法一 1、更新系统和安装包 yum -y update 安装yum插件,以在安装和更新软件包时更快 yum -y install yum-plugin-fastestmirror 2、查看内核版本 uname -r 3、添加ELrepo存储库( 在安装新的内核版本之前,我们需要添加…

寒江独钓-Windows内核安全编程(完整版).pdf

寒江独钓-Windows内核安全编程(完整版).pdf 编写Windows内核程序,就意味着这个程序可以执行任意指令,可以访问计算机所有的软件、硬件资源。因此,稍有不慎就有可能将系统变得不稳定。Windows的设计者设计了各种驱动模型或者框架,如NT式内核驱动模型、WDM框架和新推出的WDF框…

linux kernel内核编程基础总结

Linux_kernel编程基础总结 时间:2015/10/9 背景:学习linux内核编程,总结学习中的经验,方便之后查看; 通常我们想弄清楚linux内核是怎么样工作的,如何使用内核接口来编写linux内核代码的第一步都是搭建一个实验环境来做试验的;这里总结一下实验环境的搭建步骤,和我的一…

内核模块编程之入门(二)—必备知识

模块编程属于内核编程,因此,除了对内核相关知识有所了解外,还需要了解与模块相关的知识。 1.应用程序与内核模块的比较 为了加深对内核模块的了解,表一给出应用程序与内核模块程序的比较。 表一 应用程序与内核模块程…

操作系统实验:Linux内核模块编程

实验内容 (1)设计一个模块,要求列出系统中所有内核线程的程序名、PID、进程状态、进程优先级、父进程的PID。 (2)设计一个带参数的模块,其参数为某个进程的PID号,模块的功能是列出该进程的家族…

HC12微控制器上的闪存内核编程

HC12微控制器上的闪存内核编程 作者 Sven Deckardt 限制 草案文件 摘要 本应用笔记的目的是解释如何为HC12实现CCP闪存内核以及如何为闪存编程配置CANape Graph。 目录 1.0概述... 1 闪存内核的一般用法... 1 2.0 Flash内核... 3 2.1结构... 3 2.2 …

Linux内核模块编程入门( 最简单的内核模块编程)

第1章简介 什么是内核模块? 所以,你想编写一个内核模块。 你知道C,你已经编写了一些正常的程序作为进程运行,现在你想要到达实际操作的位置,一个狂野指针可以消灭你的文件系统,核心转储意味着重启。 什么…

Linux内核模块编程

Linux内核模块编程 (作者:Baron_wu 禁止转载) 首先,创建一个内核模块并插入Linux内核中。这是实验第一部分 首先查看当前内核模块使用情概况:lsmod Module:模块名 Size:模块大小 Used by:这些模块在哪被使…

Linux内核网络编程

netfilter 内核网络编程 网络协议数据结构inet_protosw 在Linux-2.6.26.3/net/ipv4/af_inet.c文件中有一个名为inet_init()的函数对协议进行了初始化。inet_init()函数使用proto_register()函数来注册每个内嵌协议。 软中断CPU报文队列及其处理 Linux内核网络协议层的层间…

Linux学习之内核模块编程

前言 之前成功编译了内核,这次学习如何修改增加删除内核模块,为了保证内核的纯净,我特意重新编译安装了一个新的5.11.8的内核,其他内核同理。 本文原创,创作不易,转载请注明!!&…

MATLAB脚本调用simulink仿真文件及simulink模块参数修改-load_system函数-sim函数-set_param函数

文章目录 1. load_system2. sim3. set_param4. get_param5. 应用 1. load_system 加载系统,添加所需要加载的simulink仿真模型所在的路径和名称。 load_system(pathname\filename);必须加载系统之后才可以完成后续的运行simulink仿真模型和获取仿真模型参数和设置…

Matlab学习笔记3——str2num

Matlab学习笔记3——str2num Convert character array or string to numeric array 将字符数组或字符串转换为数字数组 语法 X str2num(chr) [X,tf] str2num(chr) 输出 X — 输出数组 数字矩阵 输出数组,以数字矩阵形式返回。 tf — 真或假 1 |0 真或假结果…

strlen,strcpy,strcat,strcmp函数

1.strlen函数 strlen函数的作用是计算给定字符串的长度,从内存的某个位置开始,遇到第一个\0结束。 使用样例: int main() {const char *ar "abcdef";printf("%d\n", strlen(ar)); } 返回字符串"abcdef"的…

MATLAB str char cell num格式互相转换

简介 关于如何str char cell num格式互相转换的例子很多,但是都很单一,有时候使用的时候需要查找很久才可以解决问题。这里就对这几种方法进行一个汇总。 之所以会涉及使用cell,是因为涉及字符串、数字在同一个“矩阵”中,这时候…