输入硬件:BeagleBone Black,运行一些GNU / Linux发行版。
我想要实现的目标:我想将一些UART
外设设置为921600
波特值,并能够设置其他串行相关设置(例如,开始/停止位,奇偶校验,数据位,hw流量控制等)。
到目前为止,在Linux中,我找到了至少三种配置此参数的方法:
struct termios
表单termios.h
头文件。struct termios2
标题文件中的asm/termios.h
。stty(1)
GNU / Linux实用程序。问题是什么:
使用第一种方法我不能使用921600
波特率值(没有定义这样的更高值,它只能达到230400 baud
。所以这种方法不起作用。< / p>
第二种方法为我提供了一种更改自定义baud
费率值的方法,但也很棘手,因为它不提供某些功能,例如tcgetattr()
,tcsendbreak()
,{{1} ,等等。此函数存在于第一个描述的方法中,由于(1),我无法同时包含头文件tcflush()
和termios.h
。
最后一种方法也不起作用,或者至少它不适用于我想要的所有设置。这是我正在使用的当前方法,我打开目标文件,我得到一个文件描述符,到该文件描述符我设置通信参数(波特(首先我设置一个较低的值),奇偶校验,开始/停止位等)使用第一种方法,然后我使用asm/termios.h
实用程序将波特率值更改(覆盖)为stty(1)
(我进行921600
函数调用来执行此操作。 / p>
如果我想更改system(...)
,则此方法无效(它不会覆盖该设置,就像HW flow control
值一样)。
有哪些解决方案?
可以将两种设置参数的方法混合到baud
- 这样的通信链接吗?
答案 0 :(得分:0)
恕我直言,使用来自C或C ++程序的system
和stty
是不的方式(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
输出
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)