行业资讯
📅 2026/7/30 5:40:19
Linux创造虚拟串口
方案一socat推荐最简单、无需编译内核模块、临时即用# Debian/Ubuntu/银河麒麟 sudo apt update sudo apt install socat -ysudo apt install socat -y 是什么意思sudo以 **管理员root 超级权限** 执行后面的命令安装软件需要系统最高权限普通用户直接运行会报错权限不足。aptDebian/Ubuntu/ 银河麒麟、Deepin这类基于 Debian 体系 Linux 系统的软件包管理器负责下载、安装、卸载系统软件。installapt 的子命令执行安装操作。socat要安装的软件包名称。socat 全称Socket CAT号称超级万能端口转发工具功能极强端口映射、TCP/UDP 转发、套接字代理、内网穿透、双向数据流转发、绑定端口监听等运维、内网穿透、网络调试常用。-y自动确认所有安装询问。 不加-y安装过程中会弹出[Y/n]让你手动输入 Y 确认加了直接全自动一路安装完成。创建一对互通虚拟串口固定设备名执行这条命令生成/dev/ttyV0↔/dev/ttyV1双向连通虚拟串口sudo socat -d -d pty,raw,echo0,link/dev/ttyV0 pty,raw,echo0,link/dev/ttyV1整体作用创建一对互相直通的虚拟串口伪终端 PTY往/dev/ttyV0写数据立刻能从/dev/ttyV1读到往/dev/ttyV1写数据立刻能从/dev/ttyV0读到常用于串口程序调试、嵌入式代码模拟串口、Linux 下模拟两个设备串口互通、Qt 串口开发测试、Modbus 调试等场景。分段拆解参数1. sudosocat创建软链接到/dev/目录属于系统设备目录操作普通用户无权限必须提权。2. socat超级万能的双向数据转发工具全称Socket CAT可以在任意两类数据流之间搭桥串口、TCP、UDP、文件、管道、伪终端、IPv6、SSL 等。3.-d -d日志参数两个-d代表调试级别单个-d基础警告输出两个-d打开详细调试日志输出端口打开、数据收发、错误、EOF等过程 想更详细可以-ddd日常测试-d -d足够。4. 第一个地址pty,raw,echo0,link/dev/ttyV0关键字pty指定使用伪终端Pseudo TerminalLinux 内核虚拟串口硬件不存在纯软件模拟串口设备。参数逐个解释raw原始模式关闭终端行规则处理不做回车换行转换\r↔\n不自动替换不处理退格、CtrlC、CtrlD、信号中断二进制数据透传串口二进制通信必备Modbus、协议帧、十六进制数据包必须加 rawecho0关闭本地回显echo1默认自己发什么终端立刻回显什么类似敲命令屏幕重复打出字符echo0关闭回显完全模拟真实物理串口行为发出去的数据只对端接收本地不回显link/dev/ttyV0给内核自动分配的随机 PTY比如/dev/pts/3创建固定符号链接到/dev/ttyV0。重点内核真实设备是/dev/pts/XttyV0只是软链接方便程序固定路径打开串口。5. 第二个地址pty,raw,echo0,link/dev/ttyV1和上面完全一致创建另一端虚拟串口链接固定为/dev/ttyV1。底层逻辑socat 内部建立双向管道应用程序A → /dev/ttyV0 → socat 内部缓冲区 → /dev/ttyV1 → 应用程序B 应用程序B → /dev/ttyV1 → socat 内部缓冲区 → /dev/ttyV0 → 应用程序A全双工双向互通。权限放行必须否则程序打不开新开终端执行sudo chmod 666 /dev/ttyV0 /dev/ttyV16 110 可读可写不可执行通信测试验证终端 1接收cat /dev/ttyV0终端 2发送echo hello serial /dev/ttyV1终端 1 会立刻收到字符串代表双向通路正常。cat /dev/ttyV0 是什么意思cat Linux 读取文件 / 设备内容并打印到屏幕的命令 /dev/ttyV0 你用 socat 创建的虚拟串口 0 设备文件 整句读取虚拟串口 ttyV0 上收到的所有数据实时打印在终端上为什么执行会提示「设备或资源忙」Linux 串口设备是独占打开 Qt 程序已经调用 QSerialPort 打开了 /dev/ttyV0 占用句柄 系统不允许第二个程序cat、cutecom、minicom再次打开同一个端口直接报错 设备或资源忙。使用cat 查看信息如果发送的是ASCII码接收显示正常。如果发送的是16进制数接收显示是乱码。cat命令只会把读到的字节当成 UTF-8/ASCII 可打印字符渲染0x200x7F 可见 ASCII → 正常文字显示0x00~0x1F、0x80~0xFF 控制字节 / 高位十六进制 → 终端无法解析直接输出方块、问号、特殊符号也就是你看到的乱码乱码只是终端界面显示问题串口底层收到的二进制字节 100% 是正确的没有丢包、没有变值。正确查看十六进制原始数据的命令替代 cat方式 1hexdump 最直观推荐hexdump -C /dev/ttyV1好像没有效果原因:hexdump 打开方式本身有缺陷阻塞读取不灵敏hexdump /dev/ttyV1一次性读取不会持续实时监听。替换成持续实时抓流命令稳定可用stdbuf -i0 -o0 cat /dev/ttyV1 | hexdump -C这条会一直阻塞等待数据流Qt 一发数据立刻打印十六进制。现在可以显示了可以查看信息。但感觉信息有点卡顿而且一次只显示一行不全不完整。原因:hexdump默认按块刷新、按行格式化输出小包数据会攒到缓冲区才打印造成卡顿尝试方案持续实时抓包写入文件 实时 tail 看兼顾存日志 实时查看终端 1后台持续保存所有串口原始数据cat /dev/ttyV1 serial_recv.bin 终端 2实时十六进制滚动查看tail -f serial_recv.bin | stdbuf -oL xxd -Cxxd 是什么通俗版xxd是 Linux 自带的二进制文件 / 二进制流十六进制查看工具预装在绝大多数系统Ubuntu、银河麒麟、Debian 都自带。作用一句话把一堆看不见的原始二进制字节翻译成人类能看懂的 16 进制格式打印出来替代你之前卡顿、攒包输出的hexdump。