写入虚拟串口时出现Device or resource busy错误的解决求助
解决虚拟串口Device or resource busy错误的方向
1. 调整socat串口创建命令
你当前的socat命令将串口与tee进程绑定,这种结构容易引发端口占用冲突。建议创建一对独立的互连虚拟串口,命令改为:
socat -d -d pty,rawer,link=/tmp/testPortTx pty,rawer,link=/tmp/testPortRx
其中testPortTx和testPortRx是互传数据的两端:C#程序打开testPortTx模拟硬件回传数据,终端用testPortRx执行cat/echo操作,两者互不占用。
2. 显式配置SerialPort参数
C#的SerialPort默认参数(波特率、校验位等)可能与socat的rawer模式不匹配,导致端口异常锁定。打开端口前显式设置参数:
static void Main(string[] args) { using var s = new SerialPort("/tmp/testPort") { BaudRate = 9600, Parity = Parity.None, StopBits = StopBits.One, DataBits = 8, Handshake = Handshake.None, ReadTimeout = 500, WriteTimeout = 500 }; s.Open(); // 写入测试数据 s.WriteLine("Simulated hardware response"); Thread.Sleep(100000); }
3. 允许串口共享访问
Linux下伪终端默认可能被独占打开,尝试用FileStream以共享模式打开端口,再绑定到SerialPort:
static void Main(string[] args) { using var fs = new FileStream( "/tmp/testPort", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); using var s = new SerialPort { BaseStream = fs }; s.Open(); s.WriteLine("Test data"); Thread.Sleep(100000); }
4. 排查端口占用进程
用lsof命令查看哪个进程在占用/tmp/testPort,确认是否是socat的tee进程导致冲突:
lsof /tmp/testPort
如果发现socat或tee进程占用端口,先终止这些进程,再重新创建串口并测试。
内容的提问来源于stack exchange,提问作者stillTrying
相关产品推荐
相关产品推荐

