树莓派与STM32串口通信实现指南

目录

一、树莓派串口通信模块介绍

二、树莓派蓝牙、串口引脚映射对换步骤

1.启动串口

2. 禁用蓝牙(硬件串口与mini串口映射对换)

3.验证是否交换成功

三、树莓派安装mini串口调试助手

四、树莓派与电脑串口调试

五、树莓派与STM32串口调试


一、树莓派串口通信模块介绍

树莓派串口通信与蓝牙模块的基本介绍

树莓派3/4B有两个串口,分别为 “硬件串口”/dev/ttyAMA0 和“mini串口” /dev/ttyS0。

“硬件串口”有单独的波特率时钟源,性能高、可靠,“mini串口”性能低,功能也简单,并且没有波特率专用的时钟源而是由CPU内核时钟提供,因此“mini串口”有个致命的弱点是:波特率受到内核时钟的影响,内核若在智能调整功耗降低主频时,相应的这个mini串口的波特率便受到牵连。

简单概括来说:“硬件串口”是全功能的,而“mini串口”则是阉割过的。

在实际项目中遇到的问题是,如果使用“mini串口”/dev/ttyS0,在通讯需要奇偶校验时会报错。所以项目中为了稳定还是推荐使用“硬件串口” /dev/ttyAMA0 。

在树莓派3/4B中,由于板载蓝牙模块,因此这个“硬件串口”被默认分配给与蓝牙模块通信了,而把“mini串口”默认分配给了排针引出的GPIO Tx Rx。在开启串口通讯不做任何设置的时候,默认的串口通讯使用的是“mini串口”。

因此,如果要在项目中使用,为了通讯稳定,需要进行“硬件串口”与“mini串口”默认映射对换,把“硬件串口”/dev/ttyAMA0映射分配给GPIO的Tx Rx。

二、树莓派蓝牙、串口引脚映射对换步骤

1.启动串口

首先打开此设置界面

然后选择此界面:

此举是将串口打开,点击OK,再重启树莓派。

2. 禁用蓝牙(硬件串口与mini串口映射对换)

映射对换的目的是将硬件串口作用在GPIO接口的Tx Rx上。我的项目上没有用到蓝牙通讯,所以禁用蓝牙后也没有再次开启,也没有测试再次开启蓝牙通讯是否正常,如果项目中有用到蓝牙通讯,那么进行这一步的时候要谨慎。

打开终端输入:

ls /dev -al 

查看所有串口映射,下拉找到这一行,如下图所示:

此时我们可以发现我们的serial0,也就是主串口映射为ttyS0,也就是主串口指向的是mini串口,前文我们提到mini串口效率低不稳定,所以这里我们需要将主串口指向硬件串口,也就是ttyAMA0

打开终端,输入:

sudo nano /boot/config.txt

滚轮到末尾最下方,加入内容:

dtoverlay=pi3-disable-bt

这样,ttyAMA0 得以释放,这时候树莓派也自动交换了ttyAMA0和ttyS0,把serial0 分配给了 ttyAMA0 。

3.验证是否交换成功

打开终端,再次输入:

ls /dev -al

就可以看到如下图所示,这样我们就配置成功了。

三、树莓派安装mini串口调试助手

打开终端,输入:

sudo apt-get install minicom 

等待安装完成。

安装完成之后,接下来就是使用串口助手。在终端输入命令:

minicom -D /dev/ttyAMA0 -b 115200 

回车即可进入。这里 -D /dev/ttyAMA0 就是指向我们打开的串口端口号,和COM1这种是一样的, -b 115200是配置波特率,这一项我们在minicom中输入 Ctrl+A 在下方也是可以看到我们的波特率。

注意:这里我遇到了一个问题,就是提示打开 ttyAMA0 的时候没有权限,如果你也遇见了没有权限打开tty8的这种提示,打开终端输入:

sudo chmod 777 /dev/ttyUSB0

这里的 ttyUSB0 对应你提示没有权限的串口,然后回车就OK解决了。

minicom打开之后如图所示:

我打开minicom串口助手的时候,会发现键盘失灵,就是在minicom下,键盘跟没插似的。如果你没有遇到这种情况,就可以跳过这一小节。那么具体解决办法,参考这个博主的博文,里面有着详细的操作步骤:

https://blog.csdn.net/weixin_41276153/article/details/128037288?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168207712316800186528500%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168207712316800186528500&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-128037288-null-null.142^v86^wechat,239^v2^insert_chatgpt&utm_term=%E6%A0%91%E8%8E%93%E6%B4%BE%E4%B8%8Estm32%E4%B8%B2%E5%8F%A3%E9%80%9A%E4%BF%A1&spm=1018.2226.3001.4187

好了,到这里所有配置已经结束,接下来就可以验证了。

四、树莓派与电脑串口调试

打开电脑上的串口调试助手,把树莓派的minicom串口调试助手也打开。我用的是ttyAMA0,所以指令是:

minicom -D /dev/ttyAMA0 -b 115200

注意:电脑上的串口助手波特率等信息与树莓派上的信息要对应。

连线方式:

树莓派上的RX引脚   连接   USB-TTL上的TX引脚,

树莓派上的TX引脚   连接   USB-TTL上的RX引脚,

GND   与   GND相连。

把USB-TTL插到电脑上之后就可以进行树莓派与电脑之间的串口调试了。

 串口调试助手网上随便找一个就可以,这里给个链接:

链接:https://pan.baidu.com/s/17CVgDrNb6OM6yVvCB5A8HQ?pwd=1mge 
提取码:1mge

五、树莓派与STM32串口调试

连线方式:

树莓派上的RX引脚   连接   STM32上的TX引脚,

树莓派上的TX引脚   连接   STM32上的RX引脚,

GND  与  GND相连(这个GND最好接上,让它们之间有一个统一的低电平,更容易接收到数据)。

我们可以写这么一个程序进行测试:树莓派发送“456”,STM32接收到之后发送“123”回来。

STM32端的程序就不挂了,网上有很多例程。把波特率、校验位、停止位等信息配置对了就可以。下面挂一下树莓派的发送“456”的程序。

import serial

ser = serial.Serial("/dev/ttyAMA0", 9600, timeout=0.1)  # 生成串口

while True:

    ser.write(b'456') # 发送数据

效果如下图: 

最后再留几个树莓派接收数据的程序,这两句要放在while循环里,以达到串口实时接收信息的目的。

ser.flushInput()  # 清空缓存

data = ser.read(1)  # 读取一个字节的数据

当然这只是举一个简单的例子,具体读取多少字节数据,或者其他更多设置,可以网上搜索一下进行修改 。

注意事项:

1.我做的这个项目中,结合到了串口通信与摄像头的实时检测,由于二者都是实时的,所以串口通信的读取间隔不能影响到摄像头视频流的采集。

所以,对于下面这句初始化代码中,timeout的取值十分重要。经过尝试,间隔为0.1s的时候,摄像头读取视频流是不卡顿的,但是有时候串口会接收不到信息。所以,具体情况还是需要你自己去亲自调试。

ser = serial.Serial("/dev/ttyAMA0", 9600, timeout=0.1)

2.另外就是我自己感觉,波特率为9600时的效果要比115200的效果好一点。 

物联沃分享整理
物联沃-IOTWORD物联网 » 树莓派与STM32串口通信实现指南

发表评论