打开/ dev / ttyUSB0返回"错误的文件描述符"

时间:2012-07-10 21:55:25

标签: c++ c serial-port usbserial xbee

我一直在用我的一些小项目工作,有一些XBee。到目前为止,所有代码都经过测试并在UBUNTU-SERVER 10.04 LTS上运行,利用 libftdi 库进行串行USB仿真/转换。

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

问题是,在我的Satellite 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);
}

对此主题的任何想法都将不胜感激。

此致

2 个答案:

答案 0 :(得分:4)

问题在于您按顺序调用open()tcsetattr(),然后仅检查文件的错误情况。

出于某种原因,考虑open()失败。它将返回-1并将errno设置为该原因。但是,问题中的代码会继续调用tcsetattr()失败,因为serial_fd在我们的案例中将-1,并且会覆盖{{1}为什么(errnoEBADF不是有效的文件描述符)。

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

-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);
}

答案 1 :(得分:2)

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

编辑:实际上我能够通过简单的测试程序获得文件描述符,因此在我的情况下它可能是一个特定于布道的问题。

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