我写了一个应用程序,必须在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初始化,在应用程序退出后,系统中都会发生奇怪的事情。有时候,普通的cat
(或hd
)会立即退出,打印出来的东西都一样,有时候它会等待并且不显示肯定发送到端口上的任何数据;而close()
(read()
也是如此,但不是每次)会向dmesg发出奇怪的WARNING
,参见usb-serial.c。
我检查了硬件和固件很多次(甚至在不同的机器上),我确定它正在按预期工作;此外,我将固件剥离到只是反复打印相同的消息。
如何在不破坏任何内容的情况下使用串行端口? 谢谢。
minicom
或类似工具时,“错误”不会出现。 - whitequark