有没有什么方法可以检查 Linux 上的串行设备支持哪些波特率?
我浏览过该/sys/class/tty/ttyS0
目录,但没有看到任何列出此类信息的内容。
答案1
你似乎在问两个不同的问题。
有什么方法可以检查串行设备支持哪些波特率?
答案取决于 (1) 硬件的功能,即 UART/USART/SCC,以及设备驱动程序在波特率发生器中可以使用的除数范围;查阅设备数据表;(2) 连接到串行端口设备的时钟/振荡器的频率;查阅电路板文档。
有没有什么方法可以检查 Linux 支持哪些波特率?
include/asm-generic/termbits.h
中定义的波特率之一标志位终端控制结构体的成员是串口(即UART/USART)设备驱动程序接收波特率配置值的典型方法。
#define B0 0000000 /* hang up */
#define B50 0000001
#define B75 0000002
#define B110 0000003
#define B134 0000004
#define B150 0000005
#define B200 0000006
#define B300 0000007
#define B600 0000010
#define B1200 0000011
#define B1800 0000012
#define B2400 0000013
#define B4800 0000014
#define B9600 0000015
#define B19200 0000016
#define B38400 0000017
#define BOTHER 0010000
#define B57600 0010001
#define B115200 0010002
#define B230400 0010003
#define B460800 0010004
#define B500000 0010005
#define B576000 0010006
#define B921600 0010007
#define B1000000 0010010
#define B1152000 0010011
#define B1500000 0010012
#define B2000000 0010013
#define B2500000 0010014
#define B3000000 0010015
#define B3500000 0010016
#define B4000000 0010017
串行端口驱动程序通常没有任何方法来报告/通告这些波特率中的哪些是实际支持/可配置/实现的。FIFO 和休眠等属性有一个功能值,但没有波特率。驱动程序可以定义一个读写控制()调用来配置(非标准)波特率,尽管这会使使用它的程序不可移植。
答案2
2023 年 8 月新版本:
由于新的源代码树已经分裂termbits.h
成termbits-common.h
termbits.h
小的狂欢脚本:
从sawdust 的回答,这是我的解决方案:
for bauds in $(
sed -r 's/^#define\s+B([1-9][0-9]+)\s+.*/\1/p;d' \
/usr/include/asm-generic/termbits*.h ) ;do
echo $bauds
stty -F /dev/ttyS0 $bauds && echo Ok.
done 2>&1 |
pr -at2
将在我的主机上呈现:
50 Ok.
75 Ok.
110 Ok.
134 Ok.
150 Ok.
200 Ok.
300 Ok.
600 Ok.
1200 Ok.
1800 Ok.
2400 Ok.
4800 Ok.
9600 Ok.
19200 Ok.
38400 Ok.
57600 Ok.
115200 Ok.
230400 Ok.
460800 Ok.
500000 Ok.
576000 Ok.
921600 Ok.
1000000 Ok.
1152000 Ok.
1500000 Ok.
2000000 stty: /dev/ttyS0: unable to perform
2500000 stty: /dev/ttyS0: unable to perform
3000000 stty: /dev/ttyS0: unable to perform
3500000 stty: /dev/ttyS0: unable to perform
4000000 stty: /dev/ttyS0: unable to perform
但这并不意味着它会起作用!
您必须使用电缆和设备对它们进行测试...
输出更清洁...
hfile=(/usr/include/asm-generic/termbits*.h) ans=(yes no);column < <(
while read -r bauds;do
stty -F /dev/ttyS0 $bauds &>/dev/null
printf '%8d %-3s\n' $bauds ${ans[$?]}
done < <(
sed -r 's/^#define\s+B([0-9]{2,})\s+.*/\1/p;d' "${hfile[@]}" ))
可能会输出类似这样的内容:
50 yes 300 yes 9600 yes 460800 no 1500000 no
75 yes 600 yes 19200 yes 500000 no 2000000 no
110 yes 1200 yes 38400 yes 576000 no 2500000 no
134 yes 1800 yes 57600 yes 921600 no 3000000 no
150 yes 2400 yes 115200 yes 1000000 no 3500000 no
200 yes 4800 yes 230400 no 1152000 no 4000000 no
列出tty
设备
快速设备列表,通过狂欢根据设备名称进行扩展和数组操作。
devs=(/dev/tty?*) devs=(${devs[@]##*/}) devs=(${devs[@]%tty[0-9]*})
但我更喜欢这个:更可靠,基于/sys
伪 fs:(100% 纯 bash)
#!/bin/bash
shopt -s globstar extglob
devs=(/sys/devices/!(virtual)/**/device/tty/tty?*)
ans=yes hfile=(/usr/include/asm-generic/termbits*.h)
bauds=()
for file in "${hfile[@]}"; do
while read -r lhs rhs _ ; do
case $lhs$rhs in
\#defineB[0-9]* ) bauds+=(${rhs#B}) ;;
esac
done < "$file"
done
declare -A devdone='()'
for tty in "${devs[@]##*/}";do
if [[ ! -v devdone["$tty"] ]] &&
read _ oldrate _ < <(stty -F /dev/$tty 2>/dev/null); then
echo "[ $tty ]"
for i in ${!bauds[@]}; do
rate=${bauds[i]} nc=' '
(( i == ${#bauds[@]}-1 || ( (1+i) % 6 ) == 0 )) && nc=$'\n'
stty -F /dev/$tty $rate &> /dev/null
printf '%8d %-3s%s' $rate ${ans[$?]:-no} "$nc"
done
stty -F /dev/$tty $oldrate &>/dev/null
devdone["$tty"]=yes
fi
done
在我的主机上(一些 Arduino 和 ESP32 插在我的 USB 上),我看到:
[ ttyUSB1 ]
0 no 50 yes 75 yes 110 yes 134 yes 150 yes
200 yes 300 yes 600 yes 1200 yes 1800 yes 2400 yes
4800 yes 9600 yes 19200 yes 38400 yes 57600 yes 115200 yes
230400 yes 460800 yes 500000 yes 576000 yes 921600 yes 1000000 yes
1152000 yes 1500000 yes 2000000 yes 2500000 yes 3000000 yes 3500000 no
4000000 no
[ ttyUSB2 ]
0 no 50 yes 75 yes 110 yes 134 yes 150 yes
200 yes 300 yes 600 yes 1200 yes 1800 yes 2400 yes
4800 yes 9600 yes 19200 yes 38400 yes 57600 yes 115200 yes
230400 yes 460800 yes 500000 yes 576000 yes 921600 yes 1000000 yes
1152000 yes 1500000 yes 2000000 yes 2500000 yes 3000000 yes 3500000 no
4000000 no
[ ttyUSB3 ]
0 no 50 no 75 no 110 no 134 no 150 no
200 no 300 yes 600 yes 1200 yes 1800 yes 2400 yes
4800 yes 9600 yes 19200 yes 38400 yes 57600 yes 115200 yes
230400 yes 460800 yes 500000 yes 576000 yes 921600 yes 1000000 yes
1152000 no 1500000 no 2000000 no 2500000 no 3000000 no 3500000 no
4000000 no
[ ttyS1 ]
0 no 50 yes 75 yes 110 yes 134 yes 150 yes
200 yes 300 yes 600 yes 1200 yes 1800 yes 2400 yes
4800 yes 9600 yes 19200 yes 38400 yes 57600 yes 115200 yes
230400 no 460800 no 500000 no 576000 no 921600 no 1000000 no
1152000 no 1500000 no 2000000 no 2500000 no 3000000 no 3500000 no
4000000 no
[ ttyS0 ]
0 no 50 yes 75 yes 110 yes 134 yes 150 yes
200 yes 300 yes 600 yes 1200 yes 1800 yes 2400 yes
4800 yes 9600 yes 19200 yes 38400 yes 57600 yes 115200 yes
230400 no 460800 no 500000 no 576000 no 921600 no 1000000 no
1152000 no 1500000 no 2000000 no 2500000 no 3000000 no 3500000 no
4000000 no
重要提示:
拥有港口可配置为任何速度并不意味着目标设备可以支持这个!!
在我的转储中,前两个 USB 是 arduinos,最后一个ttyUSB3
是 ESP32。我知道我可以使用921'600
,ESP32
但无法以高于 的波特率与 Arduino 通信115'200
!即使端口可配置为最大3'000'000
波特率!!
答案3
您可以使用控制台上的“stty”命令检查设备波特率:
$ stty < /dev/tty.. (where tty... is the device file you are listening)
输出:
speed 9600 baud; line = 0;
-brkint -imaxbel
您还可以使用以下命令更改波特率:
$ sudo stty -F /dev/tty... 9600 (or whatever baud rate number)