树莓派多串口通信

树莓派多串口通信

  • 串口配置
  • 串口通信函数分析
  • 串口通信示例代码

  • 参考博文1:树莓派 4 UART 多串口配置通信
  • 参考博文2:树莓派wiringPi库详解
  • 关于树莓派相关其他环境配置可参考:快速上手树莓派
  • 关于wiringPi库初始化与IO口开发可参考:树莓派外设开发-GPIO口

考虑到SSH网络时常出现小问题,因此本人将树莓派串口1(ttyAMA0)主要用于树莓派串口登陆备份,本文主要对串口2-串口5进行配置开发,同时也会涉及对串口1通信的配置。

串口配置

配置开启串口 UART2-5
执行编辑 config.txt 命令:

sudo nano /boot/config.txt

在文件结尾添加如下:

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

保存(Ctrl + o)并退出(Ctrl + x)

重启(sudo reboot)后查看是否生效:

ls /dev/ttyAMA*

结果显示如下:

pi@raspberrypi:~ $ ls /dev/ttyAMA*
/dev/ttyAMA0  /dev/ttyAMA1  /dev/ttyAMA2  /dev/ttyAMA3  /dev/ttyAMA4

各 UART 串口与 GPIO 对应关系:
这里的GPIO对应的是BCM码,不是wPi码

GPIO14 = TXD0 -> ttyAMA0
GPIO15 = RXD0 -> ttyAMA0GPIO0  = TXD2 -> ttyAMA1
GPIO1  = RXD2 -> ttyAMA1GPIO4  = TXD3 -> ttyAMA2
GPIO5  = RXD3 -> ttyAMA2GPIO8  = TXD4 -> ttyAMA3
GPIO9  = RXD4 -> ttyAMA3GPIO12 = TXD5 -> ttyAMA4
GPIO13 = RXD5 -> ttyAMA4

查看树莓派GPIO引脚编号:gpio readall
注意:查看时,将树莓派的USB接口面对自己,别反了😂
在这里插入图片描述

串口通信函数分析

使用时需要包含头文件:#include <wiringSerial.h>
打开串口

int serialOpen (char *device, int baud)
device : 串口的地址,在Linux中就是设备所在的目录。默认一般是`"/dev/ttyAMA1"`这种, 我的是这样的。
baud   : 波特率 通常为 `9600` 
返回    : 成功返回文件描述符,失败返回-1

获取串口缓存中字节数

int serialDataAvail (int fd)
fd  : 文件描述符
返回 : 串口缓存中已经接收的,可读取的字节数,-1代表错误

发送一个字节

void  serialPutchar (int fd, unsigned char c)	
fd: 文件描述符
c : 要发送的字符数据

读取一个字节

int serialGetchar (int fd)	
fd  : 文件描述符
返回 : 读取到的字符

从串口读取一个字节数据返回,如果串口缓存中没有可用的数据,则会等待10秒,如果10后还有没,返回-1
所以,在读取前,最好需要通过serialDataAvail判断是否有数据

发送字符串

#include <unistd.h>
size_t write (int fd,const void * buf,size_t count)
fd    : 文件描述符
buf   : 需要发送的数据缓存数组
count : 发送buf中的前count个字节数据
返回   : 实际写入的字符数,错误返回-1

接收字符串

#include <unistd.h>
*size_t read(int fd,void * buf ,size_t count);	
fd    : 文件描述符
buf   : 接收的数据缓存的数组
count : 接收的字节数.
返回  : 实际读取的字符数。	

当要接收的数据量过大时,wiringPi建议使用write和read函数。
接收到的buf可通过strstr和strchar来判断是否存在子串和特定字符,或者使用switch扫描不同情况。

串口通信示例代码

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <wiringSerial.h>
#include <wiringPi.h>
#include "pthread.h"
#include <stdlib.h>int fd;void *write_thread(void *datas)
{char send_buf[]="hello world";char cmd;while(1){printf("pthread1:按任意键发送数据\n");scanf("%c",&cmd);write(fd, send_buf, strlen(send_buf));  //测试发送数据}
}void *read_thread(void *datas)
{int nread;char msg[128]={'\0'};printf("pthread2:listing......\n");while(1){while(serialDataAvail(fd)!=-1 ) //串口有数据{nread=read(fd, msg,128);    //读取并保存数据if(nread==0)continue;printf("get data:%d Byte context:%s\n",nread,msg);printf("pthread2:listing......\n");memset(msg,0,strlen(msg));}}
}int main()
{pthread_t writeThread;pthread_t readThread;if(-1==wiringPiSetup()){printf("setup error\n");exit(-1);}//请开启实验对应的串口即可, 若同时用到多个串口,注意变量命名//fd = serialOpen("/dev/ttyAMA1",9600); //打开ttyAMA1//fd = serialOpen("/dev/ttyAMA2",9600); //打开ttyAMA2//fd = serialOpen("/dev/ttyAMA3",9600); //打开ttyAMA3fd = serialOpen("/dev/ttyAMA4",9600);   //打开ttyAMA4pthread_create(&writeThread,NULL, write_thread,NULL);   //创建串口发送线程pthread_create(&readThread, NULL, read_thread, NULL);   //创建串口接收线程pthread_join(writeThread,NULL);pthread_join(readThread, NULL);return 0;
}

程序运行结果如下所示,串口收发自如
在这里插入图片描述

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

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

相关文章

调优--学习笔记

1&#xff0c;Presto调优 数据存储格式 1&#xff09;合理设置分区 与Hive类似&#xff0c;Presto会根据元信息读取分区数据&#xff0c;合理的分区能减少Presto数据读取量&#xff0c;提升查询性能。 2&#xff09;使用列式存储 Presto对ORC文件读取做了特定优化&#xff0c…

Qt OpenCV 学习(一):环境搭建

对应版本 Qt 5.15.2OpenCV 3.4.9MinGW 8.1.0 32-bit 1. OpenCV 下载 确保安装 Qt 时勾选了 MinGW 编译器 本文使用 MinGW 编译好的 OpenCV 库&#xff0c;无需自行编译 确保下载的 MinGW 和上述安装 Qt 时勾选的 MinGW 编译器位数一致&#xff0c;此处均为 x86/32-bit下载地址…

《微信小程序开发从入门到实战》学习四十

4.2 云开发JSON数据库 4.2.11 更新数据 使用数据库API更新数据有两种方法&#xff1a;一.将记录局部更新的update方法&#xff1b;二.以替换的方式更新记录的set方法 update方法可以局部更新一个记录或一个集合的多个记录&#xff0c;更新时只有指定字段更新&#xff0c;其他…

智能诊疗体验:整合AI技术的互联网医院小程序开发

在科技化的趋势下&#xff0c;互联网医院小程序的开发变得愈发重要&#xff0c;尤其是通过整合人工智能&#xff08;AI&#xff09;技术&#xff0c;进一步提升了就医的效率。 一、引言 互联网医院小程序其开发目标是提高医疗服务的效率&#xff0c;同时也也提升了用户的就医…

23种设计模式之C++实践(一)

23种设计模式之C++实践 1. 简介2. 基础知识3. 设计模式(一)创建型模式1. 单例模式——确保对象的唯一性1.2 饿汉式单例模式1.3 懒汉式单例模式比较IoDH单例模式总结2. 简单工厂模式——集中式工厂的实现简单工厂模式总结3. 工厂方法模式——多态工厂的实现工厂方法模式总结4.…

【像素画板】游戏地图编辑器-uniapp项目开发流程详解

嘿&#xff0c;用过像素画板没有哦&#xff0c;相信喜欢绘画的小朋友会对它感兴趣呢&#xff0c;用来绘制像素画非常好看&#xff0c;有没有发现&#xff0c;它是可以用来绘制游戏地图的&#xff0c;是不是很好奇&#xff0c;来一起看看吧。 像素画板&#xff0c;也叫像素画的绘…

c语言-归并排序

目录 1、归并排序基本思想 2、归并排序的实现&#xff08;递归法&#xff09; 2.1 代码实现递归法归并排序 3、归并排序的实现&#xff08;非递归法&#xff09; 3.1 修正边界问题 3.2 代码实现非递归法归并排序 结语&#xff1a; 前言&#xff1a; 归并排序是一种把数…

Python---格式化输出与%百分号----涉及转义符 \ 反斜杠的使用

相关链接Python--格式化输出中的转义符号----\t 制表符&#xff08;空格的&#xff09;和\n&#xff08;换行的&#xff09;_唯元素的博客-CSDN博客 Python---字符串&#xff08;用单、双引号、 三单/双引号定义。反斜杠 \ 转义&#xff0c;单在双内/双在单内 &#xff09;-CS…

力扣 --- 最后一个单词的长度

题目描述&#xff1a; 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1&#xff1a; 输入&#xff1a;s "Hello World&…

运维02:Linux

Linux安装 VMWare安装&#xff1a;夸克网盘分享&#xff08;提取码&#xff1a;refg&#xff09; CentOS安装&#xff1a;Index of /centos/7.9.2009/isos/x86_64/ Xshell安装&#xff1a;百度网盘 请输入提取码&#xff08;提取码&#xff1a;juau&#xff09; 环境准备 1、…

在Windows 11中,把iPhone照片和视频导出来又快又简单,无需第三方软件

如果你想将照片和视频从iPhone传输到Windows 11 PC&#xff0c;最快、最简单的方法是插入手机并执行自动导入。以下是操作方法。 如何将照片和视频从iPhone导入Windows 如果你用USB数据线将iPhone插入Windows PC&#xff0c;Windows 11可以像标准数码相机一样连接到它&#x…

react之封装有无Token(路由权限控制)的高阶组件

TOC 前景 有些路由页面内的内容信息比较敏感&#xff0c;如果用户没有经过登录获取到有效Token&#xff0c;是没有权限跳转的&#xff0c;根据Token的有 无控制当前路由是否可以跳转就是路由的权限控制 技术方案 实现步骤 1.在 components 目录中&#xff0c;创建 AuthRoute/in…

solidity实现ERC721代币标准发布NFT

文章目录 1、非同质化货币&#xff08;NFT&#xff09;- 维基百科2、IERC1653、IERC7214、IERC721Receiver5、IERC721Metadata6、ERC7217、ERC721 NFT 的实现8、编译部署 1、非同质化货币&#xff08;NFT&#xff09;- 维基百科 非同质化代币&#xff08;英语&#xff1a;Non-F…

Elasticsearch:什么是大语言模型(LLM)?

大语言模型定义 大语言模型 (LLM) 是一种深度学习算法&#xff0c;可以执行各种自然语言处理 (natural language processing - NLP) 任务。 大型语言模型使用 Transformer 模型&#xff0c;并使用大量数据集进行训练 —— 因此规模很大。 这使他们能够识别、翻译、预测或生成文…

时间复杂度为O (nlogn)的排序算法

归并排序 归并排序遵循分治的思想&#xff1a;将原问题分解为几个规模较小但类似于原问题的子问题&#xff0c;递归地求解这些子问题&#xff0c;然后合并这些子问题的解来建立原问题的解&#xff0c;归并排序的步骤如下&#xff1a; 划分&#xff1a;分解待排序的 n 个元素的…

【c】求一组数据的最大值和第二大的值

我们可以创建数组&#xff0c;利用冒泡排序法把数组进行排序&#xff0c;但是当元素过多时候循环可能过多导致循环超限 所以我们可以换种其他方法&#xff0c;代码附上 #include<stdio.h> int main() {int n,i;puts("输入这组数据的个数");scanf("%d&qu…

进行主从复制时出现的异常FATAL CONFIG FILE ERROR (Redis 6.2.6)Reading the configuration file

错误如下所示&#xff1a; FATAL CONFIG FILE ERROR (Redis 6.2.6) Reading the configuration file, at line 1 >>> include/myredis/redis.conf Bad directive or wrong number of arguments出现错误的原因是.conf文件中命令之间缺少空格&#xff0c;如下所示&…

QML中常见布局方法

目录 引言常见方法锚定&#xff08;anchors&#xff09;定位器Row、ColumnGridFlow 布局管理器RowLayout、ColumnLayoutGridLayoutStackLayout 总结 引言 UI界面由诸多元素构成&#xff0c;如Label、Button、Input等等&#xff0c;各种元素需要按照一定规律进行排布才能提高界…

Prime 2.0

信息收集 # Nmap 7.94 scan initiated Thu Nov 23 20:09:06 2023 as: nmap -sn -oN live.nmap 192.168.182.0/24 Nmap scan report for 192.168.182.1 Host is up (0.00018s latency). MAC Address: 00:50:56:C0:00:08 (VMware) Nmap scan report for 192.168.182.2 Host is u…

长度最小的子数组(Java详解)

目录 题目描述 题解 思路分析 暴力枚举代码 滑动窗口代码 题目描述 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条…