我编写了一个必须在 Linux 上使用串行端口的应用程序,尤其是 ttyUSB 端口。读取和写入操作是使用标准的 select()/read() 循环和 write() 执行的,它们可能没有任何问题,但初始化代码(或缺少某些部分)会损坏 tty 子系统中的某些内容。这里是:
vuxboot(string filename, unsigned baud = B115200) : _debug(false) {
_fd = open(filename.c_str(), O_RDWR | O_NOCTTY);
if(_fd < 0) throw new io_error("cannot open port");
// Serial initialization was written with FTDI USB-to-serial converters
// in mind. Anyway, who wants to use non-8n1 protocol?
tcgetattr(_fd, &_termios);
termios tio = {0};
tio.c_iflag = IGNPAR;
tio.c_oflag = 0;
tio.c_cflag = baud | CLOCAL | CREAD | CS8;
tio.c_lflag = 0;
tcflush(_fd, TCIFLUSH);
tcsetattr(_fd, TCSANOW, &tio;);
}
Another tcsetattr(_fd, TCSANOW, &_termios)
位于析构函数中,但无关紧要。
无论有没有这个 termios 初始化,系统都会发生奇怪的事情应用程序退出后。有时平淡cat
(or hd
)每次都立即退出,不打印任何内容或相同的内容,有时它正在等待并且不显示任何肯定发送到端口的数据;和close()
(read()
也是,但不是每次)发出奇怪的声音WARNING
发送至 dmesg参考usb-serial.c http://git.kernel.org/?p=linux/kernel/git/stable/linux-2.6.32.y.git;a=blob;f=drivers/usb/serial/usb-serial.c;h=bd3fa7ff15b12166bf0cf2ad86f3214144f914c0;hb=HEAD#l440.
我检查了硬件和固件数十次(甚至在不同的机器上),我确信它按预期工作;此外,我剥离了固件,只是一遍又一遍地打印相同的消息。
如何在不破坏任何东西的情况下使用串口? Thanks.