gpt4 book ai didi

linux - 如何在 Linux 上为串口设备设置非标准波特率?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:52:45 24 4
gpt4 key购买 nike

在 Linux 上设置自定义波特率的方法有哪些?

这个问题的答案必须在系统调用级别之上的用户空间低级 API(ioctl 等)级别。它至少在这些情况下应该有用:

  1. 编写使用串行端口的基于 C 的低级用户态代码,

  2. 编写抽象串行端口功能的库,

  3. 编写内核串口驱动。

最佳答案

不幸的是,事情取决于驱动程序。好的驱动程序将实现以下所有方法。糟糕的驱动程序只会实现其中的一些方法。因此,您需要全部尝试。以下所有方法均在 linux/drivers/tty/serial/serial_core.c 中的辅助函数中实现。 .

有以下4种选择。

  1. 标准波特率在 tty->termios->c_cflag 中设置。您可以选择:

        B0
    B50
    B75
    B110
    B134
    B150
    B200
    B300
    B600
    B1200
    B1800
    B2400
    B4800
    B9600
    B19200
    B38400
    B57600
    B115200
    B230400
  2. 如果您需要上面未列出的费率,例如460800(根据源代码评论,这是内核开发人员希望死掉的已弃用的 hack):

    • tty->termios->c_cflag速度设置为B38400

    • 使用 (struct serial_struct) 设置如下调用 TIOCSSERIAL ioctl:

      serial->flags & ASYNC_SPD_MASK == ASYNC_SPD_[HI, VHI, SHI, WARP]
      // this is an assertion, i.e. what your code must achieve, not how

      这会将备用速度设置为 HI:57600,VHI:115200,SHI:230400,WARP:460800

  3. 您可以使用 alt_speed 设置任意速度,如下所示:

    • tty->termios->c_cflag 速度设置为B38400。这与您选择的速度无关!

    • tty->alt_speed 中设置预期速度。它在 alt_speed==0 时被忽略。

  4. 您还可以通过如下设置自定义除数来实现任意速率:

    • tty->termios->c_cflag 速度设置为B38400。这与您选择的速度无关!

      bool set_baudrate(int fd, long baudrate) {
      struct termios term;
      if (tcgetattr(fd, &term)) return false;
      term.c_cflag &= ~(CBAUD | CBAUDEX);
      term.c_cflag |= B38400;
      if (tcsetattr(fd, TCSANOW, &term)) return false;
      // cont'd below
    • 使用 struct serial_struct 调用 TIOCSSERIAL ioctl,设置如下:

      serial->flags & ASYNC_SPD_MASK == ASYNC_SPD_CUST
      serial->custom_divisor == serial->baud_base / your_new_baudrate
      // these are assertions, i.e. what your code must achieve, not how

    怎么做?首先通过调用TIOCGSERIAL ioctl 获取填充的结构(包括您需要的baud_base)。然后修改它以指示新的波特率并使用 TIOCSSERIAL 进行设置:

          // cont'd
    struct serial_struct serial;
    if (ioctl(fd, TIOCGSERIAL, &serial)) return false;
    serial->flags &= ~ASYNC_SPD_MASK;
    serial->flags |= ASYNC_SPD_CUST;
    serial->custom_divisor = serial->baud_base / baudrate.
    if (ioctl(fd, TIOCSSERIAL, &serial)) return false;
    return true;
    }

关于linux - 如何在 Linux 上为串口设备设置非标准波特率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19440268/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com