我编写了一个必须在 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);
}
另一个tcsetattr(_fd, TCSANOW, &_termios)
坐在析构函数中,但它无关紧要。
不管有没有这个 termios 初始化,应用程序退出后系统中都会发生奇怪的事情。有时plain cat
(或hd
)每次都立即退出打印任何内容或相同的东西,有时它正在等待并且不显示任何肯定发送到端口的数据;和close()
(read()
也是,但不是每次)都会WARNING
向 dmesg发出一个奇怪的指代 usb-serial.c。
我检查了数十次硬件和固件(即使在不同的机器上),我确信它按预期工作;此外,我剥离了固件以一遍又一遍地打印相同的消息。
如何在不破坏任何东西的情况下使用串口?谢谢。