树莓派3b+串口配置

树莓派3b+串口配置前言树莓派从大的方向来说一共出了3代,每一代的CPU外设基本相同,但内核不同,外设里面一共包含两个串口,一个称之为硬件串口(/dev/ttyAMA0),一个称之为mini串口(/dev/ttyS0)。硬件串口由硬件实现,有单独的波特率时钟源,性能高、可靠,mini串口性能低,功能也简单,并且没有波特率专用的时钟源而是由CPU内核时钟提供,因此mini串口有个致命的弱点是:波特率受到内核时钟的影响…

大家好,又见面了,我是你们的朋友全栈君。

前言

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

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

树莓派系统镜像

2018-11-13-raspbian-stretch-full.img

步骤

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

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

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

首先查看有没有相关文件,执行命令

cd /boot/overlays

在这里插入图片描述
可以看到有 README 和 pi3-miniuart-bt-overlay.dtb 或者是 pi3-miniuart-bt.dtb ,后面的缺了(overlay)但是在README中的解释是相同的,因此,认为是同一文件。
在这里插入图片描述
README文件中说明了此文件的功能是将树莓派3的蓝牙切换到mini串口(ttyS0),并且恢复硬件串口(ttyAMA0)到GPIO14&15引脚中。
在这里插入图片描述

2、查看并修改串口映射关系

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

ls -l /dev

在这里插入图片描述
红框里面表示串口映射,有的可能只显示1个,没关系,修改之后两个就都显示出来了。
红色框中体现的应该是一种映射关系,此处暂时没有做深究,简单理解 serial0 就是GPIO映射的串口,此时GPIO映射的串口是默认的/dev/ttyS0这个mini串口。

3、现在来修改配置文件

执行命令

sudo nano /boot/config.txt

在这里插入图片描述
在该文件中加一行代码

dtoverlay=pi3-miniuart-bt

在这里插入图片描述
然后”ctrl+o”保存文件, 执行sudo reboot重启树莓派,使修改生效。一定要保存然后重启

4、再通过 ls -l /dev 命令查看修改后的映射关系

在这里插入图片描述
对比修改前的关系,可以看出serial0和serial1 与 ttyAMA0和ttyS0的映射关系对换完成了,也就是ttyAMA0映射到了引出的GPIO Tx(14) Rx(15) 引脚上。

5、禁用串口的控制台功能

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

在树莓派命令窗口中分别通过如下两个命令停止和禁用串口的控制台功能。
由于我们前面已经交换了串口的映射关系,因此这里注意是ttyAMA0。

sudo systemctl stop serial-getty@ttyAMA0.service
sudo systemctl disable serial-getty@ttyAMA0.service

再执行命令:

sudo nano /boot/cmdline.txt

然后看到里面类似如下的内容
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
删除语句 console=serial0,115200
剩下的内容类似如下:
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
然后重新启动树莓派,使修改生效。一定要保存然后重启

到这里,树莓派3b+的串口配置就配置了可以直接用了,下面我们用python-serial模块做一个“树莓派串口与电脑usb-ttl串口通信”的测试。

1、首先将树莓派的串口和usb-TTL串口连接好,并将usb-TTL串口插到电脑端上。
2、安装python-serial模块,一般都是树莓派系统默认已经安装好,可以直接跳过该步骤。

 sudo apt-get install python-serial  

3、输入phthon3启动python IDE。
4、创建serial实例ser,端口为 ‘/dev/ttyAMA0’,波特率设置为115200bps,第三个为校验位,可以不写。

>>> import serial
>>> ser = serial.Serial('/dev/ttyAMA0',115200)

5、检验串口是否打开,若未打开则输入 ser.open() 打开

>>> ser.isOpen()  
True 

6、电脑上打开设备管理器查看usb-TTL的串口号。
在这里插入图片描述
7、电脑上打开串口调试助手,选择刚刚查看的串口,波特率选择“115200”。
我用的串口助手是“STC-ISP下载软件”里面的串口助手。
在这里插入图片描述
8、然后我们在树莓派的python里发消息,检测发送是否正常:

>>> ser.write(b'Raspberry pi')
12

在这里插入图片描述
可以看到正常接收。
9、最后我们写一个python脚本代码,实现串口的发送和接收:

# -*- coding: utf-8 -*
import serial
import time
ser = serial.Serial('/dev/ttyAMA0', 115200)
if ser.isOpen == False:
    ser.open()                # 打开串口
ser.write(b"Raspberry pi is ready")
try:
    while True:
        size = ser.inWaiting()               # 获得缓冲区字符
        if size != 0:
            response = ser.read(size)        # 读取内容并显示
            print response        
            ser.flushInput()                 # 清空接收缓存区
            time.sleep(0.5)                  # 软件延时
except KeyboardInterrupt:
    ser.close()

将以上代码保存为“test_uart_python.py”,然后执行python test_uart_python.py运行树莓派端的python程序,我们试着发送一串消息过去。

在这里插入图片描述

参考文献

1、浅尝树莓派3之串口配置 – qq_31396093的博客 – CSDN博客
2、树莓派3b与电脑串口互相通信进行数据传输的配置过程 – 全都不是泡沫 – CSDN博客
3、树莓派通过串口接发数据(serial版) – 姜亚轲的博客 – CSDN博客
4、WiringPi/serialRead.c at master · WiringPi/WiringPi

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/152908.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 读懂spring源码_如何阅读spring源码

    读懂spring源码_如何阅读spring源码最近工作需要,使用到spring框架,想对spring框架进行深入的学习一下,看看源代码,提升和沉淀下自己,工欲善其事必先利其器,还是先搭建环境吧。环境搭建sping源码环境的搭建,当然了不想下载源码的话,就直接debug源码也可以的。

    2022年8月12日
    10
  • ElasticJob分布式调度,分布式多个微服务执行只需要执行一个定时任务,基本概念介绍(一)「建议收藏」

    ElasticJob分布式调度,分布式多个微服务执行只需要执行一个定时任务,基本概念介绍(一)「建议收藏」ElasticJob分布式调度,分布式多个微服务执行只需要执行一个定时任务,基本概念介绍(一)

    2025年7月29日
    4
  • 思科SDN技术:ACI架构概述

    思科SDN技术:ACI架构概述思科 ACI 物理架构 先解释几个名词 Fabric 在思科的一些高级产品 比如 Nexus7000 系列 中也有 Fabric 的概念 可以理解或翻译成交换矩阵 而在 ACI 中 Fabric 指的是如上图所示的 Leaf 交换机和 Spine 交换机组成的基础架构网络 也就是整个 ACI 网络中所有的硬件交换设备的集合 整个数据转发层面 叫做 FabricSpineL 骨干交换机 ACIFabric 的核

    2025年10月28日
    4
  • mysql前缀索引 默认长度_如何确定前缀索引的长度?

    mysql前缀索引 默认长度_如何确定前缀索引的长度?为什么需要前缀索引问题我们在对一张表里的某个字段或者多个字段建立索引的时候,是否遇到过这个问题。Specifiedkey’uniq_code’wastoolong;maxkeylengthis767bytes.表结构如下:createtable`t_account`(`id`BIGINT(20)UNSIGNEDNOTNULLauto_incrementCOMM…

    2022年5月20日
    86
  • vs2005配置OpenCv2.3.1

    编译OpenCv1用CMake导出VC++项目文件运行cmake-gui,设置whereisthesourcecode路径为OpenCV安装路径(本文档假定安装位置为:c:\OpenCV

    2021年12月18日
    45
  • java输入语句怎么写_java输入语句应该怎样写?示例演示

    java输入语句怎么写_java输入语句应该怎样写?示例演示作为初步进入java开发学习的小白来说,就像是小时候刚刚学说话一样,这种经历既是必然的也是有趣的,学习java语言一开始的时候也是得一步步的学习,比如说,java输入语句应该这么去实现呢?一起跟小编来看看吧。第一步:导包。先将java.io.*;以及java.util.*;导入Java代码中。charc=(char)System.in.read();是输入单个字符;inta=cin.nextI…

    2022年7月9日
    35

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号