Linux设置了更高的波特率和相关设置

时间:2016-06-15 08:36:46

标签: linux embedded-linux termios baud-rate

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

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

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

  1. 使用struct termios表单termios.h头文件。
  2. 使用struct termios2标题文件中的asm/termios.h
  3. 使用stty(1) GNU / Linux实用程序。
  4. 问题是什么:

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

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

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

    如果我想更改system(...),则此方法无效(它不会覆盖该设置,就像HW flow control值一样)。

    有哪些解决方案?

    可以将两种设置参数的方法混合到baud - 这样的通信链接吗?

2 个答案:

答案 0 :(得分:0)

恕我直言,使用来自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就会失去兼容性。

答案 1 :(得分:0)

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

1)从setserial输出

获取baud_base值
setserial -a /dev/<...>

2)计算divisor = 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设置divisor = 3太多而设置divisor = 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)