赞
踩
目录
树莓派串口通信与蓝牙模块的基本介绍
树莓派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。
首先打开此设置界面
然后选择此界面:
此举是将串口打开,点击OK,再重启树莓派。
映射对换的目的是将硬件串口作用在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 。
打开终端,再次输入:
ls /dev -al
就可以看到如下图所示,这样我们就配置成功了。
打开终端,输入:
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下,键盘跟没插似的。如果你没有遇到这种情况,就可以跳过这一小节。那么具体解决办法,参考这个博主的博文,里面有着详细的操作步骤:
好了,到这里所有配置已经结束,接下来就可以验证了。
打开电脑上的串口调试助手,把树莓派的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
连线方式:
树莓派上的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的效果好一点。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。