通过Linux串口实现树莓派与电脑通信
目录
一 串口说明
二 USB—TTL模块
● usb-ttl模块接口
三 串口通信常用的API
四 修改串口的配置文件
五 串口通信代码验证
● 发送一个字符/字符串到串口
● 树莓读取串口数据(字符)
● 代码拓展(双方)
一 串口说明
我在基于全志H6实现Linux串口通信这篇文章中也有详解介绍:点击查看详细内容
① 串口通信经常使用在多机通信中。不管是软件还是硬件,都存在模块化的编程思想。
● 半双工:A传数据给B,B只接收数据,什么也不能做;
● 全双工:A传数据给B的同时,B也能给A传输数据;
② 实现串口多机通信的协议设置:串口号,数据格式和波特率。
● 串口号:CH340软件来接收或生成串口号;
● 波特率:好比人的语速,常用的115200,9600;
● 数据格式:可以比作人交流的语种。数据位;奇偶校验位;停止位。
类似于人和人在交流沟通时,都必须使用同一种语言和语速,这样通信双方才能明白对方的内容。
二 USB—TTL模块
作用:将通信双方识别的电平转换为通信电平。
● 我们常用的单片机,引出来的串口,如果不加其他的接口电路,出来的信号就是TTL电平;
● 如果需要看串口的打印信息,一般是需要接一个上位机的,常规的就是电脑,而现在的电脑一般的通信接口只有USB;
● 对于USB口而言,是没法和TTL串口直接通信的,因为接口不匹配,电平也不匹配,这时候就需要借助其它设备来实现接口与电平的转换;
● 常规操作是使用CH340这种芯片所制作的USB转串口模块,这个模块就可以实现TTL串口和USB之前的转换。
● usb-ttl模块接口
● RXD :数据输入引脚,数据接收;
● TXD :数据发送引脚,数据发送;
接线说明:如图
在树莓派接入USB-TTL模块时,除了交叉连接RXD和TXD两端,最好在接入GND,保持电平的稳定。
三 串口通信常用的API
头文件:#include <wiringSerial.h>
① int serialOpen (char *device, int baud)
作用:打开并初始化串口
● device:串口的地址,在Linux中就是设备所在的目录。默认一般是"/dev/ttyAMA0"。
● baud:波特率,
● 返回值:正常返回文件描述符fd,否则返回-1失败。
② void serialClose (int fd)
作用:关闭fd关联的串口
● fd:文件描述符
③ void serialPutchar (int fd, unsigned char c)
作用:发送一个字节的数据到串口
● fd:文件描述符
● c:要发送的字符数据
④ void serialPuts (int fd, char *s)
作用:发送一个字符串到串口
● fd:文件描述符
● s:发送的字符串,字符串要以'\0'结尾
⑤ int serialDataAvail (int fd)
作用:获取串口缓存中可用的字节数。
● fd:文件描述符
● 返回:串口缓存中已经接收的,可读取的字节数,-1代表错误
⑥ int serialGetchar (int fd)
作用:从串口读取一个字节数据返回。
说明:如果串口缓存中没有可用的数据,则会等待10秒,如果10后还有没,返回-1。所以,在读取前,做好通过serialDataAvail判断下。
● fd:文件描述符
● 返回值:读取到的字符
四 修改串口的配置文件
在使用串口通信之前,一定要修改相关配置文件,不然容易出错。
① cd /boot/ :进入系统根目录中的boot目录;
② sudo vim cmdline.tx :用超级用户权限打开cmdline.tx文件,内容如图:
③ 删除圈中的部分,保存退出;
④ sudo reboot重启即可
五 串口通信代码验证
● 发送一个字符/字符串到串口
#include <stdio.h>
#include <wiringSerial.h>//串口头文件
#include <wiringPi.h>int main()
{int fd; //文件描述符if(wiringPiSetup() == -1){ //初始化库printf("init wiringPi error!\n");return -1;}fd = serialOpen("/dev/ttyAMA0",115200);//初始/打开/创建串口,并设置波特率while(1){// serialPutchar(fd,'a'); //发送一个字符serialPuts(fd,"hello pi!\r\n"); //发送一个字符串到串口,\r\n串口中换行delayMicroseconds(1000000); //延时设置1000000us = 1s,每隔1s就发送}return 0;
}
● 树莓读取串口数据(字符)
#include <stdio.h>
#include <wiringPi.h>
#include <wiringSerial.h>int main()
{int fd;int cmd;if(wiringPiSetup() == -1){printf("init wiringPi error!\n");return -1;}fd = serialOpen("/dev/ttyAMA0",115200);while(serialDataAvail(fd) != -1){ //初始化serialDataAvail()函数cmd = serialGetchar(fd); //cmd接收该函数的返回值,一个字符printf("get data:%c\n",cmd);}serialClose(fd);//退出return 0;
}
● 代码拓展(双方)
#include <stdio.h>
#include <wiringPi.h>
#include <wiringSerial.h>int main()
{int fd;int cmd;if(wiringPiSetup() == -1){printf("init wiringPi error!\n");return -1;}fd = serialOpen("/dev/ttyAMA0",115200);while(serialDataAvail(fd) != -1){ //初始化serialDataAvail()函数cmd = serialGetchar(fd); //cmd接收该函数的返回值,一个字符printf("get data:%c\n",cmd);if(cmd == '2'){serialPuts(fd,"hello 2\r\n");//串口中换行\r\n结合使用}if(cmd == '3'){ //树莓收到字符3时,就发送hello 3这个字符串到串口serialPuts(fd,"hello 3\r\n");}if(cmd == '4'){serialPuts(fd,"hello 4\r\n");}}serialClose(fd);//退出return 0;
}
相关文章:

通过Linux串口实现树莓派与电脑通信
目录 一 串口说明 二 USB—TTL模块 ● usb-ttl模块接口 三 串口通信常用的API 四 修改串口的配置文件 五 串口通信代码验证 ● 发送一个字符/字符串到串口 ● 树莓读取串口数据(字符) ● 代码拓展(双方) 一 串口…...
全球变暖 蓝桥杯 178
题目描述你有一张某海域 NxN 像素的照片,"."表示海洋、"#"表示陆地,如下所示:........##.....##........##...####....###........其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有 2 座…...

Java现在好找工作吗?
Java到2023年已经28岁了,可能你会怀疑它是否还一如当年一样的强大,在应用层领域独占鳌头。但是基于Java庞大的市场占有率和需求,它依然在保持着更新迭代,依然是最常用的底层开发语言,基于其安全性、开放性、稳定性和跨…...

Flink 第1章 基础介绍和特性
一 Flink概念 1.1 Flink的概念 Flink是一个框架和分布式处理引擎,用于对无界和有解数据流进行状态计算。如下图所示: 1.2 Flink的应用场景 1.3 Flink的目标 1.高吞吐量 2.低延迟 3,结果的准确性和良好的容错性。 1.4 Flink与spark的区别…...

docker 安装 nginx无坑版
一. 拉取镜像 docker pull nginx二. 创建挂载目录 mkdir -p /usr/local/nginx/conf mkdir -p /usr/local/nginx/log mkdir -p /usr/local/nginx/html三. 从nginx容器里复制nginx的配置文件到主机里 创建个容器 docker run --name nginx -p 80:80 -d nginx将容器内的配置文件…...

自己动手做chatGPT:向量的概念和相关操作
chatGPT的横空出世给人工智能注入一针强心剂,它是历史上以最短时间达到一亿用户的应用。chatGPT的能力相当惊人,它可以用相当流利的语言和人对话,同时能够对用户提出的问题给出相当顺畅的答案。它的出现已经给各个行业带来不小冲击࿰…...

【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(7)
目录 写在前面: 题目:P1596 [USACO10OCT]Lake Counting S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述: 输入格式: 输出格式: 输入样例: 输出样例: 解题思路: …...

Python嵌套函数(Nested function)和闭包(closure)
Python嵌套函数(Nested function)和闭包(closure) 闭包(closure)是建立在嵌套函数基础上的,是一种特殊的嵌套函数结构。 先看嵌套函数(Nested function)。 Python允许…...

【实战】React 必会第三方插件 —— Cron 表达式生成器(qnn-react-cron)
文章目录一、引子二、配置使用1.安装2.使用(1)直接调用(2)赋值到表单(Form)(3)自定义功能按钮(4)隐藏指定 Tab(5)其他三、常见问题及解…...

C# 教你如何终止Task线程
我们在多线程中通常使用一个bool IsExit类似的代码来控制是否线程的运行与终止,其实使用CancellationTokenSource来进行控制更为好用,下面我们将介绍CancellationTokenSource相关用法。C# 使用 CancellationTokenSource 终止线程使用CancellationTokenSo…...

整合SpringCache
整合SpringCache 1、引入依赖cache还有redis <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId> </dependency>2、写配置 spring:cache:type: redis3、测试使用缓存 Cache…...

05 - 环境变量编程
---- 整理自狄泰软件唐佐林老师课程 查看所有文章链接:(更新中)Linux系统编程训练营 - 目录 文章目录1. 初识环境变量1.1 问题1.2 main函数(默认进程入口)1.3 什么是环境变量?1.4 环境表的构成1.5 思考2. 深…...

vue3后台管理系统
后面可参考下:vue系列(三)——手把手教你搭建一个vue3管理后台基础模板 以下代码项目gitee地址 文章目录1. 初始化前端项目初始化项目添加加载效果配置 vite.config.js2. 使用路由安装路由配置路由配置别名和跳转安装pathvite.config.jsjsco…...
掷骰子式的乐趣:探究C语言生成随机数的奥秘
掷骰子式的乐趣:探究C语言生成随机数的奥秘一、引言二、C标准库的rand函数三、srand函数的使用四、基于时间的种子生成五、高质量随机数的应用一、引言 C语言中生成随机数是一项非常重要的功能,因为许多现代应用程序需要使用随机数。随机数可以用于密码…...

一线大厂软件测试常见面试题1500问,背完直接拿捏面试官,
三、测试理论 3.1 你们原来项目的测试流程是怎么样的? 我们的测试流程主要有三个阶段:需求了解分析、测试准备、测试执行。 1、需求了解分析阶段 我们的SE会把需求文档给我们自己先去了解一到两天这样,之后我们会有一个需求澄清会议, 我…...
小迪安全day12WEB漏洞-SQL注入之简要SQL注入
小迪安全day12WEB漏洞-SQL注入之简要SQL注入 注入产生原理详细分析 可控变量带入数据库查询变量未存在过滤或过滤不严谨 连接符区分 and是sql语句连接符,&是uel参数连接符 and 11是注入语句, &是添加一个新变量 数据库内容 数据库A 网站…...

自动化测试学习(七)-正则表达式,你真的会用吗?
目录 一、正则表达式在python中如何使用 二、用正则表达式匹配更多模式 三、常用字符分类的缩写代码 总结 所谓正则表达式(regex),就是一种模式匹配,学会用正则匹配,就可以达到事半功倍的效果。 一、正则表达式在…...
验证码——vue中后端返回的图片流如何显示
目录 前言 一、p调用接口获取验证码 canvas画布渲染? 二、后端返回图片(图片流),前端显示 1.blob 2.arraybuffer 总结 前言 登录界面经常会有验证码,验证码的实现方式也有很多,我目前做过以下两种&…...

聚观早报 | 拼多多驳斥Google的指控;80%美国人工作将被AI影响
今日要闻:拼多多驳斥Google“恶意软件”的指控;80%美国人工作将被AI影响;iPhone 15 Pro设计图上热搜;贾扬清离职阿里投身AI大模型创业;OPPO Find X6 系列发布拼多多驳斥Google“恶意软件”的指控 3 月 21 日࿰…...
define,typedef,inline 的区别
define 1.用于在代码中创建宏定义,将一个标识符替换为一个表达式或语句。例如: #define PI 3.14159 #define SQUARE(x) ((x) * (x))这样,程序中所有出现的 PI 都将被替换为 3.14159,SQUARE(x) 则被替换成了 (x) * (x)。 使用 #…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...

C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...