macOS 虚拟串口通信技术笔记

news/2025/11/30 19:18:27/文章来源:https://www.cnblogs.com/linxmouse/p/19289984

一、目标

在 macOS 环境下,使用 socat 工具虚拟创建一对相互连接的串口(如 /dev/ttys001/dev/ttys002),并使用 Python 验证其双向通信能力。

二、环境准备

1. 安装 socat

socat 是实现虚拟串口的核心工具,推荐使用 Homebrew 安装。

# 检查 Homebrew 是否安装
# brew --version# 如果未安装 socat,执行安装
brew install socat

2. 安装 Python 串口库

使用 pippip3 安装 pyserial 库。

pip3 install pyserial

三、使用 socat 创建虚拟串口对

socat 通过创建两个伪终端(PTY)并自动连接它们,实现数据的双向转发。

关键命令

在一个独立的 Terminal 窗口中运行此命令,并保持其运行状态,不要关闭。

socat -d -d pty,raw,echo=0,link=/dev/ttys001 pty,raw,echo=0,link=/dev/ttys002

命令说明

参数/路径 含义
-d -d 开启调试模式,显示 socat 创建的底层设备名。
pty 创建一个伪终端设备(Pseudo Terminal)。
raw,echo=0 设置终端为原始模式(Raw Mode),并关闭回显,适合数据通信。
link=/dev/ttys001 /dev/ 目录下创建符号链接 ttys001 指向第一个 PTY。
link=/dev/ttys002 /dev/ 目录下创建符号链接 ttys002 指向第二个 PTY。

注意: 实际在 macOS 上,socat 可能会在 /tmp/ 下创建链接,例如 /tmp/ttyV0。您的脚本中使用了 /dev/ttys001,这表示 socat 创建的链接已经指向了 /dev 下的设备。请以 socat 实际输出为准。您的成功案例使用了 /dev/ttys001/dev/ttys002

四、Python 验证脚本 (serial_test.py)

使用 Python 脚本验证两个虚拟串口是否能双向通信。

脚本代码 (已验证)

from re import search
import serial
import time# 端口配置,与 socat 创建的链接路径一致
PORT_A = '/dev/ttys001'
PORT_B = '/dev/ttys002'
BAUDRATE = 9600
TEST_DATA = b"Hello from Serial Port A!"def setup_serial_port(port):"""尝试打开指定端口"""try:# timeout=1 表示读取操作最多等待 1 秒ser = serial.Serial(port=port, baudrate=BAUDRATE, timeout=1)print(f"成功打开端口: {port}")return serexcept serial.SerialException as e:print(f"无法打开端口: {e}")return Nonedef test_communication():"""测试 A 发送,B 接收的单向通信"""ser_a = setup_serial_port(PORT_A)ser_b = setup_serial_port(PORT_B)if not ser_a or not ser_b:print("至少一个端口打开失败,请检查 socat 是否正在运行")returnprint("-" * 60)try:# 1. 端口A发送数据print(f"{PORT_A} 发送数据: {TEST_DATA.decode()}")ser_a.write(TEST_DATA)ser_a.flush() # 确保数据立即发送time.sleep(0.1)# 2. 端口B接收数据received_data = ser_b.read(len(TEST_DATA))# 3. 验证结果print(f"{PORT_B} 接收数据: {received_data.decode()}")if received_data == TEST_DATA:print("\n通信测试成功! 两个虚拟串口可以相互通信")else:print("\n通信测试失败, 接收到的数据不匹配")except Exception as e:print(f"发生错误: {e}")finally:# 4. 关闭端口if ser_a and ser_a.is_open:ser_a.close()if ser_b and ser_b.is_open:ser_b.close()print("-" * 60)print("所有端口已关闭")if __name__ == "__main__":test_communication()

运行和结果

python3 serial_test.py
# 您的成功结果
成功打开端口: /dev/ttys001
成功打开端口: /dev/ttys002
------------------------------------------------------------
/dev/ttys001 发送数据: Hello from Serial Port A!
/dev/ttys002 接收数据: Hello from Serial Port A!通信测试成功! 两个虚拟串口可以相互通信
------------------------------------------------------------
所有端口已关闭

五、关键故障排除回顾

1. Python 模块问题

  • 错误: ModuleNotFoundError: No module named 'serial'
  • 解决: 缺少 pyserial 库。运行 pip install pyserialpip3 install pyserial

2. C#/.NET 引用问题 (针对未来 C# 开发)

  • 错误: CS1069CS0234 (找不到 SerialPortSystem.Text)
  • 解决: 确保项目引用了必要的 NuGet 包和命名空间。
    • dotnet add package System.IO.Ports
    • 在 C# 文件顶部添加 using System.IO.Ports;using System.Text;

3. 串口端口问题

  • 问题: 无法打开端口: [Errno 16] Resource busy
  • 解决: 端口已被其他程序占用。确保 socat 进程正在运行且没有其他程序(如 IDE 的内置工具)尝试访问这些端口
  • 问题: 无法打开端口: [Errno 2] No such file or directory
  • 解决: 检查 Python 脚本中的 PORT_A/B 路径是否与 socat 命令中 link= 指定的路径完全一致。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/982130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关闭 Windows 智能应用控制

今天一个软件打开提示 Windows 智能应用控制 该软件存在风险。。。打不开,然我我想应该可以把智能应用控制关掉,搜了一下,关掉之后就可以了。通过系统设置关闭‌打开设置菜单‌:点击「开始」菜单,选择「设置」(齿…

实用指南:JWT 全面解析与 Spring Boot 实战教程

实用指南:JWT 全面解析与 Spring Boot 实战教程2025-11-30 19:07 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display…

百度亮相 SREcon25:搜索稳定背后的秘密,微服务雪崩故障防范 - 指南

百度亮相 SREcon25:搜索稳定背后的秘密,微服务雪崩故障防范 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &qu…

Attention is all you need论文学习

前置知识 注意力机制 注意力机制的核心思想来源于人类在感知外部信息时所展现出的选择性注意能力。在面对复杂信息或长序列时,人类不会平均地处理所有信息,而是有选择地关注其中对当前任务更关键的部分。 深度学习中…

loj 515 贪心只能过样例

DP 题。 设 \(f_{i ,j}\) 为前 \(i\) 个数能否凑出 \(j\),转移即为: \[f_{i ,j} \gets f_{i ,j} \ \operatorname{or}\ f_{i ,j - k^2} \left( a\le k \le b\right) \]时间复杂度为 \(\mathcal O(n^5)\)。 注意这个式…

从数据采集到智能诊断:阿尔泰科技实时高精度远距离管道状态监测全流程 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2D3DICL-I2PReg论文学习

公式解读 前情提要:什么是相机 相机是虚拟的,实际上,它是指一个数学模型,它定义了我们如何将三维空间的点映射到二维照片上,它包含外参和内参,其中: (1)外参是指你所站的位置t,和你的朝向R。这个描述了相机在…

Spring使用el表达式

Spring使用el表达式 0. 背景 在项目中需要一个可动态执表达式的功能.项目本身是基于Springboot,可直接使用Spring提供的核心模块Spring Expression Language(SpEL). 在测试前,需要了解一些基本前置条件整体可以按照jav…

《程序员修建之道:从小工到专家》阅读笔记2

《程序员修建之道:从小工到专家》阅读笔记2当正确的 mindset 确立后,我们需要更高级的方法论来应对软件固有的复杂性。《程序员修炼之道》在软件设计方面提供了许多历久弥新的智慧,这些原则帮助我们在刚性与柔性、当…

《程序员修建之道:从小工到专家》阅读笔记3

《程序员修建之道:从小工到专家》阅读笔记3在技术快速迭代的今天,程序员最宝贵的资产不是当前掌握的某个框架或语言,而是持续学习与知识管理的能力。《程序员修炼之道》将我们的职业素养视为需要精心管理的"知…

AipexBase怎么用?AI 原生BaaS平台一句话做后端开发 - 实践

AipexBase怎么用?AI 原生BaaS平台一句话做后端开发 - 实践2025-11-30 18:42 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !importan…

CCPC2025 重庆站游记

游记开场写了 A,听了一下队友的 BE。然后一个小时的时候会了 F,看还没队过就开始抢一血,但直到封榜前这个题过了三十多个队了还一直过不去。中间会了 J,感觉这个题没道理才过四个队,趁着队友写 M 的间隙写完了。封…

完整教程:Elasticsearch:分布式搜索引擎数据库

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

wsl基本使用以及使用过程中遇到的问题

使用 任务栏搜索框中输入“Ubuntu xx.xx”后,直接进入对应Linux系统问题 1.git clone失败 fatal: unable to access https://github.com/xxx/xxx.git/: GnuTLS recv error (-110): The TLS connection was non-proper…

人工智能之数据分析 Matplotlib:第五章 常见函数

人工智能之数据分析 Matplotlib:第五章 常见函数人工智能之数据分析 Matplotlib 第五章 常见函数@目录人工智能之数据分析 Matplotlib前言一、Matplotlib 图像处理三剑客:imread / imshow / imsave1. plt.imread() …

CTF基础介绍与入门讲解

什么是CTF夺旗赛 CTF(Capture The Flag,夺旗赛) 是一种流行的信息安全竞赛形式,起源于1996年的DEFCON大会。CTF竞赛通过解决各种网络安全相关的挑战,帮助参赛者提升技术能力,同时也为网络安全领域培养人才。 当然…

2025/11/29 今天上课所以没有自我学习

2025/11/29 今天上课所以没有自我学习今日没有学习新内容,把前两天的内容随笔写了一下

基于大数据的全国降水可视化分析预测框架

基于大数据的全国降水可视化分析预测框架pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "M…

Day7-20251130

Java标识符与数据类型摘要: Java标识符命名规则:必须以字母、$或_开头,后续可包含数字,区分大小写且不能使用关键字。虽然支持中文命名但不推荐。 数据类型分为基本类型和引用类型。基本类型包括:数值类型:byte(…

Java项目中最常用的6个设计模式

在 Java 项目开发中,以下 6 种设计模式因实用性强、应用场景广泛而被高频使用: 1. 单例模式(Singleton Pattern) 用途:确保一个类仅有一个实例,并提供全局访问点。场景:线程池、数据库连接池、配置类、日志工具…