【树莓派4B学习】十四、树莓派4B串口通信

一、必须要先知道的储备知识

树莓派4B的外设一共包含两个串口,一个称之为硬件串口(/dev/ttyAMA0),一个称之为mini串口(/dev/ttyS0)。

硬件串口由硬件实现,有单独的波特率时钟源,性能高、可靠。
mini串口性能低,功能也简单,并且没有波特率专用的时钟源而是由CPU内核时钟提供,因此mini串口有个致命的弱点是:波特率受到内核时钟的影响。内核若在智能调整功耗降低主频时,相应的这个mini串口的波特率便受到牵连了。当然可以固定内核的时钟频率,如果不考虑功耗的情况下。

树莓派(3/4代)板载蓝牙模块,默认的硬件串口是分配给蓝牙模块使用的,而性能较差的mini串口是分配给GPIO串口 TXD0、RXD0。

【树莓派4B学习】十四、树莓派4B串口通信_第1张图片

其中红框中就是引出的串口IO,如果我们需要通过UART外接模块,默认情况下必须得使用性能很低的mini串口了,而且随着内核主频的变化,还会造成波特率的变化导致通信的失败,几乎很难使用。所以我们希望恢复硬件串口与GPIO 14/15的映射关系,使得我们能够通过GPIO使用高性能的硬件串口来连接我们的串口设备。

补充:树莓派IO引出的串口默认是用来做控制台使用的(使用串口登录树莓派,类似SSH登录那种),它的初衷是为了在没有网络接口时,通过串口对树莓派进行相关的配置。

二、关闭串口登录,打开硬件串口调试功能

在树莓派终端输入sudo raspi-config,依次按照下图所示选择

【树莓派4B学习】十四、树莓派4B串口通信_第2张图片
【树莓派4B学习】十四、树莓派4B串口通信_第3张图片

关闭串口登录功能

【树莓派4B学习】十四、树莓派4B串口通信_第4张图片

打开硬件串口调试功能

【树莓派4B学习】十四、树莓派4B串口通信_第5张图片

然后退出,重启。

三、配置树莓派串口

经过第一部分了解到,硬件串口默认分配给板载蓝牙使用,如果想要使硬件串口分配给GPIO,那么就需要配置,这也正是本节要讲述的。

1、查看当前串口分配方式

在树莓派终端输入ls /dev -al,可以查看到默认的串口分配方式。其中可以看到有如下图所示的一组对应。

在这里插入图片描述
serial0即GPIO映射的串口,默认是ttyS0,即mini串口
serial1即板载蓝牙映射的串口,默认是ttyAMA0,即硬件串口。

我们要做的工作便是,将两者映射互相交换。
serial0映射成ttyAMA0,serial1映射成ttyS0。

2、修改配置文件

在树莓派终端输入sudo vim /boot/config.txt
在对应的文件末尾加入dtoverlay=pi3-disable-bt
【树莓派4B学习】十四、树莓派4B串口通信_第6张图片

蓝牙使用硬件串口,所以我们在 /boot/config.txt里面加上 dtoverlay=pi3-disable-bt ,ttyAMA0 得以释放,这时候树莓派也自动交换了ttyAMA0和ttyS0,把serial0 分配给了 ttyAMA0 。

随后,输入 sudo reboot重启树莓派,使修改生效。

3、验证当前串口分配方式

依旧输入在树莓派终端输入ls /dev -al
【树莓派4B学习】十四、树莓派4B串口通信_第7张图片

四、代码测试

终于到了,最激动人心的环节了 — 测试。

  • 通过USB-TTL连接树莓派的TXD/RXD连接到PC,并打开PC端的串口助手,设置波特率为9600.

  • 树莓派上,编写4.py,代码如下所示。

# -*- coding: utf-8 -*
import serial
import time

def main():
    while True:
        # 获得接收缓冲区字符
        count = ser.inWaiting()
        if count != 0:
            # 读取内容并显示
            recv = ser.read(count)
            print recv  
        # 清空接收缓冲区
        ser.flushInput()
        # 必要的软件延时
        time.sleep(0.1)
   
if __name__ == '__main__':
    try:
	# 打开串口
    	ser = serial.Serial('/dev/ttyAMA0', 9600)
    	if ser.isOpen == False:
        	ser.open()                # 打开串口
    	ser.write(b"Raspberry pi is ready")
		main()
    except KeyboardInterrupt:
        if ser != None:
            ser.close()


  • 树莓派运行4.py文件,同时开启PC端串口助手,并注意观察接收框变化
    【树莓派4B学习】十四、树莓派4B串口通信_第8张图片
    【树莓派4B学习】十四、树莓派4B串口通信_第9张图片

  • 上面PC端串口助手成功打印Raspberry pi is ready,说明树莓派发送到PC端没得问题。

  • 接着测试树莓派接收PC端的消息

【树莓派4B学习】十四、树莓派4B串口通信_第10张图片
【树莓派4B学习】十四、树莓派4B串口通信_第11张图片

  • 树莓派接收也没得问题!!!

至此,树莓派4B的串口通信测试,便成功实现!


参考

  • 树莓派3b/4b通用 + 串口配置
  • 树莓派3b+串口配置
  • 树莓派4B如何使用串口与外部进行通信

你可能感兴趣的:(#,树莓派4B)