正确的Linux串口初始化序列

时间:2010-06-05 23:35:57

标签: 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);
  }

另一个tcsetattr(_fd, TCSANOW, &_termios)位于析构函数中,但它无关紧要。

无论是否进行此termios初始化,在应用程序退出后系统中都会发生奇怪的事情。有时,普通cat(或hd)每次都会立即打印任何内容或相同的内容,有时它正在等待并且不显示任何肯定发送到端口的数据;和close()read()也是如此,但不是每次都发出一个奇怪的WARNING到dmesg referring to usb-serial.c

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

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

5 个答案:

答案 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倍)。