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.1s
  while (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转成数字cnt
    ans=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);
  }
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

与react的初定情素

前要&#xff1a; 努力打好基础才能学好它&#xff01;由于我使用vue已经3年了&#xff01;来学习react&#xff0c;所以我写的只要我自己看得懂的就行&#xff01;学这我自己会与vue的语法做对比的&#xff01; 目录概览 基本表达式{}列表渲染条件渲染事件的绑定组件useState …

Linux入门级常用命令学习笔记

以下命令是我跟着编程界的大佬鱼皮学习Linux时用的命令&#xff0c;我把它都记下来&#xff0c;权当作笔记&#xff0c;可供自己后期反复练习使用&#xff0c;让我们学习一下最基本的Linux命令吧。 一、Linux实战命令 在dos下 【ssh 服务器ip】可以连接服务器&#xff0c;输入…

HiddenDesktop:一款针对Cobalt Strike设计的HVNC隐藏桌面工具

关于HiddenDesktop HiddenDesktop是一款针对Cobalt Strike设计的HVNC隐藏桌面工具&#xff0c;该工具专为红队研究人员设计&#xff0c;支持通过远程桌面会话来与目标远程设备执行交互。 值得一提的是&#xff0c;该工具并没有使用到VNC协议&#xff0c;但却能够实现类似的效…

玖章算术NineData通过阿里云PolarDB产品生态集成认证

近日&#xff0c;玖章算术旗下NineData 云原生智能数据管理平台 (V1.0&#xff09;正式通过了阿里云PolarDB PostgreSQL版 (V11)产品集成认证测试&#xff0c;并获得阿里云颁发的产品生态集成认证。 测试结果表明&#xff0c;玖章算术旗下NineData数据管理平台 (V1.0&#xff…

网络安全等级保护测评规划与设计

笔者单位网络结构日益复杂&#xff0c;应用不断增多&#xff0c;使信息系统面临更多的风险。同时&#xff0c;网络攻防技术发展迅速&#xff0c;攻击的技术门槛随着自动化攻击工具的应用也在不断降低&#xff0c;勒索病毒等未知威胁也开始泛滥。基于此&#xff0c;笔者单位拟进…

Redis图形界面闪退/错误2系统找不到指定文件/windows无法启动Redis/不是内部或外部命令,也不是可运行的程序

Redis图形界面闪退/错误2系统找不到指定文件/windows无法启动Redis/不是内部或外部命令&#xff0c;也不是可运行的程序 我遇到了以上的问题。 其实&#xff0c;最重要的原因是我打开不了another redis desktop mannager&#xff0c;就是我安装了之后&#xff0c;无法打开它…

基于模型的系统工程MBSE-SysML

基于模型的系统工程MBSE MBSE是一种通过构建标准模型&#xff0c;用于支持系统需求、分析、设计、检验与确认活动&#xff0c;这些活动从概念设计阶段开始&#xff0c;贯穿整个开发过程及后续的生命周期阶段。 MBSE能带来哪些价值 需求分析阶段 需求的标准化描述&#xff1a;避…

5.1 内容管理模块 - 课程预览、提交审核

内容管理模块 - 课程预览、提交审核 文章目录 内容管理模块 - 课程预览、提交审核一、课程预览1.1 需求分析1.2 freemarker 模板引擎1.2.1 Maven 坐标1.2.2 freemaker 相关配置信息1.2.3 添加模板 1.3 测试静态页面1.3.1 部署Nginx1.3.2 解决端口问题被占用问题1.3.3 配置host文…

JVM工作原理与实战(十六):运行时数据区-Java虚拟机栈

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、运行时数据区 二、Java虚拟机栈 1.栈帧的组成 2.局部变量表 3.操作数栈 4.帧数据 总结 前言 JVM作为Java程序的运行环境&#xff0c;其负责解释和执行字节码&#xff0c;管理…

存储的基本架构

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、存储的需求背景二、自下而上存储架构总结 一、存储的需求背景 1、人的身份信息需要存储 这种信息可以用关系型数据库&#xff0c;例如mysql&#xff0c;那种表…

多线程并发与并行

&#x1f4d1;前言 本文主要是【并发与并行】——并发与并行的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&…

【JavaScript】事件监听:键盘事件

目录 一、keydown&#xff1a;按下键盘上的任意键时触发。 二、keyup&#xff1a;释放键盘上的任意键时触发。 三、keypress&#xff1a;在按下并释放能够产生字符的键时触发&#xff08;不包括功能键等&#xff09;。 四、input&#xff1a;在文本输入框或可编辑元素的内容…

基本BGP配置试验 :配置 IBGP 和 EBGP

一、预习&#xff1a; BGP&#xff1a;Border Gateway Protocol 没有精妙的算法&#xff0c;但能承载大量的路由&#xff0c;它不生产路由&#xff0c;它是路由的搬运工 使用TCP做为传输层协议&#xff0c;端口号179&#xff0c;使用触发式路由更新 1. BGP路由…

用Pytorch实现线性回归模型

目录 回顾Pytorch实现步骤1. 准备数据2. 设计模型class LinearModel代码 3. 构造损失函数和优化器4. 训练过程5. 输出和测试完整代码 练习 回顾 前面已经学习过线性模型相关的内容&#xff0c;实现线性模型的过程并没有使用到Pytorch。 这节课主要是利用Pytorch实现线性模型。…

DNS主从服务器配置

主从服务器配置&#xff1a; &#xff08;1&#xff09;完全区域传送&#xff1a;复制整个区域文件 #主DNS服务器的配置【主dns服务器的ip地址为192.168.168.129】 #编辑DNS系统配置信息&#xff08;我这里写的增加的信息&#xff0c;源文件里面有很多内容&#xff09; [root…

(超详细)4-YOLOV5改进-添加ShuffleAttention注意力机制

1、在yolov5/models下面新建一个ShuffleAttention.py文件&#xff0c;在里面放入下面的代码 代码如下&#xff1a; import numpy as np import torch from torch import nn from torch.nn import init from torch.nn.parameter import Parameterclass ShuffleAttention(nn.…

今天吃什么小游戏(基于Flask框架搭建的简单应用程序,用于随机选择午餐选项。代码分为两部分:Python部分和HTML模板部分)

今天吃什么 一个简单有趣的外卖点饭网站&#xff0c;不知道吃什么的时候&#xff0c;都可以用它自动决定你要吃的&#xff0c;包括各种烧烤、火锅、螺蛳粉、刀削面、小笼包、麦当劳等午餐全部都在内。点击开始它会随意调出不同的午餐&#xff0c;点击停止就会挑选一个你准备要吃…

小红书家居博主报价?怎么和博主合作?

小红书上各式各样的家居博主层出不穷&#xff0c;这些博主不仅为粉丝提供了家居装修的灵感&#xff0c;更为品牌带来了巨大的商业价值。 在当下家居市场竞争激烈的环境中&#xff0c;品牌与家居博主合作已成为了营销策略中的重要一环。博主们庞大的粉丝群体、丰富的内容产出以…

腾讯云服务器多少钱?2024年腾讯云服务器报价明细表

腾讯云服务器租用价格表&#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元一年…

区间预测 | Matlab实现LSSVM-ABKDE的最小二乘支持向量机结合自适应带宽核密度估计多变量回归区间预测

区间预测 | Matlab实现LSSVM-ABKDE的最小二乘支持向量机结合自适应带宽核密度估计多变量回归区间预测 目录 区间预测 | Matlab实现LSSVM-ABKDE的最小二乘支持向量机结合自适应带宽核密度估计多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现…