使用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
相关产品推荐
相关产品推荐

