Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux设置更高的波特率和相关设置_Linux_Embedded Linux_Termios_Baud Rate - Fatal编程技术网

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

Linux设置更高的波特率和相关设置,linux,embedded-linux,termios,baud-rate,Linux,Embedded Linux,Termios,Baud Rate,输入硬件:BeagleBone Black,上面运行一些GNU/Linux发行版 我想要实现的是:我想要将一些UART外围设备设置为921600波特值,并能够设置其他串行相关设置(例如启动/停止位、奇偶校验、数据位、硬件流量控制等) 到目前为止,在Linux中,我至少找到了三种配置此参数的方法: 使用struct termiosformtermios.h头文件 使用asm/termios.h头文件中的struct termios2 使用stty(1)GNU/Linux实用程序 问题是: 对于第一

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

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

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

  • 使用
    struct termios
    form
    termios.h
    头文件
  • 使用
    asm/termios.h
    头文件中的
    struct termios2
  • 使用
    stty(1)
    GNU/Linux实用程序
  • 问题是:

    对于第一种方法,我不能使用
    921600
    波特率值(对于这样高的值没有定义,它只会上升到
    230400波特
    ),所以这种方法不起作用

    第二种方法为我提供了一种更改自定义
    波特率值的方法,但也很棘手,因为它不提供一些函数,如
    tcgetattr()
    tcsendbreak()
    tcflush()
    ,依此类推。此函数出现在第一个描述的方法中,我不能同时包含头文件
    termios.h
    asm/termios.h
    ,因为

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

    例如,如果我想更改
    HW流量控制
    (它不会覆盖该设置,就像
    baud
    值一样),此方法将不起作用

    解决方案是什么


    < > >将两种设置参数的方法混合到<代码> UART < /代码> -通信链路上,如< /P> < P> IMHO,使用<代码>系统< /COD>和<代码> STTY < /C> >从C或C++程序为<强>不>强> >(<代码>系统< /代码>最初被称为一个不良的安全实践)。 在阅读了相关的问题之后,我的建议是只在主模块、名称空间或类中声明一些包装器函数,用于您希望从termios.h和asm/termios.h使用的所有特性

    然后在两个不同的编译单元(C或C++源文件)中定义它们,首先处理TymiOS。h,后者用ASM/TymiOS。h<P/>


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

    IMHO,使用
    system
    stty从C或C++程序中,<强> > < >强> >(<>代码>系统< /> >,起初称为一个不良的安全实践)。
    在阅读了相关的问题之后,我的建议是只在主模块、名称空间或类中声明一些包装器函数,用于您希望从termios.h和asm/termios.h使用的所有特性

    然后在两个不同的编译单元(C或C++源文件)中定义它们,首先处理TymiOS。h,后者用ASM/TymiOS。h<P/> 如果这不起作用,最后一种方法是小心地将termios.h和asm/termios.h的声明合并到您自己源代码中管理的自定义本地_termios.h中,并将其包括在内。这当然会导致代码不可移植,但无论如何,一旦使用asm/termios.h,您就会失去兼容性。

    您可以使用console实用程序:

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

    setserial -a /dev/<...>
    
    3.26太多,无法设置除数=3,太少,无法设置除数=4

    因此,在这种情况下,由于硬件限制,您不能使用波特率=921600。 您可以选择除数=3(波特率=1000000)或除数=4(波特率=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)
    
    stty-F/dev/9600-icrnl-ixon-crtscts-parenb#所需的UART设置
    setserial/dev/spd_cust#使用自定义值作为除数
    setserial/dev/divisior 3#设置除数的自定义值
    stty-F/dev/38400#激活设置序列设置
    #现在波特率为(波特率基/除数)
    
    您可以使用console实用程序:

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

    setserial -a /dev/<...>
    
    3.26太多,无法设置除数=3,太少,无法设置除数=4

    因此,在这种情况下,由于硬件限制,您不能使用波特率=921600。 您可以选择除数=3(波特率=1000000)或除数=4(波特率=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)
    
    stty-F/dev/9600-icrnl-ixon-crtscts-parenb#所需的UART设置
    setserial/dev/spd_cust#使用自定义值作为除数
    setserial/dev/divisior 3#设置除数的自定义值
    stty-F/dev/38400#激活设置序列设置
    #现在波特率为(波特率基/除数)
    
    setserial
    输出me
    无法设置串行信息:尝试设置
    baud_base
    参数时,参数无效。您确定硬件支持921600波特率吗?尝试
    setserial-a/dev/
    查看有关串行端口的可用信息。波特率基数可能是由硬件固定的,所以正确的方法是:1。通过
    设置串行-a
    查看当前波特率基数;2.计算期望波特率的除数;3.使用
    setserial。。。spd_cust
    设置串行。。。除数
    要设置除数,硬件支持此波特率值(我可以使用
    minicom
    stty
    工具进行设置)。
    setserial
    工具报告的
    baud_base
    300000
    。我有