树莓派 4B 多串口配置

2023-11-07

0. 实验准备以及原理

0.1 实验准备

安装树莓派官方系统的树莓派 4B,有 python 环境,安装了 serial
杜邦线若干
屏幕或者可以使用 VNC 进入到树莓派的图形界面

0.2 原理

树莓派 4B 有 UART0(PL011)、UART1(mini UART)和 4 个 PL011 串口共计有 6 个 UART

1. 硬件串口配置

可以将硬件串口(例如 /dev/ttyAMA0)配置为普通的串口设备,以便与其他设备进行串口通信

确保树莓派的引脚上的串口功能没有被占用。默认情况下,树莓派的 GPIO 引脚会使用串口功能。可以通过编辑 /boot/config.txt 文件来禁用串口功能。在文件的末尾添加或修改以下行,保存文件后重启树莓派(可以使用vi来编辑此文件,vi 的使用可以查看这一篇文章):

enable_uart=1

在这里插入图片描述
在终端中运行以下命令可以确认驱动是否已经加载:

ls -l /dev/ttyAMA0

能看到下面的输出就代表驱动是正常的

在这里插入图片描述

默认情况下,树莓派会将 /dev/ttyAMA0 用作终端串口,而不是普通的串口设备。可以通过编辑 /boot/cmdline.txt 文件来禁用终端串口。找到以 console=serial0 开头的行,并将其修改为 console=tty1,如下图所示

在这里插入图片描述
确保你的用户被添加到 dialout 组中,以便具有串口访问权限。运行以下命令将当前用户添加到 dialout 组:

sudo usermod -a -G dialout $USER

在添加到 dialout 组后,需要注销并重新登录才能使更改生效,到这里硬件串口就配置完成了,不需要看其他的可以直接跳到最后一节进行验证

2. 其他串口配置

2.1 展示所有串口命令

输出下面的命令可以看到所有的串口

dtoverlay -a | grep uart

在这里插入图片描述

2.2 查看特定串口信息

使用下面的命令会展示串口的配置信息

dtoverlay -h uart3

在这里插入图片描述

2.3 配置开启串口 UART2-5

/boot/config.txt的末尾添加如下的代码,保存重启树莓派

dtoverlay=uart2
dtoverlay=uart3
dtoverlay=uart4
dtoverlay=uart5

在这里插入图片描述
查看是否生效

ls /dev/ttyAMA*

结果如下图
在这里插入图片描述
到这里就打开了所有的串口了

3. 验证结果

各 UART 串口与 GPIO 对应关系:

GPIO14 = TXD0 -> ttyAMA0
GPIO0  = TXD2 -> ttyAMA1
GPIO4  = TXD3 -> ttyAMA2
GPIO8  = TXD4 -> ttyAMA3
GPIO12 = TXD5 -> ttyAMA4

GPIO15 = RXD0 -> ttyAMA0
GPIO1  = RXD2 -> ttyAMA1
GPIO5  = RXD3 -> ttyAMA2
GPIO9  = RXD4 -> ttyAMA3
GPIO13 = RXD5 -> ttyAMA4

在这里插入图片描述
这里进行两个验证:UART2的自环测试,UART2和3的串口间通信,以及一个究极测试:同时打开所有的串口(包括USB转的,看看树莓派的CPU使用率有多少)

3.1 UART2的自环测试

杜邦线短接 GPIO4 和 GPIO5
编写下面的 python 程序

import serial

ser1 = serial.Serial(port='/dev/ttyAMA2',baudrate=115200)
ser1.write(b'Hello, World!\n')

data = ser1.readline()
print(data)

执行结果如下图
在这里插入图片描述

3.2 UART2和3的串口间通信

使用杜邦线按照下图的方式进行连接

GPIO4(TXD3)-------GPIO9(RXD2)
GPIO5(RXD3)-------GPIO8(TXD2)

然后编写如下的程序

import serial

ser2 = serial.Serial(port='/dev/ttyAMA2',baudrate=115200)
ser3 = serial.Serial(port='/dev/ttyAMA3',baudrate=115200)

ser2.write(b'hello ser3,I am ser2\n')
ser3.write(b'hello ser2,I am ser3\n')
line2 = ser2.readline()
line3 = ser3.readline()
print('ser2Rec:'+str(line2))
print('ser3Rec:'+str(line3))

结果如下图,说明串口生效,实验成功:
在这里插入图片描述

3.3 究极测试

同时打开 USB0、USB1 和 ttyAMA0 到 ttyAMA4 一共 7 个串口,发送数据的同时存储数据,查看一下 CPU 的使用率
我的配置为:
USB0、1 使用 UART 转 TTL 模块,使用电脑发送数据过来
ttyAMA0 作为硬件串口,然后改为的通用串口,也使用 UART 转 TTL 模块,电脑发送数据过来
ttyAMA1ttyAMA4 连接
ttyAMA2ttyAMA3 连接
对应的连接图可以参考上面的GPIO对照着连线
代码如下

import serial
import time
import threading
import sys
READ = 1
READTIME = 600

ser0 = serial.Serial(port='/dev/ttyAMA0',baudrate=115200)
ser1 = serial.Serial(port='/dev/ttyAMA1',baudrate=115200)
ser2 = serial.Serial(port='/dev/ttyAMA2',baudrate=115200)
ser3 = serial.Serial(port='/dev/ttyAMA3',baudrate=115200)
ser4 = serial.Serial(port='/dev/ttyAMA4',baudrate=115200)
serUSB0 = serial.Serial(port='/dev/ttyUSB0',baudrate=115200)
serUSB1 = serial.Serial(port='/dev/ttyUSB1',baudrate=115200)

def WriteSer1():
    global READ
    while(READ):
        ser1.write(b'I am ser1')
        
def WriteSer2():
    global READ
    while(READ):
        ser2.write(b'I am ser2')
        
def WriteSer3():
    global READ
    while(READ):
        ser3.write(b'I am ser3')
        
def WriteSer4():
    global READ
    while(READ):
        ser4.write(b'I am ser4')
        
def ReadSer0():
    ser0.write(bytearray([0xaa,0x0a]))
    global READ
    data0 = b''
    while(READ):
        if(ser0.in_waiting):
            data0 +=  ser0.read(ser0.in_waiting)
    f = open('ser0.bin','ab')
    f.write(data0)
    f.close()
    
def ReadSer1():
    global READ
    data1 = b''
    while(READ):
        if(ser1.in_waiting):
            data1 +=  ser1.read(ser1.in_waiting)
    f = open('ser1.bin','ab')
    f.write(data1)
    f.close()
    
def ReadSer2():
    global READ
    data2 = b''
    while(READ):
        if(ser2.in_waiting):
            data2 +=  ser2.read(ser2.in_waiting)
    f = open('ser2.bin','ab')
    f.write(data2)
    f.close()

def ReadSer3():
    global READ
    data3 = b''
    while(READ):
        if(ser3.in_waiting):
            data3 +=  ser3.read(ser3.in_waiting)
    f = open('ser3.bin','ab')
    f.write(data3)
    f.close()
    
def ReadSer4():
    global READ
    data4 = b''
    while(READ):
        if(ser4.in_waiting):
            data4 +=  ser4.read(ser4.in_waiting)
    f = open('ser4.bin','ab')
    f.write(data4)
    f.close()
    
def ReadSerUSB0():
    global READ
    dataUSB0 = b''
    while(READ):
        if(serUSB0.in_waiting):
            dataUSB0 +=  serUSB0.read(serUSB0.in_waiting)
    f = open('serUSB0.bin','ab')
    f.write(dataUSB0)
    f.close()
    
def ReadSerUSB1():
    global READ
    dataUSB1 = b''
    while(READ):
        if(serUSB1.in_waiting):
            dataUSB1 +=  serUSB1.read(serUSB1.in_waiting)
    f = open('serUSB1.bin','ab')
    f.write(dataUSB1)
    f.close()
#%%
def start():
    global READ
    timeStart = time.time()
    
    ser1Write_thread = threading.Thread(target=WriteSer1)
    ser2Write_thread = threading.Thread(target=WriteSer2)
    ser3Write_thread = threading.Thread(target=WriteSer3)
    ser4Write_thread = threading.Thread(target=WriteSer4)
    
    ser0_thread = threading.Thread(target=ReadSer0)
    ser1_thread = threading.Thread(target=ReadSer1)
    ser2_thread = threading.Thread(target=ReadSer2)
    ser3_thread = threading.Thread(target=ReadSer3)
    ser4_thread = threading.Thread(target=ReadSer4)
    serUSB0_thread = threading.Thread(target=ReadSerUSB0)
    serUSB1_thread = threading.Thread(target=ReadSerUSB1)
    
    ser1Write_thread.start()
    ser2Write_thread.start()
    ser3Write_thread.start()
    ser4Write_thread.start()
    
    ser0_thread.start()
    ser1_thread.start()
    ser2_thread.start()
    ser3_thread.start()
    ser4_thread.start()
    serUSB0_thread.start()
    serUSB1_thread.start()
    
    time.sleep(READTIME)

    READ = False

    print('test time'+str(time.time()-timeStart))
    sys.exit()
    
if __name__ == '__main__':
    start()

使用命令,来查看当前CPU的使用率

htop

可以发现即使跑了这么多的串口,树莓派的 CPU 使用率依旧不算很高,4 核差不多都在 40% 的利用率左右
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

树莓派 4B 多串口配置 的相关文章

随机推荐

  • GD32F103ADC 采集问题

    GD32F103的ADC采集管脚设置为模拟输入时 有0 7V电压输出 不知道为什么 有谁遇到过吗
  • vue踩坑日记--动态(v-for)图片路径问题

    一 问题描述 想要用v for来动态生成图片路径 div img alt div 打包后的路径是这样的 打包后的资源目录是这样的 二 问题所在 上面样写是不行的 你会发现图片在页面中并没有正确显示 从上面的图片可以看出 打包后的图片路径明显
  • PHPMailer实现发送邮件验证码(附源码)

    目录 什么是PHPMailer composer安装 服务器和端口号 源码 调用 什么是PHPMailer PHPMailer是一个非常强大的php发送邮件类 可以设定发送邮件地址 回复地址 邮件主题 html网页 上传附件 使用起来非常方
  • Cocos2dx隐藏iOS7状态栏】通过添加Plist Key隐藏iOS7状态栏

    本站文章均为李华明Himi原创 转载务必在明显处注明 作者新浪微博 李华明Himi 转载自 黑米GameDev街区 原文链接 http www himigame com e9 9a 8f e7 ac 94 1481 html 点击订阅 本博
  • pydantic学习与使用-1.pydantic简介与基础入门

    前言 版本文档 v1 9 0 使用 python 类型注释的数据验证和设置管理 pydantic在运行时强制执行类型提示 并在数据无效时提供用户友好的错误 定义数据应该如何在纯粹的 规范的 python 中 并使用 pydantic 对其进
  • u-boot移植详细文档

    本文转载至 http blog chinaunix net uid 9672747 id 3590141 html 一 Boot Loader的概念和功能 二 U boot简介 三 开发环境准备 四 U boot的使用 一 四 U boot
  • celery的使用(最新详细解析)

    celery的使用 最新详细解析 一 Celery简介 Celery是一个简单 灵活且可靠的 处理大量消息的分布式系统 专注于实时处理的异步任务队列 同时也支持任务调度 Celery的架构由三部分组成 消息中间件 message broke
  • idea和eclipse常用快捷键

    删除光标所在行代码 idea快捷键 Ctrl y eclipse快捷键 Ctrl D 复制光标所在行代码 或者鼠标选中的代码 idea快捷键 Ctrl D eclipse快捷键 Ctrl Alt 上下键 切换代码大小写 idea Ctrl
  • springboot玩转jsp

    又到了一年一度年底扫福时间 闲着没事 把springboot官方文档看了一遍 可能年后有两个小的项目需要改造 想试试把ssm的架构改为springboot mybatis 但是又不想舍弃掉jsp 虽然官方不建议使用 更推荐thymelea
  • 基于protobuf的RPC实现

    google protobuf只负责消息的打包和解包 并不包含RPC的实现 但其包含了RPC的定义 假设有下面的RPC定义 service MyService rpc Echo EchoReqMsg returns EchoRespMsg
  • 量化投资学习-33:兼听则明,偏听则暗,多种指标综合适用-2

    每个指标都有自己的底部信号和顶部信号 各种指标组合 综合才形成了各种 战法 各种战法又有一定的适用条件 上升时期或下降时期或震荡时期 各种战法又有一定的操作指示 买入或卖出 本文列出各种指标的底部信号和顶部信号 类型 指标名称 原理 上升趋
  • Android面试题-架构MVC/MVP/MVVM

    Android面试题 架构MVC MVP MVVM 包括MVC MVP MVVM的介绍和优缺点 以及组件化 模块化的概念问题 本文是我一点点归纳总结的干货 但是难免有疏忽和遗漏 希望不吝赐教 转载请注明链接 https blog csdn
  • C语言基础入门48篇_48_文件的写入与读取(fwrite()文件的读取、fread()文件的写入、文件的读取与写入实质即为信息在磁盘与内存直接转换、核心问题:数据在磁盘哪?数据在内存哪?多少数据?)

    fread与fwrite 从信息的转换角度看 文件的读取与写入 其实就是信息在文件介质 磁盘 与内存之间进行转换 文件读取 fread 就是将磁盘中的文件内容 读取进内存中 而文件写入 fwrite 就是将内存中的内容 写入到磁盘中 那么他
  • H.264中的SPS和PPS

    http blog csdn net qingkongyeyue article details 54023323
  • kibana连接ES集群

    Kibana is served by a back end server This setting specifies the port to use server port 5601 Specifies the address to w
  • gin 六.重定向路由重定向与请求转发

    目录 一 重定向与请求转发基础解释 二 重定向 gin Context Redirect 内部 外部重定向 路由重定向 三 请求转发 一 重定向与请求转发基础解释 重定向和请求转发是两种常见的HTTP请求处理方式 它们都可以实现将请求从一个
  • MAC PS更换登记照背景颜色

    1 导入图片 用快速选择工具或魔棒选择人物头像 然后反向选择 按delete键就可以将背景颜色去掉 2 将图片复制为一个新的图层 3 再新建一个图层 用油漆桶工具将该图层变成任意你想要的颜色 4 将步骤2的图层拖到步骤3的图层上 就基本完成
  • Windowns编译OpenSSL

    前言 开发过程中需要上传数据 URL是https的 Qt默认是http网络请求 访问https需要用到SSL认证 而Qt默认不支持 需要自己编译OpenSSL库 一 下载OpenSSL 环境 Qt 5 12 2 MSVC 2017 32bi
  • nginx代理配置两个前端,共用一个后端

    找到你的nginx 配置文件 find name nginx conf 一般是在 conf d nginx conf里配置 需要添加一个端口 把配置文件替换成修改后的 nginx t 检查是否有错 重启配置文件 nginx s reload
  • 树莓派 4B 多串口配置

    0 实验准备以及原理 0 1 实验准备 安装树莓派官方系统的树莓派 4B 有 python 环境 安装了 serial 库 杜邦线若干 屏幕或者可以使用 VNC 进入到树莓派的图形界面 0 2 原理 树莓派 4B 有 UART0 PL011