You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

写入虚拟串口时出现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 05:55:24