小的狂欢脚本:

小的狂欢脚本:

有没有什么方法可以检查 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.htermbits-common.htermbits.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'600ESP32但无法以高于 的波特率与 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)

相关内容