树莓派3b串口配置

原文转载自 这里

简介

主要为了记录下来下次再配置时的方便。

通常学习一块新的硬件平台,大家第一个工程便是流水灯,实际上这属于IO口的基本控制,这与上篇文章VS使用wiringPi库控制树莓派的GPIO是异曲同工的,接下来便应该是开始使用其通信接口,而通信接口里面最简单的又属串口(uart),虽然简单但目前仍然有很多模块是以串口作为通信接口的,如一些蓝牙模块、低速wifi模块、GPS模块、GPRS模块等。树莓派3代与之前的树莓派相比除了CPU性能上的提升外,还有一个显著的特色便是板载集成了WIFI及蓝牙,正是由于集成的这个蓝牙模块,又使得树莓派3代的串口使用相比于之前版本有了些麻烦,本文的目的便是解决这些麻烦并编写验证了一个简单的串口代码。

树莓派3代串口的麻烦

树莓派从大的方向来说一共出了3代,每一代的CPU外设基本相同,但内核不同,外设里面一共包含两个串口,一个称之为硬件串口(/dev/ttyAMA0),一个称之为mini串口(/dev/ttyS0)。硬件串口由硬件实现,有单独的波特率时钟源,性能高、可靠,mini串口性能低,功能也简单,并且没有波特率专用的时钟源而是由CPU内核时钟提供,因此mini串口有个致命的弱点是:波特率受到内核时钟的影响。内核若在智能调整功耗降低主频时,相应的这个mini串口的波特率便受到牵连了,虽然你可以固定内核的时钟频率,但这显然不符合低碳、节能的口号。在所有的树莓派板卡中都通过排针将一个串口引出来了,目前除了树莓派3代以外 ,引出的串口默认是CPU的那个硬件串口。而在树莓派3代中,由于板载蓝牙模块,因此这个硬件串口被默认分配给与蓝牙模块通信了,而把那个mini串口默认分配给了排针引出的GPIO Tx Rx,下图是树莓派3的接口图。

树莓派3b串口配置_第1张图片

其中椭圆圈住的就是它的串口收发引脚。默认情况下必须得使用性能很低的mini串口了,而且随着内核主频的变化,还会造成波特率的变化导致通信的失败,几乎很难使用。所以我们希望恢复硬件串口与GPIO 14/15的映射关系,使得我们能够通过GPIO使用高性能的硬件串口来连接我们的串口设备。

将树莓派3的硬件串口与mini串口默认映射对换

树莓派可以配置文件来修改设备树,我的理解是可以通过配置文件来修改管脚的映射关系,这在许多Cortex-M3内核的单片机中也很常见,可以将同一个串口映射到不同的管脚上,以方便PCB的布线。

为了在树莓派3中通过GPIO使用高性能的硬件串口,我们必须将分配给蓝牙使用的硬件串口与分配给IO排针的mini串口进行对换,这必然会使得蓝牙模块的功能受到影响,但还好,蓝牙并不是必须的。

在树莓派系统中

/boot/overlays/

目录下,提供了一个pi3-miniuart-bt-overlay.dtb的文件,这个文件的作用可以通过该目录下的README文件查看

如果没有pi3-miniuart-bt-overlay.dtb这个文件,点击 http://ukonline2000.com/wp-content/uploads/2016/03/ 下载

树莓派3b串口配置_第2张图片
树莓派3b串口配置_第3张图片

README文件中说明了这个文件的功能是将树莓派3的蓝牙切换到mini串口(ttyS0),并且恢复硬件串口(ttyAMA0)到GPIO 14&15脚中。并且给出了载入的方法。

首先在树莓派命令终端中通过命令查看树莓派3当前的串口映射关系

ls -l /dev
树莓派3b串口配置_第4张图片

对比修改前的关系,可以看出serial0和serial1 与 ttyAMA0和ttyS0的映射关系对换完成了,也就是ttyAMA0映射到了引出的GPIO Tx Rx上。

禁用串口的控制台功能

前面的步骤已经交换了硬件串口与mini串口的映射关系,但现在想使用树莓派外接串口模块进行通信还不行,因为树莓派IO引出的串口默认是用来做控制台使用的,它的初衷是为了在没有网络接口时,通过串口对树莓派进行相关的配置。因此需要禁用这个默认功能,使得串口为我们自由使用。

在树莓派命令窗口中分别通过如下两个命令停止和禁用串口的控制台功能

1
2
sudo systemctl stop [email protected]
sudo systemctl disable [email protected]

由于我们前面已经交换了串口的映射关系,因此这里注意是ttyAMA0。

然后通过下列指令编辑cmdline.txt文件

1
sudo nano /boot/cmdline.txt

然后看到里面类似如下的内容

1
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

把console=serial0,115200删掉 console=serial0,115200 ,剩下的内容类似如下

1
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

然后重新启动树莓派,使修改生效

编写一个简单的串口程序

新建一个test.py文件

# -*- coding: utf-8 -*
import serial
import time
# 打开串口
ser = serial.Serial("/dev/ttyAMA0", 9600)
def main():
    while True:
        # 获得接收缓冲区字符
        count = ser.inWaiting()
        if count != 0:
            # 读取内容并回显
            recv = ser.read(count)
            print(recv)
            ser.write(recv)
        # 清空接收缓冲区
        ser.flushInput()
        # 必要的软件延时
        time.sleep(0.1)
    
if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        if ser != None:
            ser.close()
保存后用串口线连上树莓派的串口引脚,然后打开电脑的串口调试工具。 直接在树莓派上打开终端运行
python test.py

然后在电脑的串口调试工具上发送一些信息,不出意外树莓派的终端会打印出发送的信息,然后就OK了!

注意测试程序用python3写的,python2 的话只需要改动一下 

将   print(recv)
改成 print recv   就可以了 


你可能感兴趣的:(树莓派3b串口配置)