3

我已经为我的一些 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);
}

任何关于这个主题的想法将不胜感激。

问候

4

2 回答 2

5

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

由于某种原因考虑open()失败。它将返回-1并设置errno为该原因。但是,您问题中的代码tcsetattr()仍然会继续调用,这将失败,因为在我们的情况下,将覆盖( ,不是有效文件描述符) 的原因。serial_fd-1errnoEBADF-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);
}

只有这样,问题:

tcsetattr(serial_fd, TCSANOW, &tio);
于 2012-07-10T22:11:16.870 回答
3

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

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

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

于 2012-07-10T22:36:10.190 回答