树莓派3b+ 修改USB串口的波特率

文章讲述了如何在树莓派3B+上修改USB串口的波特率,以适应不同设备的需求。通过使用stty命令和编写启动脚本可以设置波特率,但此方法非完美解决方案。更佳的方法是利用udev规则,在设备插入时自动设置波特率,确保波特率设置在每次连接时都能正确应用。此外,文章还提到了minicom设置波特率的误区,并提供了创建设备固定名称的SYMLINK方法。
摘要由CSDN通过智能技术生成

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.向文件中添加以下行:

KERNEL=="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 规则:

KERNEL=="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 设备上:

KERNEL=="tty*", ATTRS{idVendor}=="<vendor_id>", ATTRS{idProduct}=="<product_id>", SYMLINK+="ttyUSBa"

当 udev 检测到满足条件的 USB 设备插入时,就会创建一个名为 /dev/ttyUSBa 的符号链接,指向实际的 USB 设备文件。这样在程序中就可以一直使用 /dev/ttyUSBa 这个设备名称。

以下是我的文件内容:

KERNEL=="ttyUSB*", ATTRS{idVendor}=="067b", ATTRS{idProduct}=="23a3",MODE:="0777", SYMLINK+="ttyUSBX", RUN+="/bin/sh -c 'stty -F /dev/%k 115200'"

错误方案集锦

使用minicom设置ttyUSB0的波特率并保存

minicom只是一个串口通信工具,可用来与串口设备通信。
在minicom中修改只是更改了minicom的默认配置,但这不会直接影响串口设备本身的配置。所以,使用命令stty -F /dev/ttyUSB0来查询串口信息时,它会显示串口的实际配置,而不是minicom的默认配置。因此,你需要使用stty 命令设置串口设备的信息。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值