正确的Linux串口初始化序列

我写了一个必须在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初始化,在应用程序退出后系统中都会发生奇怪的事情.有时普通猫(或高清)每次都会立即打印任何东西或相同的东西,有时候它正在等待并且不显示任何肯定会发送到端口的数据;和close()(read(),但不是每次都发出一个奇怪的警告到dmesg referring to usb-serial.c.

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

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

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

相关文章

linux常用进程通信方式包括管道(pipe)、有名管道(FIFO)、...
Linux性能观测工具按类别可分为系统级别和进程级别,系统级别...
本文详细介绍了curl命令基础和高级用法,包括跳过https的证书...
本文包含作者工作中常用到的一些命令,用于诊断网络、磁盘占满...
linux的平均负载表示运行态和就绪态及不可中断状态(正在io)的...
CPU上下文频繁切换会导致系统性能下降,切换分为进程切换、线...