Linux设置更高的波特率和相关设置
输入硬件:BeagleBone Black,上面运行一些GNU/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实用程序 问题是: 对于第一
UART
外围设备设置为921600
波特值,并能够设置其他串行相关设置(例如启动/停止位、奇偶校验、数据位、硬件流量控制等)
到目前为止,在Linux中,我至少找到了三种配置此参数的方法:
struct termios
formtermios.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
。我有