6

我编写了一个必须在 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

我检查了数十次硬件和固件(即使在不同的机器上),我确信它按预期工作;此外,我剥离了固件以一遍又一遍地打印相同的消息。

如何在不破坏任何东西的情况下使用串口?谢谢。

4

5 回答 5

2

WARN_ON一行可能意味着您遇到了内核错误。我知道最近在改进 USB 串行驱动程序方面有很多工作;我建议尝试更新的内核,和/或在 linux-usb@vger.kernel.org 邮件列表中询问。

于 2010-06-06T01:31:59.870 回答
1

我不确定您的代码片段有什么问题,但是如果您还没有看到它,这可能会派上用场:POSIX 操作系统的串行编程指南

我最近不得不做一些串行端口接口,这个库工作得很好,这可以作为另一个例子。

于 2010-06-05T23:43:42.320 回答
0

就像旁注一样,您的错误检查open并不完全正确 - 错误条件由返回值 -1 表示。(0 是完全有效的 fd,通常连接到标准输入。)

于 2010-06-06T08:58:43.917 回答
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系统上的任何意外字段都可以得到一些合理的值。

于 2010-06-06T18:42:22.380 回答
0

好的。这可能不是一个完美的解决方案……绝对不是。我只是扔掉了 FT232 转换器(实际上是炸的),并使用了基于 CP2102 的转换器。它现在可以工作(而且便宜 6 倍)。

于 2011-07-05T21:26:17.563 回答