我写了一个必须在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()
也是如此,但不是每次都发出一个奇怪的WARNING
到dmesg referring to usb-serial.c。
我检查了硬件和固件几十次(即使在不同的机器上),我确信它按预期工作;此外,我剥离固件只是一遍又一遍地打印相同的信息。
如何在不破坏任何内容的情况下使用串口?谢谢。
答案 0 :(得分:2)
点击WARN_ON
行可能表示您遇到了内核错误。我知道最近在改进USB串行驱动器方面做了很多工作;我建议尝试更新的内核,和/或询问linux-usb@vger.kernel.org邮件列表。
答案 1 :(得分:1)
我不确定您的代码片段有什么问题,但如果您还没有看到它,这可能会派上用场:Serial Programming Guide for POSIX Operating Systems
我最近必须进行一些串口连接,this library工作正常,这可能是另一个例子。
答案 2 :(得分:0)
正如附注,open
上的错误检查不太正确 - 错误条件由返回值-1发出信号。 (0是完全有效的fd,通常连接到stdin。)
答案 3 :(得分:0)
您可能想尝试:
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;
+ termios tio;
+ memcpy(&tio, &_termios, sizeof(struct termios));
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);
}
这样可以使系统上termios
的任何意外字段获得一些合理的值。
答案 4 :(得分:0)
好。这可能不是一个完美的解决方案......绝对不是。我刚刚扔掉了FT232转换器(实际上是炸了它),并使用了基于CP2102的转换器。它现在正常工作(也便宜6倍)。