【问题标题】:Linux set higher baud rate and associated settingsLinux 设置更高的波特率和相关设置
【发布时间】:2016-06-15 08:36:46
【问题描述】:

输入硬件:BeagleBone Black,上面运行一些 GNU/Linux 发行版。

我想要实现的目标:我想将一些UART 外围设备设置为921600 波特值,并能够设置其他与串行相关的设置(例如开始/停止位、奇偶校验、数据位、硬件流)控制等)。

到目前为止,在 Linux 中,我已经找到了至少三种配置此参数的方法:

  1. 使用struct termios形成termios.h头文件。
  2. 使用来自asm/termios.h 头文件的struct termios2
  3. 使用stty(1) GNU/Linux 实用程序。

有什么问题:

第一种方法我不能使用921600波特率值(没有定义这么高的值,它只能达到230400 baud。所以这个方法不起作用。

第二种方法为我提供了一种更改自定义baud 速率值的方法,但也很棘手,因为它不提供tcgetattr()tcsendbreak()tcflush() 等一些功能。这个函数存在于第一种方法中,由于(1),我不能同时包含头文件termios.hasm/termios.h

最后一种方法也不起作用,或者至少它不适用于我想要进行的所有设置。这是我正在使用的当前方法,我正在打开目标文件,我得到一个文件描述符,对该文件描述符我设置通信参数(波特(首先我设置一个较低的值)、奇偶校验、开始/停止位等)使用第一种方法,然后我使用stty(1) 实用程序将波特率值更改(覆盖)为921600(我调用system(...) 函数来执行此操作)。

例如,如果我想更改 HW flow control,此方法将不起作用(它不会覆盖该设置,就像 baud 值发生的情况一样)。

有什么解决办法?

像这样将两种设置参数的方法混合到UART-communication链接可以吗?

【问题讨论】:

    标签: linux embedded-linux termios baud-rate


    【解决方案1】:

    您可以使用setserial 控制台实用程序:

    1) 从setserial 输出中获取波特基值

    setserial -a /dev/<...>
    

    2) 计算除数 = baud_base / desired_baud_rate

    例如,如果 baud_base = 3000000 (3MHz):

    baud_rate = 115200 -> divisor = 26.04 (approximately 26)
    baud_rate = 230400 -> divisor = 13.02 (approximately 13)
    baud_rate = 921600 -> divisor = 3.26
    

    3.26 太大而不能设置除数=3,太少不能设置除数=4。

    因此,在这种情况下,由于硬件限制,您不能使用 baud_rate=921600。 您可以选择 divisor=3 (baud_rate=1000000) 或 divisor=4 (baud_rate=750000)。这些波特率不是标准的,但可能。

    stty -F /dev/<...> 9600 -icrnl -ixon -crtscts -parenb # desired UART settings
    setserial /dev/<...> spd_cust  # use custom value for divisor
    setserial /dev/<...> divisor 3  # set custom value for divisor
    stty -F /dev/<...> 38400 # activate setserial settings
    # now baud_rate is (baud_base / divisor)
    

    【讨论】:

    • setserial 在尝试设置 baud_base 参数时输出我 Cannot set serial info: Invalid argument
    • 您确定您的硬件支持 921600 波特率吗?请尝试setserial -a /dev/&lt;...&gt; 以查看有关串行端口的可用信息。
    • baud_base 可能是硬件固定的,所以正确的做法是: 1. 查看当前 baud_base by setserial -a; 2. 计算所需波特率的除数; 3.使用setserial ... spd_custsetserial ... divisor设置除数
    • 是的,硬件支持这个波特值(我可以用minicomstty工具设置)。 setserial 工具报告的baud_base3000000
    • 我已经更新了我的答案。 stty 建议标准波特率列表。这并不意味着您的设备支持它。
    【解决方案2】:

    恕我直言,在 C 或 C++ 程序中使用 systemstty不是可行的方法(system 起初被认为是一种糟糕的安全做法)。

    阅读您的相关问题后,我的建议是仅在您的主模块、命名空间或类中声明一些包装函数,用于您想从 termios.h 和 asm/ 中使用的所有功能termios.h.

    然后你在两个不同的编译单元(c 或 c++ 源文件)中定义它们,首先处理 termios.h,后者处理 asm/termios.h

    如果这不起作用,最后一种方法是小心地将来自 termios.h 和 asm/termios.h 的声明合并到您自己的源中管理的自定义 local_termios.h 中并包含它。这当然会导致代码不可移植,但无论如何,一旦您使用 asm/termios.h,就会失去兼容性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-15
      • 1970-01-01
      相关资源
      最近更新 更多