1 引言
硬件:树莓派4B 8GB 和 STM32 H743(已经烧录了 uart 收发程序)
系统:Ubuntu22.04
语言:python (vscode 远程 )
需求:实现树莓派和32的串口通信
2 过程记录
2.1 树莓派串口学习
树莓派 | 串口02 - 树莓派4B上打开另外4路硬件串口_树莓派4b 在吗使用ttyama2串口-CSDN博客
树莓派4 UART 多串口配置通信 | 树莓派实验室 (nxez.com)
树莓派4B-串口、多串口配置及详细使用攻略_树莓派扩展多个串口-CSDN博客
在Ubuntu22.04条件下,如何打开树莓派4B的串口_树莓派4b ubuntu系统打开ttyama1-CSDN博客
树莓派共有两种类型的串口控制器,如下:
串口控制器类型 | 接口 | Pi 4B | 比较 | ||
mini UART | /dev/ttyS0 | 1个 | mini串口功能简单,稳定性较差,波特率由CPU内核时钟提供,受内核时钟影响 | ||
PL011 硬件UART | /dev/ttyAMA0 | 5个 | 硬件串口有单独的波特率时钟源,性能好,稳定性强 |
相比树莓派0、1、2 以及 3 的双串口 UART0(PL011)和 UART1(mini UART),树莓派 4B 中新增了 4 个 PL011 串口共计有 6 个 UART。6个UART,其中5个是硬件UART,可以使用这5个硬件UART稳定地与外部的设备进行通讯。1个是mini UART。
在树莓派4B中,由于板载蓝牙模块,因此硬件串口UART1(ttyAMA0接口)被默认分配给蓝牙模块通信,mini串口开启的是ttyS0接口,默认分配给排针引出的GPIO TX RX,这个接口非常不稳定,几乎不能传送正确的数据。
结论:
(1)把默认分配给蓝牙的ttyAMA0硬件串口和mini串口默认映射对换,适用于4B及之前0 1 2 3代树莓派,这样会导致蓝牙被禁用
注:结论1的步骤操作如下:
sudo nano /boot/firmware/config.txt #进入nano模式修改配置文件
在配置文件中增加如下内容,打开ttyS0->mini uart:
然后重启,命令sudo reboot
使用命令查看设备文件:
ls -l /dev
效果如下:
下面调换serial0和serial1的映射:
再次修改配置文件,这回在config.txt文件中加入如下内容
保存,在终端输入以下命令禁用掉和蓝牙有关的开机启动项
sudo systemctl disable bluetooth
重启树莓派,应该没有蓝牙标志了,serial0和serial1也调换为:
(2)用ttyAMA1或ttyAMA2或ttyAMA3或ttyAMA4硬件串口,适用于4B型号,之前的型号我不下结论,因为我没用过,按照网上的资料应该是不适用的,因为他本身就没有那么多硬件串口,我建议看到文章的小伙伴命令行看一下到底有几个串口
(3)我用的(2),因为我不知道后面会不会用到蓝牙,既然有其他的硬件串口干脆用其他的硬件串口就好了
查看4B上所有的串口资源:
dtoverlay -a | grep uart
查看某个串口信息:
dtoverlay -h uart0
查看设备文件命令:
ls -l /dev
2.2 配置开启UART2 3 4 5
进入nano模式准备修改配置文件:
sudo nano /boot/firmware/config.txt #(ubuntu是这个,raspiberrypi是/boot/config)
在配置文件中增加如下内容:
重启后查看是否生效:
sudo reboot #重启
ls /dev/ttyAMA* #查看有几个硬件串口
各 UART 串口与 GPIO(对应的是BCM编码) 对应关系:
UART0: GPIO14 = TXD0 -> ttyAMA0 GPIO15 = RXD0 -> ttyAMA0
UART2: GPIO0 = TXD2 -> ttyAMA1 GPIO1 = RXD2 -> ttyAMA1
UART3: GPIO4 = TXD3 -> ttyAMA2 GPIO5 = RXD3 -> ttyAMA2
UART4: GPIO8 = TXD4 -> ttyAMA3 GPIO9 = RXD4 -> ttyAMA3
UART5: GPIO12 = TXD5 -> ttyAMA4 GPIO13 = RXD5 -> ttyAMA4
注1:如果没有对换映射,则是:
UART0 对应 ttyS0,UART1 对应 ttyAMA0,这俩是默认的
UART2 对应 ttyAMA1, UART3 对应 ttyAMA2, UART4 对应 ttyAMA3,
UART5 对应 ttyAMA4.
注2:如果按照结论1对换映射,那么应该是:
UART0 对应 ttyAMA0,UART1 对应 ttyS0,已对换
UART2 对应 ttyAMA1, UART3 对应 ttyAMA2, UART4 对应 ttyAMA3,
UART5 对应 ttyAMA4.
2.3 UART2 测试
对UART2进行自收自发测试如下:
硬件连线上,需要将GPIO0和GPIO1连接起来
引自树莓派 4 UART 多串口配置通信_树莓派与服务器的多端口通信-CSDN博客
代码方面:
python 进行串口通信,依赖包是pyserial
我在项目的虚拟环境下 把串口的三方库pip到本地仓库,方便在项目文件中import使用
命令如下:
pip install pyserial
定义串口并发送:
报错:权限不够
办法:
/dev/ttyUSB0 permission denied 解决方案-CSDN博客
按上述命令修改完用户权限后重启,权限问题解决
然后开启两个终端,一个运行py程序,一个接收,如下,UART2测试成功
UART3 UART4 和UART5的自收自发测试类似,只是引脚不同,参考前文引脚图连线可完成串口3-5的自收自发测试,目前我只需要用到一个串口,其他的就不测了.
2.4 python代码
待续