树莓派3b+ 修改USB串口波特率
- 1. 背景:需要多个RS232串口
- 2.问题:多个串口波特率不同
- 3.解决方案
- 4.完美方案
- 错误方案集锦
- 使用minicom设置ttyUSB0的波特率并保存
1. 背景:需要多个RS232串口
树莓派3B+只有两个串口,一个硬件串口,一个mini串口,其中mini串口波特率不稳定。项目需要树莓派通过串口连接多个设备,因此考虑使用USB转RS232。
2.问题:多个串口波特率不同
串口波特率分别为9600、115200,常规的串口使用ttyAMA0时,已经默认分配为9600,此时需要修改指定的USB的波特率为115200。
3.解决方案
USB和树莓派硬件串口都属于 /dev/
下的设备,当插入USB设备后,使用 ls -l /dev/tty*
查看USB设备对应的文件名称,一般只有一个USB设备时,名称为 ttyUSB0
。
使用stty
指令集(set tty)sudo stty -F /dev/ttyUSB0 115200
。
这条命令将串口设备/dev/ttyUSB0的波特率设置为115200。完成此操作后,您可以使用命令stty -F /dev/ttyUSB0再次查询串口设备的实际设置。此时显示如下:
如果在重启后重新连接到串口设备,并且stty命令的输出速率回归到9600,则可能是因为树莓派重新加载了与串口通信相关的驱动程序并使用了其默认设置。
如果您希望在每次启动树莓派时自动设置串口设备的波特率,可以将stty
命令添加到启动脚本中,例如/etc/rc.local
文件。
以下是一个示例,将stty
命令添加到/etc/rc.local
文件中:
1.打开/etc/rc.local
文件:
sudo nano /etc/rc.local
2.在文件的exit 0行之前添加以下行:
stty -F /dev/ttyUSB0 115200
注意:如果您的串口驱动使用的设备名称不是“/dev/ttyUSB0”,请改为相应的设备名称。
3.保存并退出文件。
4.重新启动树莓派,您将会发现串口设备的波特率已经设置为115200。
4.完美方案
虽然这种方法可以自动设置串口设备的波特率,但实际上,这并不是一个完美的解决方案,因为它只是通过脚本在启动时设置串口设备的波特率,并不能保证普遍适用于所有情况,特别是在使用不同的串口设备或不同的Linux发行版
时。
另一个解决方法是将这些设置添加到udev
规则中。udev
规则是Linux
系统通过检测与设备相关的事件而运行的规则。通过在udev
规则中添加命令,我们可以保证在每次连接设备时都会自动运行这些命令。
以下是实例,在udev
规则中添加串口设备的波特率设置:
1.首先,打开一个新文件来存储udev
规则(如果文件不存在则新建文件):
sudo nano /etc/udev/rules.d/99-usb-serial.rules
2.向文件中添加以下行:
SUBSYSTEM=="tty", ATTRS{idVendor}=="<vendor_id>", ATTRS{idProduct}=="<product_id>", ATTRS{serial}=="<serial_number>", SYMLINK+="ttyUSBa", RUN+="/bin/sh -c 'stty -F /dev/%k 115200'"
请使用实际的供应商ID、产品ID和串行号替换上述规则中的字段。您可以使用以下命令查找设备的供应商ID、产品ID和串行号:
lsusb
返回内容格式如下:
Bus <bus_num> Device <dev_num>: ID <vendor_id>:<product_id> <device information>
实例:
Bus 001 Device 004: ID 0525:a4a2 Qualcomm / Peiker acustic GmbH & Co. KG Bluetooth Device
在此示例中,供应商ID为0525,产品ID为a4a2,设备上可能没有串行号
。
如果您的USB设备没有串行号,则可以省略 ATTRS{serial}
匹配条件。
以下是例子,在没有USB设备串行号的情况下,如何编辑 udev 规则:
SUBSYSTEM=="tty", ATTRS{idVendor}=="<vendor_id>", ATTRS{idProduct}=="<product_id>", SYMLINK+="ttyUSBa", RUN+="/bin/sh -c 'stty -F /dev/%k 115200'"
在这个例子中,ATTRS{serial}=="<serial_number>"
条件已经被移除。
提取设备的供应商ID、产品ID和串行号后,请将其添加到udev规则中。如果需要为多个串口设备设置不同的波特率,可以在99-usb-serial.rules
文件中添加多个类似的规则,每个规则使用唯一的SYMLINK
名称即可。
3.然后,重新加载udev规则并重新插入设备以使规则生效:
sudo udevadm control --reload-rules
sudo udevadm trigger
现在,每次连接该设备时,设置都将自动应用到您的串口设备中。
在程序中,通常需要使用固定的设备名称来与 USB 设备进行通信,例如 /dev/ttyUSB0、/dev/ttyUSB1
等。但是,当USB设备数量发生变化时,这些设备名称会发生改变,这会影响程序的正常运行。
为了解决这一问题,udev 提供了一个 SYMLINK
属性,可以将 USB 设备映射到一个固定的设备名称上,这样即使 USB 设备数量变化了,固定的设备名称也不变。
SYMLINK+=
就是 udev 规则中用来实现这个目的的常见语法。例如,以下规则会将匹配到的 USB 设备映射到 /dev/ttyUSBa
设备上:
SUBSYSTEM=="tty", ATTRS{idVendor}=="<vendor_id>", ATTRS{idProduct}=="<product_id>", SYMLINK+="ttyUSBa"
当 udev 检测到满足条件的 USB 设备插入时,就会创建一个名为 /dev/ttyUSBa 的符号链接,指向实际的 USB 设备文件。这样在程序中就可以一直使用 /dev/ttyUSBa 这个设备名称。
错误方案集锦
使用minicom设置ttyUSB0的波特率并保存
minicom只是一个串口通信工具,可用来与串口设备通信。
在minicom中修改只是更改了minicom的默认配置,但这不会直接影响串口设备本身的配置。所以,使用命令stty -F /dev/ttyUSB0
来查询串口信息时,它会显示串口的实际配置,而不是minicom的默认配置。因此,你需要使用stty
命令设置串口设备的信息。