树莓派 4B 多串口配置

news2024/11/18 2:20:51

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% 的利用率左右
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/661016.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ldsc python程序安装以及测试

教程参考: https://zhuanlan.zhihu.com/p/379628546https://github.com/bulik/ldsc 1. 软件安装 1.1 windows安装教程 首先配置: anaconda,为了需要conda环境git,为了下载github中的ldsc程序 打开windows电脑中的promote&am…

chatgpt赋能python:Python如何隐藏请求IP地址提高SEO效果

Python如何隐藏请求IP地址提高SEO效果 引言 在进行网站优化的过程当中,隐藏请求的IP地址是一个重要的环节。这个技巧不仅能够提高SEO的效果,还能够保护我们的网络安全,防止遭受黑客攻击。本文将介绍Python如何隐藏请求IP地址,以…

Spring应用启动分析优化

最近在搞应用的启动优化,参考一些可以显著提高 Java 启动速度方法和spring-boot-startup-report实现了此项目,Spring Startup Ananlyzer 采集Spring应用启动过程数据,生成交互式分析报告(HTML),用于分析Spring应用启动卡点&#x…

让数据不再裸奔:学习使用AES加解密算法

目录 1. application.yml文件配置 2. AES加解密工具类 3. AES消息秘钥、AES秘钥初始向量、转字节数组工具类 4. AES加解密测试 我们为什么要用AES算法来进行加解密? AES(Advanced Encryption Standard),又称高级加密标准&am…

C语言之生成随机数方法(C代码实现猜数字游戏)

C语言之生成随机数方法&#xff08;C代码实现猜数字游戏&#xff09; 首先先把猜数字游戏的代码给大家暂时出来&#xff0c;然后我们在根据代码的步骤一步一步的推导 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <tim…

【ChatGPT】一个凭借两百多年历史的公式崛起的巨星

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后端的开发语言A…

一分钟学一个 Linux 命令 - ps

前言 大家好&#xff0c;我是 god23bin。欢迎来到《一分钟学一个 Linux 命令》系列&#xff0c;每天只需一分钟&#xff0c;记住一个 Linux 命令不成问题。今天要说的是 ps 命令。 什么是 ps 命令&#xff1f; ps 的英文全称是 process status&#xff0c;意思是进程状态。 …

Servlet执行原理和API详解---【创建Servlet项目】

目录 一、Servlet 是什么&#xff1f; 主要工作&#xff1a; 第一个Servlet项目&#xff1a; 编写代码 打包程序 一、Servlet 是什么&#xff1f; Servlet 是一款基于HTTP协议&#xff0c;用来开发Java Web&#xff0c;运行在Tomcat里面的里的框架技术。 一种实现动态页面…

chatgpt赋能python:Python创建文件

Python创建文件 Python是一种高级编程语言&#xff0c;广泛应用于各种领域&#xff0c;尤其在数据分析、机器学习和人工智能方面被广泛使用。在Python中&#xff0c;创建文件是一项基本任务&#xff0c;本文将介绍如何使用Python创建文件。 创建一个空文件 在Python中&#…

3.CSS 的背景

通过CSS背景属性&#xff0c;可以给页面元素添加背景样式。 背景属性可以设置背景颜色、背景图片、背景平铺、背景图片位置、背景图像固定等。 3.1背景颜色 background-color属性定义了元素的背景颜色 background-color:颜色值;一般情况下元素背景颜色默认值是transparent(透…

【实战】 React 与 Hook 应用:实现项目列表 —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(二)

文章目录 一、项目起航&#xff1a;项目初始化与配置二、React 与 Hook 应用&#xff1a;实现项目列表1.新建文件2.状态提升3.新建utils4.Custom Hook 学习内容来源&#xff1a;React React Hook TS 最佳实践-慕课网 相对原教程&#xff0c;我在学习开始时&#xff08;2023.0…

记录好项目D8

记录好项目 你好呀&#xff0c;这里是我专门记录一下从某些地方收集起来的项目&#xff0c;对项目修改&#xff0c;进行添砖加瓦&#xff0c;变成自己的闪亮项目。修修补补也可以成为毕设哦 本次的项目是超市管理系统 技术栈&#xff1a;springbootjavamysqlthyemleafshiro …

数据安全--24--数据安全管理之API管理

本博客地址&#xff1a;https://security.blog.csdn.net/article/details/131274853 一、API管理概述 API是指应用程序编程接口&#xff0c;它的存在主要是为了提高系统各组成单元的内聚性&#xff0c;降低组成单元之间的耦合程度&#xff08;相互依赖程度&#xff09;&#…

[元带你学: eMMC协议详解 18] eMMC的后台操作(Background Operations)

依JEDEC eMMC 5.1及经验辛苦整理&#xff0c;付费内容&#xff0c;禁止转载。 所在专栏 《元带你学: eMMC协议详解》 内容摘要 全文 1800 字&#xff0c; 主要内容 1、后台操作/前台操作区别&#xff1f; 2、如何进行手动后台操作&#xff1f; 3、自动后台启动和停止方法&a…

【Redis基础】

Redis基础 Redis基础Note Redis基础1.初识Redis1.1.认识NoSQL1.1.1.结构化与非结构化1.1.2.关联和非关联1.1.3.查询方式1.1.4.事务1.1.5.总结 1.2.认识Redis1.3.安装Redis1.3.1.依赖库1.3.2.上传安装包并解压1.3.3.启动1.3.4.默认启动1.3.5.指定配置启动1.3.6.开机自启1.3.7.wi…

web安全自学笔记

Web 安全方面的基本知识是有很必要的&#xff0c;未必就要深入理解。本文主要介绍常见的网络攻击类型&#xff0c;不作深入探讨。 正文 网络攻击的形式种类繁多&#xff0c;从简单的网站敏感文件扫描、弱口令暴力破解&#xff0c;到 SQL 注入&#xff0c;再到复杂的网络劫持等…

基于Web的影院信息管理系统设计与实现(论文+源码)_kaic

摘要 随着文化产业的发展&#xff0c;电影行业迎来了发展的黄金期&#xff0c;而且人民生活水平的 不断提高&#xff0c;观众对影院的服务要求也越来越高。传统的服务模式&#xff0c;已经不能满足 观众的需求&#xff0c;随着信息技术的发展&#xff0c;越来越多的影院将信息技…

Qt 中动态加载窗口

在编程中&#xff0c;我经常会遇见要根据用户触发按钮&#xff0c;动态生成窗口的情况。在此有两种方法可以动态生成窗口&#xff1a;一&#xff1a;直接在槽函数中调用窗口类。二&#xff1a;将 **.ui 添加到资源文件&#xff0c;通过 QUiLoader 加载。 现将两种方法介绍如下…

LAMPDISCUZ论坛

目录 1.1 LAMP 1.2 LAMP架构搭建 2. 关闭防火墙&#xff0c;将安装Apache所需软件包传到/opt目录下 APache的源码编译安装涉及到的软件包&#xff1a; 2.2 安装环境依赖包 2.3 配置软件模块 2.4 添加httpd系统服务 2.5 修改httpd 服务配置文件 3.编译安装mysqld 服务 3.1 …

1. CSS的三大特性

CSS有三个非常重要的三个特性&#xff1a;层叠性、继承性、优先级 1.1层叠性 相同选择器给设置相同的样式&#xff0c;此时一个样式就会覆盖(层叠)另一个冲突的样式。层叠性主要解决样式冲突 的问题 层叠性原则: ●样式冲突,遵循的原则是就近原则,哪个样式离结构近,就执行哪个…