最近在考虑树莓派串口的事情,需要实现串口数据接收,python处理后再发送出去。今天就来测试一下,看看怎么实现。
先来看看树莓派的GPIO串口TXD、RXD 的位置。

· 1、开始之前需要开启串口,并关闭串口登录。
可以vnc过去可视化界面来操作,也可以终端输入sudo raspi-config来命令行操作,操作完成后的结果就是第二张图。


2、查看当前串口分配方式。
终端运行ls /dev -al | grep serial,查看到Serial0 就是GPIO映射的串口,默认是ttyS0。Serial1 就是板载蓝牙映射的串口,默认是ttyAMA0。我们使用的是ttyS0。

3、python测试
以9600波特率打开串口ttyS0,serial.Serial('/dev/ttyS0', 9600)。因为是软连接,/dev/ttyS0可以写成/dev/serial0。
发送字符串,然后循环接收。发送字符串需要转换为bytearray ,也可以写成“***”.encode() 。
硬件上将将树莓派串口与pc端连接起来,TXD与RXD要反过来接入。

笔者测试时直接将TXD、RXD 短接起来,运行结果如下,测试成功:

在笔者测试时,一直提示错误:“module 'serial' has no attribute 'Serial'”,调试了好久,搜索一下才知道命名的serial.py与模块重名了,import serial其实是把自己给import了,坑。更换为serial_test.py后正常。
4、串口数据接收,python处理后再发送出去
那接下来就是完成串口数据接收,python函数处理后再发送出去的过滤加工功能,框架代码如下。your_own_function()定义自己的过滤加工功能。

5、树莓派的两个串口说明
实现了python操作串串口实践后,我们再来深入的了解一下树莓派的串口。树莓派4B的外设一共包含两个串口,一个是硬件串口(/dev/ttyAMA0),一个是mini串口(/dev/ttyS0)。
硬件串口:有单独的波特率时钟源,性能高,可靠。
mini串口:性能低、功能简单、没有波特率专用的时钟源而是由CPU内核时钟提供,所以波特率收到内核时钟的影响,内核若在智能调整功耗降低主频时,相应的这个mini串口的波特率便受到牵连了。当然可以固定内核的时钟频率,如果不考虑功耗的情况下。
树莓派(3/4代)板载蓝牙模块,所以默认的硬件串口是给蓝牙模块使用的,而性能较差的mini串口是分配给GPIO串口TXD0、RXD0。
如果想要使硬件串口分配给GPIO,那么需要将两者映射互相交换,这需要修改配置文件。编辑/boot/config.txt文件,在对应的文件末尾加入dtoverlay=pi3-disable-bt,蓝牙使用硬件串口,所以我们在 /boot/config.txt里面加上 dtoverlay=pi3-disable-bt ,ttyAMA0 得以释放,这时候树莓派也自动交换了ttyAMA0和ttyS0,把serial0 分配给了 ttyAMA0 。最后接着输入 sudo reboot重启生效。
在此查看串口分配方式:ls /dev -al | grep serial,ttyAMA0与ttyS0已经交换了。再次运行python3 serial_test.py测试成功。

网友评论