cvi*_*nte 3 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);
}
Run Code Online (Sandbox Code Playgroud)
对这个主题的任何想法将不胜感激。
问候
问题是您正在按顺序调用open()和调用tcsetattr(),然后才检查文件是否存在错误情况。
考虑open()由于某种原因失败。它将返回-1并设置errno为该原因。但是,代码在你的问题则进行到呼叫tcsetattr()尽管如此,这会因为失败serial_fd将是-1在我们的案例,并覆盖errno与原因(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);
}
Run Code Online (Sandbox Code Playgroud)
只有这样,才能发出:
tcsetattr(serial_fd, TCSANOW, &tio);
Run Code Online (Sandbox Code Playgroud)