Arduino| 串口通讯、入门示例

Arduino串口通讯

  • 为什么要做串口通讯
  • 串口通讯原理
  • 串口通讯函数
  • 字符串常用函数
  • 串口通讯示例
    • 入门示例
    • 测试串口通讯
    • 复杂指令处理

为什么要做串口通讯

串口通讯:串口通信是用来在不同电子设备之间交换数据用的技术,其实就是要实现不同电子设备之间的“通讯对话”。

串口给通讯应用例子:刚拿到Arduino进行Blink测试,程序通过引脚控制了小灯亮起,但是如果我们想要改变当前小灯的亮度,想要把这个“想法”传递给Arduino的时候,就需要串口通讯了。可以通过串口通讯,从PC端告诉Arduino程序我们想要改变当前小灯的亮度。

串口:Arduino和其它设备通信的接口。

串口通讯原理

Arduino通讯串口:Arduino的串口通常称为UART或USART,通过0(RX)和1(TX)引脚以及USB 端口,来和其它设备进行通信。

UART(Universal Asynchronous Receiver/Transmitter):UART是通用异步收发器,采用异步串行通信协议,通过信号线把需要发送的数据以二进制的形式发出,高电平为数据“1”,低电平为数据“0”。

通信传输线:串口通常会有三根线来完成通讯,分别是地线、发送线、接收线。串口通信是异步的,能够在一根线上发送数据同时在另一根线上接收数据,其他线用于握手。

数据帧:Arduino用Serial.print和Serial.println函数发送数据时候,其实是发出一连串数字信号,这些数字信号称为数据帧。数据帧通常由四个部分组成,分别是起始位、数据位、校验位和停止位。

  • 起始位:数据帧开始传输的信号,通常起始位电平为低电平。
  • 数据位:包含了实际发送的数据,Arduino默认使用8位数据,每次可以传输1B数据。
  • 校验位:数据检错的方式,可以设置为奇校验和偶校验,Arduino默认无校验位。
  • 停止位:表示该段数据帧传输结束,通常停止位都是高电平。

串口通讯缓冲区:Arduino的USB端口有串口寄存器,可以用来暂存电脑从USB发送的数据。Arduino从串口寄存器读取的速度比串口发送数据的速度快,所以串口通讯读取数据前需要加一定延时。和电脑通信的时候,Arduino UNO的串口寄存器空间默认是63帧的数据帧大小,超出后信息会挤掉前面的信息。

串口通讯函数

Serial 类:通过 Serial 类来使用开发板上的UART串口,只需要指定波特率,就能使用了。

波特率(Baud Rate):在信息传输通道中,携带数据信息的信号单元叫码元,单位时间内通过信道传输的码元数称为码元传输速率,简称波特率。常用的波特率为9600、115200、4800等,波特率越大表明通信的速率越快。。当传输的码元信息量刚好为1比特的时候,波特率等于比特率。通信双方需要使用一致的的波特率才能正常通信。

Serial.begin()
函数作用:开启串口。
使用方法:speed为波特率;config为设置数据位、校验位和停止位。

  • Serial.begin(speed)
  • Serial.begin(speed, config)

Serial.end()
函数作用:禁止串口传输,此时串口0(RX)和1(TX)引脚可以作为数字引脚使用。

Serial.print()
函数作用:串口输出数据,写入字符数据到串口。
使用方法:val是打印的值;config输出数据格式,BIN(二进制)、OCT(八进制)、DEC(十进制)、HEX(十六进制)等。

  • Serial.print(val)
  • Serial.print(val, format)

Serial.println()
函数作用:串口输出数据并换行。
使用方法:

  • Serial.println(val)
  • Serial.println(val, format)

Serial.available()
函数作用:判断串口缓冲区的状态,返回从串口缓冲区读取的字节数。

Serial.read()
函数作用:读取串口数据,一次读一个字符,读完后删除已读数据;当没有可读数据时返回-1,整数类型。

Serial.peek()
函数作用:读取串口数据,一次读一个字符,读完后不删除;当没有可读数据时返回-1,整数类型。。

Serial.readString()
函数作用:每次读取一个字符串,返回一个String类型。

Serial.readStringUntil()
函数作用:每次读取一个字符串,知道遇到截止字符,返回一个String类型。
使用方法:inByte为截止字符。

  • Serial.readStringUntil(inByte)

字符串常用函数

了解字符串的常用函数,可以更好进行串口通讯中复杂指令的处理。

获取字符串中的部分内容:

  • charAt(n):返回字符串中第n个字符。
  • substring(from, to):从指定的起始索引 " from " 到结束索引 " to " (不包括)截取字符串的子串。
  • substring(from):返回一个从给定索引" from " 到结尾的子串。

比较两个字符串:

  • compareTo(S2):与S2字符串比较,如果两个字符串相同,返回值等于0;否则,返回值不等于0。
  • equals(S2):比较两个字符串是否相等,区分大小写。

字符串类型转换:

  • toInt():数字字符串转为整数值。
  • toCharArray(buf,len) :把字符串转换成数组char[],其中buf是char[],len为复制长度。

获取字符串长度:

  • length():返回字符串中的字符数。
  • strlen():获取字符串的长度,不包括空终止符。
  • sizeof():获取字符串的长度,包括空终止符。

两个字符串之间的合并:

  • strcat(str1,str2):把str1(包括“\0”)复制到str2后面(删除str2原来末尾的“\0”)。
  • concat(S2):返回字符串和字符串S2合并后的新字符串

串口通讯示例

入门示例

先处理一个简单的指令。
示例代码的解释:往串口每次输入一串指令“a1”后,Arduino返回“YES”。

String str;void setup() {Serial.begin(115200);// 设置波特率,上位机的波特率要保证相同,不然无法识别str="";
}void loop() {delay(100);//等待100ms=0.1s,加延时是因为Arduino从串口寄存器读取的速度比串口发送数据的速度快while (Serial.available() > 0){str += char(Serial.read());// read是剪切,而不是复制}if(str=="a1\0"){Serial.println("YES");}str="";
}

测试串口通讯

程序验证上传到Arduino后。

点击IDE右上角有个串口监视器。
在这里插入图片描述
点击后会有下方会出现串口监视器,调整波特率和代码对应,然后输入没有结束符的消息“a1”,就可以看到Arduino返回的“YES”。
在这里插入图片描述

复杂指令处理

在前面的入门示例中,要处理的上位机指令很简单,上位机每次只发送一个指令“a1”。

但是如果上位机发送的指令很长,而且还包含了数字,甚至可能发送指令的速度很快,“Serial.available() > 0”判断的时候可能有多条指令要区分。

下面是一个处理稍微复杂指令的示例代码,涵盖了处理复杂指令的基本操作。
示例代码的解释:指令格式为“指令类型+数字+\n”,前4位为指令类型分别有1001、1002和1003,分别对应的功能为对数字进行1次方、2次方和3次方,指令结尾为“\n”。该代码会对输入的指令进行解读,并且进行相应的功能,返回对应的数值。

String str,pre_str,last_str;String type_str[] = {"1001", "1002", "1003"}; //指令前4位表示不同类型指令,其中1001表示1次方,1002表示2次方,1003表示3次方int i,j,ans,cnt;void setup() {Serial.begin(115200);// 设置波特率
}void loop() {delay(100);//等待100ms=0.1swhile (Serial.available() > 0){str= Serial.readStringUntil('\n');//读取指令,指令以“\n”结尾,通过“\n”来分割不同的指令pre_str = str.substring(0, 4);//截取输入指令前4位last_str= str.substring(5, str.length());//截取输入指令4位后的数据cnt = last_str.toInt();//将字符串last_str转成数字cntans=cnt;// 根据不同指令计算cnt多少次方for(i=0;i<3;i++){if(pre_str.compareTo(type_str[i])==0){for(j=0;j<i;j++){ans*=cnt;}}}Serial.println(ans);}
}

代码串口测试:
在这里插入图片描述

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

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

相关文章

C# Cad2016二次开发选择文本信息导出(六)

//选文本信息导出 [CommandMethod("getdata")] public void getdata() {// 获取当前文档和数据库Document doc Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;Database db doc.Database;Editor ed doc.Editor;// 获取当前…

vulnhub靶场之DC-9

一.环境搭建 1.靶场描述 DC-9 is another purposely built vulnerable lab with the intent of gaining experience in the world of penetration testing. The ultimate goal of this challenge is to get root and to read the one and only flag. Linux skills and famili…

Flink会话集群docker-compose一键安装

1、安装docker 参考&#xff0c;本人这篇博客&#xff1a;https://blog.csdn.net/taotao_guiwang/article/details/135508643?spm1001.2014.3001.5501 2、flink-conf.yaml flink-conf.yaml放在/home/flink/conf/job、/home/flink/conf/task下面&#xff0c;flink-conf.yaml…

C++输入输出和文件

文章目录 一. 流, 缓冲区和iostream文件二. 使用cout进行输出1. 用cout进行格式化2. 刷新输出缓冲区 三. 使用cin进行输入1. cin>>如何检查输入2. 流状态3. 其他istream类方法 四. 文件输入和输出1. 简单的文件I/O2. 文件模式3. 随机存取4. 内核格式化 To be continue...…

jmeter--6.跨线程组关联

目录 1. 跨线程组实现接口关联 2. 跨线程组实现Cookie关联 1. 跨线程组实现接口关联 1.1 根据json/正则的方式提取到需要的响应数据 1.2 在接口下新增一个BeanShell 后置处理器&#xff0c;并通过函数助手写入【${__setProperty(new_token,${access_token},)}】&#xff0c;…

Unet系列网络解析

Unet UNet最早发表在2015的MICCAI上&#xff0c;到2020年中旬的引用量已经超过了9700多次&#xff0c;估计现在都过万了&#xff0c;从这方面看足以见得其影响力。当然&#xff0c;UNet这个基本的网络结构有太多的改进型&#xff0c;应用范围已经远远超出了医学图像的范畴。我…

命名空间 “Eigen“ 没有成员 “SelfAdjointEigenSolver“

代码中用到SelfAdjointEigenSolver 结果报错&#xff1a;报错实在windows10条件下发生的。 查找资料&#xff0c;最后还是要定位到官方文档。 计算自伴随矩阵的特征值和特征向量。 这是在特征值模块中定义的。 添加如下引用即可解决&#xff0c;请点赞关注。 #include <…

设备之AP555【之一】

1、Audio Precision官网 Audio Precision 是声学及音频测试中公认的标准。AP提供了高性能声学和音频分析仪&#xff0c;配件和应用程序&#xff0c;帮助全球工程师设计&#xff0c;验证和制造消费电子、专业和工业的声学和音频产品。 APX555B 是具有三十年经验的测试设备&…

Java项目:120SpringBoot婚恋网站

博主主页&#xff1a;Java旅途 简介&#xff1a;分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 婚恋网站是由SpringBootMybatis开发的&#xff0c;功能详细&#xff0c;满足婚恋网的基本要求。 主要功能如下&#xff1a; 登录注册用户浏览用户搜索成…

2024年腾讯云服务器多少钱1年?超便宜62元一年

腾讯云服务器租用价格表&#xff1a;轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、轻量4核8G12M服务器446元一年、646元15个月&#xff0c;云服务器CVM S5实例2核2G配置280.8元一年…

springCould中的Hystrix【下】-从小白开始【8】

目录 &#x1f9c2;1.熔断机制❤️❤️❤️ &#x1f32d;2.修改8001服务 ❤️❤️❤️ &#x1f95e;3.测试 ❤️❤️❤️ &#x1f953;4. 服务监控hystrixDashboard❤️❤️❤️ &#x1f32d;5.仪表盘❤️❤️❤️ &#x1f9c2;6.仪表盘的使用 ❤️❤️❤️ 1.熔断机…

数据库SELECT语句

文章目录 一、检索数据二、排序检索三、过滤数据四、数据过滤4.1 组合WHERE子句1. AND操作符2. OR操作符3. 计算次序 4.2 IN操作符4.3 NOT操作符 五、用通配符过滤LIKE操作符1. 百分号&#xff08;%&#xff09;通配符2. 下划线&#xff08;_&#xff09;通配符 使用通配符的技…

【Kotlin】协程的字节码原理

前言 协程是Koltin语言最重要的特性之一&#xff0c;也是最难理解的特性。网上关于kotlin协程的描述也是五花八门&#xff0c;有人说它是轻量级线程&#xff0c;有人说它是无阻塞式挂起&#xff0c;有人说它是一个异步框架等等&#xff0c;众说纷芸。甚至还有人出了书籍专门介…

transbigdata笔记:可视化

1 可视化轨迹 transbigdata.visualization_trip(trajdata, col[Lng, Lat, ID, Time], zoomauto, height500) 例子见transbigdata 笔记&#xff1a;官方文档案例1&#xff08;出租车GPS数据处理&#xff09;-CSDN博客 2 可视化od transbigdata.visualization_od(oddata, col…

【分布式技术】监控平台zabbix对接grafana,优化dashboard

目录 第一步&#xff1a;在zabbix server服务端安装grafana&#xff0c;并启动 第二步&#xff1a; 访问http://ip:3000/login 第三步&#xff1a;创建数据源 第四步&#xff1a;导入dashboard模板 ps&#xff1a;自定义创建新面板 第一步&#xff1a;在zabbix server服务…

Java线上问题堆栈排查分析

最近线上出现类似内存溢出问题&#xff0c;需要排查具体原因&#xff0c;记录过程&#xff0c;方便备查。 一、数据抓取 在启动参数中添加参数&#xff0c;可参照以下设置。 参数的作用是在程序发生内存溢出 OutOfMemory 时打印日志&#xff0c;dump下来&#xff0c;方便用工…

leetcode 206翻转链表

题目&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 提示&#xff1a; 链表中节点的数目范围是 [0, 5000] -5000 < Node.val < 5000 解法&#xff1a; 思路 使用双指针&#xff0c;pre,定义当前指针cur&#xff0…

入门Docker1: 容器技术的基础

目录 服务器选型 虚拟机 基于主机(物理机或虚机)的多服务实例 基于容器的服务实例 Docker Docker三要素 Docker安装 Docker基本使用 基本操作 仓库镜像 容器 服务器选型 在选择服务器操作系统时&#xff0c; Windows 附带了许多您需要付费的功能。 Linux 是开放源代…

Could not find annotations-4.9.0.jar 异常

问题 org.gradle.internal.resolve.ArtifactNotFoundException: Could not find annotations-4.9.0.jar (com.github.bumptech.glide:annotations:4.9.0).原因 解决方式 repositories {google()//谷歌放前面jcenter()//放在谷歌后面}更换顺序后确实没问题了 参考文章 https:…

Python接口自动化测试项目实战

1.1 接口测试项目搭建 1.1.1 教育局招生管理系统部署 教育局招生管理系统是基于javamysql,下面介绍它的部署过程。 1.从我的网盘下载部署文件。 2.安装jdk以及配置环境变量。 点击 文件进行安装。 下一步下一步直接安装。 本人的安装路径是C:\Program Files\Java\jdk1.7.…