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

使用C++ Boost库打开串口报错:No such file or directory 求助

解决Boost.Asio打开串口提示"No such file or directory"的问题

从你的描述来看,明明dmesg显示系统已经识别到ttyUSB0设备,但程序却一直报找不到文件的错误,这确实有点让人困惑。先梳理下你的关键信息:

你的代码

void openport(const string & path) {
    boost::system::error_code error;
    boost::asio::io_service io;
    boost::asio::serial_port port(io);
    port.open(path, error);
    if(ec) {
        cout << "failed" << ", e=" << ec.message().c_str() << endl;
    }
}
int main() {
    openport("ttyUSB0");
    return 0;
}

报错信息

failed, e=No such file or directory

dmesg输出

[11018.593665] usb 1-1.5: FTDI USB Serial Device converter now attached to ttyUSB0
[15414.150404] ftdi_sio ttyUSB0: FTDI USB Serial Device converter now disconnected from ttyUSB0
[15423.084984] usb 1-1.5: FTDI USB Serial Device converter now attached to ttyUSB0

下面是几个大概率能解决问题的步骤:

1. 补上串口路径的/dev/前缀

Linux系统里所有串口设备都在/dev目录下,你传入的"ttyUSB0"是相对路径,程序根本找不到对应的设备文件。把main函数里的调用改成:

openport("/dev/ttyUSB0");

这是最常见的原因,优先试试这个。

2. 检查是否有权限访问串口

即使路径正确,普通用户默认可能没有访问ttyUSB0的权限。你可以先临时用sudo运行程序测试:

sudo ./你的程序文件名

如果这样能成功打开串口,说明是权限问题。要永久解决的话,把当前用户加入dialout组:

sudo usermod -aG dialout $USER

执行完后注销再重新登录,权限就会生效,之后不用sudo也能访问串口了。

3. 修正代码里的变量名错误

仔细看你的代码:你声明的错误变量是error,但判断和输出的时候用的是ec!这是个明显的笔误,会导致逻辑错误——即使串口打开成功,也可能因为读取了未初始化的ec变量而输出错误信息。修正后的代码应该是:

void openport(const string & path) {
    boost::system::error_code error;
    boost::asio::io_service io;
    boost::asio::serial_port port(io);
    port.open(path, error);
    if(error) {
        cout << "failed" << ", e=" << error.message().c_str() << endl;
    } else {
        cout << "串口打开成功" << endl;
    }
}

按照这几个步骤排查,应该能解决你的问题。

内容的提问来源于stack exchange,提问作者lemming

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:37:01