whi*_*ark 6 c linux serial-port tty
我写了一个必须在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);
}
Run Code Online (Sandbox Code Playgroud)
另一个tcsetattr(_fd, TCSANOW, &_termios)坐在析构函数中,但它无关紧要.
无论有没有这个termios初始化,在应用程序退出后系统中都会发生奇怪的事情.有时普通cat(或hd)出口立即打印任何东西或每次都没有相同的东西,有时它正在等待并且不显示任何肯定发送到端口的数据; 并且close()(read()也是,但不是每次)都发出一个奇怪WARNING的dmesg 引用usb-serial.c.
我检查了硬件和固件几十次(即使在不同的机器上),我确信它按预期工作; 此外,我剥离固件只是一遍又一遍地打印相同的消息.
如何在不破坏任何东西的情况下使用串口?谢谢.
好的。这可能不是一个完美的解决方案……绝对不是。我刚刚扔掉了 FT232 转换器(实际上是炒了它),并使用了基于 CP2102 的转换器。现在就可以使用了(而且便宜 6 倍)。