树莓派基础实验36:通用串口通信实验
一、介绍
对于树莓派 3B+来说,他的UART功能有三种: 1、内部蓝牙使用; 2、控制终端使用; 3、与其他设备进行串口通信。
在树莓派基础实验35:USB TO TTL模块实验中学习了通过串口对树莓派进行控制台控制,让串口作为控制终端调试口即 serial console,但是在项目中常常会使用串口同其他传感器、单片机等设备进行通用串口通信。
本实验中设置树莓派的串口为通用串口与PC电脑的串口调试工具进行通信。
二、组件
★Raspberry Pi 3 B+主板*1
★树莓派电源*1
★USB TO TTL模块*1
★面包板*1(可选)
★40P软排线*1
★跳线若干
三、实验原理
(一)树莓派的串口
树莓派从大的方向来说一共出了3代,每一代的CPU外设基本相同,但内核不同,外设里面一共包含两个串口,一个称之为硬件串口(/dev/ttyAMA0),一个称之为mini串口(/dev/ttyS0)。
硬件串口由硬件实现,有单独的波特率时钟源,性能高、可靠,mini串口性能低,功能也简单,并且没有波特率专用的时钟源而是由CPU内核时钟提供,因此mini串口有个致命的弱点是:波特率受到内核时钟的影响。内核若在智能调整功耗降低主频时,相应的这个mini串口的波特率便受到牵连了,虽然你可以固定内核的时钟频率,但这显然不符合低碳、节能的口号。
在所有的树莓派板卡中都通过排针将一个串口引出来了,目前除了树莓派3代以外 ,引出的串口默认是CPU的那个硬件串口。而在树莓派3代中,由于板载蓝牙模块,因此这个硬件串口被默认分配给与蓝牙模块通信了,而把那个mini串口默认分配给了排针引出的GPIO Tx Rx。
树莓派的串口默认为串口终端调试使用,如要正常使用串口则需要修改树莓派设置。关闭串口终端调试功能后则不能再通过串口登陆访问树莓派,只能通过ssh或者远程桌面连接树莓派后进行控制。
树莓派管脚图
上图红框中就是引出的串口IO(GPIO 14/15),如果我们需要通过UART外接模块,默认情况下必须得使用性能很低的mini串口了,而且随着内核主频的变化,还会造成波特率的变化导致通信的失败,几乎很难使用。所以我们一般要恢复硬件串口(/dev/ttyAMA0)与GPIO 14/15的映射关系,使得我们能够通过GPIO使用高性能的硬件串口来连接我们的串口设备。
恢复映射关系前先看下默认的映射关系:
serial0是GPIO引脚对应的串口,serial1是蓝牙对应的串口。如图所示,serial0(GPIO串口)默认使用的是ttyS0(mini串口),serial1(蓝牙)使用的是ttyAMA0(硬件串口)。
四、实验步骤
第1步: 连接电路。与树莓派基础实验35:USB TO TTL模块实验一样,使用USB TO TTL模块连接好树莓派的串口和PC电脑的USB接口。
树莓派(name) | T型转接板(BCM) | USB TO TTL模块 |
---|---|---|
TXD | TXO | RXD |
RXD | RXI | TXD |
GND | GND | GND |
下图中的USB要插到笔记本电脑上哈,为方便拍照就没插上。连线很简单,电路图就没画了。
USB TO TTL模块实物接线图
第2步: 首先我们先尝试使用默认的ttyS0(mini串口)来进行通用串口通信。
(1)设置树莓派,在Raspberry Pi Configuration中将Serial Port设置为Enable,但是Serial Console都要Disable,即关闭串口控制台功能,然后必须重启树莓派生效。
(2)PC电脑上运行串口调试工具,串口驱动的安装请参考[树莓派基础实验35:USB TO TTL模块实验],(https://www.jianshu.com/p/048fcffa3ddd)中的内容。如下图设置好参数,点击“打开串口”。
(3)树莓派上安装minicom,启动时配置参数串口为/dev/ttyS0,波特率(9600)。在树莓派上输入信息,在PC上的串口调试工具就会收到该信息。
sudo apt-get install minicom #安装minicom
sudo minicom -D /dev/ttyS0 -b9600 #启动minicom
(4)PC上的串口调试工具发送字符信息,树莓派上也会显示该信息,证明两者的UART双向通信成功。
(5)这里要注意的是:进入minicom工具,按提示按CTAL -A,然后按Z后会显示帮助信息。若再按O可以进入Minicom配置界面。
进入Minicom配置界面,再选择Serial port setup,可以对树莓派的串口进行设置。
进入串口设置,可以设置树莓派串口的设备、波特率等:
第3步: 为了在树莓派3中通过GPIO使用高性能的硬件串口,我们必须将分配给蓝牙使用的硬件串口与分配给IO排针的mini串口进行对换,这必然会使得蓝牙模块的功能受到影响,不过这里我们不使用蓝牙。
(1)在/boot/overlays文件内有两个文件,README 和pi3-miniuart-bt.dtbo,首先查看有没有相关文件。
(2)README文件中说明了此文件的功能,是将树莓派3的蓝牙切换到mini串口(ttyS0),并且恢复硬件串口(ttyAMA0)到GPIO14&15引脚中。
(3)修改配置文件
sudo vim /boot/config.txt
在该文件中加一行代码
dtoverlay=pi3-miniuart-bt
保存后重启树莓派,再查看映射关系已经改变:
(4)进入minicom,发送信息给PC串口调试工具。与第2步不同的是,:启动时配置参数串口必须为/dev/ttyAMA0,波特率可以更改为其它的,这里设置为115200。
pi@raspberrypi:~ $ sudo minicom -D /dev/ttyAMA0 -b115200
经过测试,双向通信成功!这里要注意,第2步里面关闭串口控制台功能的设置不能变,即Serial Console要Disable。
补充: 前面步骤当中的部分设置使用的是图形界面配置,在不能使用图形界面时,也可以直接修改配置文件。
(1)上面串口的开启的步骤中,是在Raspberry Pi Configuration 界面中,将Serial Port选项ENable,也可以直接修改/boot/config.txt文件。
sudo vim /boot/config.txt
enable_uart=1即为Serial Port Enable串口开启,enable_uart=0即为Serial Port Disable串口关闭。
(2)上面关闭串口控制台功能,是在Raspberry Pi Configuration 界面中,将Serial Console选项Disable,可以直接修改/boot/cmdline.txt文件。
sudo vim /boot/cmdline.txt
cmdline.txt修改前
cmdline.txt修改后
去掉了“console=serial0,115200”,即Disable了串口控制台功能。