【无标题】树莓派 4B 多串口配置

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
 

enable_uart=1

在终端中运行以下命令可以确认驱动是否已经加载:

ls -l /dev/ttyAMA0
1
能看到下面的输出就代表驱动是正常的

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


确保你的用户被添加到 dialout 组中,以便具有串口访问权限。运行以下命令将当前用户添加到 dialout 组:

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

2. 其他串口配置
2.1 展示所有串口命令
输出下面的命令可以看到所有的串口

dtoverlay -a | grep uart
1


2.2 查看特定串口信息
使用下面的命令会展示串口的配置信息

dtoverlay -h uart3
1


2.3 配置开启串口 UART2-5
在/boot/config.txt的末尾添加如下的代码,保存重启树莓派

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

查看是否生效

ls /dev/ttyAMA*
1
结果如下图

到这里就打开了所有的串口了

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
 

GPIO14 = TXD0 -> ttyAMA0
GPIO0  = TXD2 -> ttyAMA1
GPIO4  = TXD3 -> ttyAMA2
GPIO8  = TXD4 -> ttyAMA3
GPIO12 = TXD5 -> ttyAMA4GPIO15 = 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 serialser1 = 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)
1
2
然后编写如下的程序

import serialser2 = 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 模块,电脑发送数据过来
ttyAMA1 和 ttyAMA4 连接
ttyAMA2 和 ttyAMA3 连接
对应的连接图可以参考上面的GPIO对照着连线
代码如下

import serial
import time
import threading
import sys
READ = 1
READTIME = 600ser0 = 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 READwhile(READ):ser1.write(b'I am ser1')def WriteSer2():global READwhile(READ):ser2.write(b'I am ser2')def WriteSer3():global READwhile(READ):ser3.write(b'I am ser3')def WriteSer4():global READwhile(READ):ser4.write(b'I am ser4')def ReadSer0():ser0.write(bytearray([0xaa,0x0a]))global READdata0 = 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 READdata1 = 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 READdata2 = 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 READdata3 = 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 READdata4 = 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 READdataUSB0 = 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 READdataUSB1 = 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 READtimeStart = 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 = Falseprint('test time'+str(time.time()-timeStart))sys.exit()if __name__ == '__main__':start()


    



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

htop

htop


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

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

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

相关文章

散点图,何须图,折线图混放在一个echarts

散点图,何须图,折线图混放在一个echarts option {tooltip: {trigger: axis,axisPointer: {type: cross,crossStyle: {color: #999}}},legend: {data:[盒须图1,盒须图2,折线图,散点图]},xAxis: [{type: category,data: [周一,周二,周三,周四,周五,周六…

【Linux】tmux简单使用

它允许你在一个终端窗口中创建多个终端会话,并在它们之间进行切换。以下是tmux的一些主要用途和功能: 多窗口: Tmux允许你在一个终端中创建多个窗口。每个窗口可以包含一个或多个终端会话,你可以轻松地在这些窗口之间切换。面板分…

学习数据结构第一步(必看)——初识集合框架

一,学习数据结构前置知识 目录 一,学习数据结构前置知识 二,什么是数据结构? 1.什么是数据结构? 2.容器背后对应的数据结构 3.相关Java知识 4.什么是算法? 三,什么是集合? …

【lombok】从easyExcel read不到值到cglib @Accessors(chain = true)隐藏的大坑

背景: 在一次使用easyExcel.read 读取excel时,发现实体类字段没有值,在反复测试后,发现去掉Accessors(chain true)就正常了,为了验证原因,进行了一次代码跟踪 由于调用链路特别长,只列举出部分代码&#x…

Halcon参考手册语义分割和边缘提取知识总结

1.1 语义分割和边缘提取介绍 通过语义分割,我们使用深度学习(DL)网络将输入图像的每个像素分配给一个类。 图(1)语义分割示例 在图(1)中,输入图像的每个像素都被分配给一个类,但是苹果的三个不同实例和橘子的两个不同实例都不是可区分的对象…

Canal实时同步MySQL数据到ES

一、canal简介 canal主要用途是对MySQL数据库增量日志进行解析,提供增量数据的订阅和消费,简单说就是可以对MySQL的增量数据进行实时同步,支持同步到MySQL、Elasticsearch、HBase等数据存储中去。 早期阿里巴巴因为杭州和美国双机房部署&…

typescript个人学习笔记

https://ts.xcatliu.com/basics/primitive-data-types.html 深受启发 1.剑谱第一页,初始化ts outDir表示把ts编译成js文件,文件编译后存放的位置 2.类型声明 undefined可以赋值给其他类型

企业电子招投标采购系统源码之鸿鹄电子招投标系统+电子招投标的组成

鸿鹄招投标系统的功能描述 1、门户管理:用户可通过门户页面查看所有公告信息及相关通知信息,包括招标公告、非招标公告、系统通知和政策法规等板块。 2、立项管理:企业用户可以对需要采购的项目进行立项申请,并提交审批&#xff0…

【Cisco Packet Tracer】路由器实验 静态路由/RIP/OSPF/BGP

本教程讲解路由器的静态IP配置、RIP、OSPF、BGP等实验内容。 一、基本设置 绘制以下拓扑结构: PC0设置: PC1设置: Router0端口0设置: Router0端口1设置: Router1端口0设置: Router1端口1设置&#xff1a…

LAMP安装部署网站

目录 什么是LAMP? 实验(搭建一个论坛) 一,安装apache 1.关闭防火墙,将安装Apache所需软件包传到/opt目录下 2.安装环境依赖包 3.配置软件模块 4.编译及安装 5.优化配置文件路径,并把httpd服务的可执行程序文件…

跨国企业在跨境数据传输时需要注意的几点

对于跨国企业而言,跨境数据传输是一个极为关键的组成部分。这不仅涉及到数据的安全性、合规性和效率,还直接关系到企业的竞争力和未来发展前景。因此,在进行跨境数据传输时,企业需要特别关注以下几个关键点,并采取相应…

Geotrust中的dv ssl证书

DV SSL数字证书是入门级的数字证书,Geotrust的子品牌RapidSSL旗下的SSL数字证书产品都是入门级的SSL数字证书——DV基础型单域名SSL证书和DV基础型通配符SSL证书。今天就随SSL盾小编了解Geotrust旗下的DV SSL证书。 1.Geotrust旗下的DV基础型单域名SSL证书能够保护…

浪涌Surge整改的意义与分析?|深圳比创达电子EMC

浪涌Surge是指电器开关或突变引起的短暂电流过高的现象。当电器设备在开关、中断或突变的瞬间,电流会剧烈变化,造成电压的瞬时上升,这就是浪涌Surge。 在日常生活中,浪涌Surge可能会导致电器设备的损坏,或者对人身安全…

【Proteus仿真】【STM32单片机】定时智能插座开关

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器,使LCD1602液晶,DS18B20温度传感器、按键、蜂鸣器、继电器开关、HC05蓝牙模块等。 主要功能: 系统运行后,LCD1602…

js 生成分享码或分享口令

代码 function getShareToken(length) {var characters ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789;var shareToken ;for (var i 0; i < length; i) {var randomIndex Math.floor(Math.random() * characters.length);var randomChar character…

python实战演练之迎接冬至的第一场雪

写在前面 WINTER IS COMING Python实现大雪纷飞的效果&#xff0c;完整代码在文末哦~ 准备开始 WINTER IS COMING Python是一种高级编程语言&#xff0c;Turtle是Python的一个图形化模块&#xff0c;它可以帮助学习者更好地理解编程概念&#xff0c;同时可以进行图形化编程。 …

YOLOv8改进实验:一文了解YOLOv8如何打印FPS指标

💡该教程为改进YOLOv8指南,属于《芒果书》📚系列,包含大量的原创首发改进方式🚀 💡🚀🚀🚀本博客内含改进源代码,按步骤操作运行改进后的代码即可 💡更方便的统计更多实验数据,方便写作 新增YOLOv8打印FPS指标 完善(一键YOLOv8打印FPS指标) 文章目录 完善…

【(较大规模)作业车间调度JSP】通过OR-Tools的区间变量建模求解的效率对比实验

文章目录 问题描述Python调用OR-Tools建模求解&#xff08;实验一&#xff09;1. 声明问题的模型2. 创建区间变量3. 创建约束条件4. 求解模型5. 基于 plotly 展示甘特图 不同场景下的求解效率对比实验二&#xff1a;工件的工序数有差异实验三&#xff1a;消除工件的加工时长差异…

节日气氛拉满的毛衣~你喜欢吗?

节日氛围感毛衣一眼就心动采用北极绒面料厚实软糯有质感拼接彩点正是氛围感的来源 整件穿上超级显白显气质 随便搭件牛仔裤还是休闲裤 来穿都很亮眼&#xff01;&#xff01;

Nginx首页修改及使用Nginx实现端口转发

按照我之前博客给的方法搭建好这样一个CTF靶场 但是呢它默认是在8000端口 如何直接访问IP地址或者域名就可以实现直接访问到靶场呢 我们需要将80端口的内容转发到8000&#xff0c;使用nginx实现端口转发功能 首先我们安装nginx&#xff1a; 安装工具和库 yum -y install gc…