Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 打开/dev/ttyUSB0返回“;“错误的文件描述符”;_C++_C_Serial Port_Usbserial_Xbee - Fatal编程技术网

C++ 打开/dev/ttyUSB0返回“;“错误的文件描述符”;

C++ 打开/dev/ttyUSB0返回“;“错误的文件描述符”;,c++,c,serial-port,usbserial,xbee,C++,C,Serial Port,Usbserial,Xbee,我和一些XBee一起在我的小项目上工作了很长时间。到目前为止,所有代码都已经过测试,并在UBUNTU-Server10.04LTS上运行,使用libftdi库进行串行usb模拟/转换 本周初,我尝试在笔记本电脑上使用与kubuntu 12.04完全相同的代码,使用相同的libftdi库版本 问题是,在我的卫星L755-18K笔记本电脑中,每次我尝试在/dev/ttyUSB0打开我的XBee设备时,它都会给我“坏文件描述符”。从dmesg的日志消息中可以看出,该设备注册非常正常,似乎无法将我的手指

我和一些XBee一起在我的小项目上工作了很长时间。到目前为止,所有代码都已经过测试,并在UBUNTU-Server10.04LTS上运行,使用libftdi库进行串行usb模拟/转换

本周初,我尝试在笔记本电脑上使用与kubuntu 12.04完全相同的代码,使用相同的libftdi库版本

问题是,在我的卫星L755-18K笔记本电脑中,每次我尝试在/dev/ttyUSB0打开我的XBee设备时,它都会给我“坏文件描述符”。从dmesg的日志消息中可以看出,该设备注册非常正常,似乎无法将我的手指放在上面

这里是用于打开设备的代码部分:

cfmakeraw(&tio);
cfsetospeed(&tio,B9600);            // 9600 baud
cfsetispeed(&tio,B9600);            // 9600 baud
tio.c_cc[VMIN]=0;
tio.c_cc[VTIME]=10;

serial_fd=open("/dev/ttyUSB0", O_RDWR);

tcsetattr(serial_fd,TCSANOW,&tio);


if (serial_fd < 0){

    cout << "Error while opening device... " << "errno = " << errno << endl;

    printf("Something went wrong with open()! %s\n", strerror(errno));
    exit(1);
}
cfmakeraw(&tio);
cfsetospeed(&tio,B9600);//9600波特
cfsetispeed(&tio,B9600);//9600波特
tio.c_cc[VMIN]=0;
tio.c_cc[VTIME]=10;
串行fd=打开(“/dev/ttyUSB0”,O_RDWR);
tcsetattr(串行fd、TCSANOW和tio);
如果(串行_fd<0){

cout问题是您正在依次调用
open()
tcsettr()
,然后只检查文件是否存在错误

考虑
open()
由于某种原因失败。它将返回
-1
并将
errno
设置为该原因。但是,问题中的代码将继续调用
tcsettr()
尽管如此,这将失败,因为在我们的情况下,
串行_fd
将是
-1
,并将覆盖
错误号
,原因是(
EBADF
-1
不是有效的文件描述符)

您应该在打开文件后立即检查错误情况:

serial_fd = open("/dev/ttyUSB0", O_RDWR);
if (serial_fd < 0) {
    cout << "Error while opening device... " << "errno = " << errno << endl;
    perror("Something went wrong with open()");
    exit(1);
}

查看Frédéric的回答,然后确保您有打开设备的权限。 我需要是root才能访问(可能只是为了获得写入权限)我的系统上的
/dev/ttyUSB0
。我认为它依赖于发行版,因为在Debian上,我可以作为普通用户打开它,但我需要是Arch发行版的root。通过查看/dev/ttyUSBx的组和权限,可能可以修复

编辑:实际上,我可以通过一个简单的测试程序获得一个文件描述符,所以在我的例子中,这可能是一个特定于布道的问题


简单的解决方案可能是以root用户身份运行该程序。

Nope!以普通用户身份运行该程序。由于您在/dev/*)上请求RDWR,所以我们可以尝试以root用户身份运行该程序:)当我想获得对/dev/ttyusbx的RDRW访问权限时,我需要在我的系统上以root用户身份运行布道这是一个问题,但不是“the”问题是我是否正确理解了作者。我将问题理解为“为什么我在试图打开/dev/ttyUSB0时得到了错误的文件描述符”,或者我误解了什么?:@Jite,你确实理解正确,答案是提问者得到了
EBADF
,因为他正在调用
tcsettr()
在检查
串行\u fd
是否有效之前。在调用
open()
后立即访问
errno
将允许他查看失败的实际原因。当然,你是对的。(我猜它会给出类似的结果:权限被拒绝)@是的。或者更糟的是,
没有这样的设备
@Jite是的!没错,事实上我想知道为什么会出现“坏文件描述符错误”。尽管如此,我认为Frédéric提出了一个很好的观点。我已经按照建议更改了代码,错误号实际上被覆盖。实际发生的情况是,毕竟我没有打开设备的权限!:-\检查热插拔脚本,它们将控制授予设备节点的访问模式(基本上是权限)。
tcsetattr(serial_fd, TCSANOW, &tio);