Arduino串口发送接收和串口中断事件

目录

一、硬件介绍

1、控制器

2、TTL转USB串口

二、软件程序

1、单片机发送字符串

(1)每个串口对应的类名称介绍

(2)发送功能

(3)代码

(4)测试

2、单片机接收字符串

(1)使用串口1控制IO输出

(2)代码

(3)测试

3、串口中断事件

(1)串口中断介绍

(2)串口0、串口1中断测试

(3)串口中断设置接收标识符、结束标识符


一、硬件介绍

1、控制器

Arduino MEGA开发板。包含4个串口,串口0(即TX0、RX0)出厂默认和USB连接使用。串口1、串口2、串口3用户可以实际使用。

2、TTL转USB串口

Arduino中的串口是TTL电平,需要使用转接线转接以后才可以通信。

(TTL电平:高低电平,0-5V。0V为0,5V是1。

232串口电平:全双工(逻辑1:-15V--5V 逻辑0:+3V--+15V))

USB/TTL转接线使用的时候,需要安装驱动程序。驱动程序下载链接或者打包的工程中包含。PL2303TA+最新驱动.zip_免费高速下载|百度网盘-分享无限制

二、软件程序

1、单片机发送字符串

(1)每个串口对应的类名称介绍

串口0的类是Serial;

串口1的类是Serial1;

串口1的类是Serial2;

串口1的类是Serial3。

(2)发送功能

使用串口0、串口1分别和串口调试助手链接测试,一秒钟给串口调试助手发送一次字符串数据。

(3)代码

const long _1000msTime = 1000;    // 1000 milli seconds
unsigned long _1000msLastTime;
const long _100msTime = 100;      // 100 milli seconds
unsigned long _100msLastTime; 
const long _10msTime = 10;        // 10 milli seconds
unsigned long _10msLastTime;void setup() 
{//串口开启-波特率9600Serial.begin(9600);             //串口0,USB口连电脑Serial1.begin(9600);            //串口1Serial2.begin(9600);            //串口2Serial3.begin(9600);            //串口3}void loop() 
{TimeProc();}void TimeProc()
{//1000ms执行一次if ((millis() - _1000msLastTime) >= _1000msTime){_1000msLastTime = millis( );    ////Serial.print("Distance is: "); //Serial.print(currDistance);Serial.println("USB Serial Send.");Serial1.println("Serial1 Send.");}//100ms执行一次if ((millis() - _100msLastTime) >= _100msTime){_100msLastTime = millis( );  //}//10ms执行一次if ((millis() - _10msLastTime) >= _10msTime){_10msLastTime = millis( );  //}}

(4)测试

2、单片机接收字符串

(1)使用串口1控制IO输出

PC端使用串口调试助手给单片机串口1发送字符串,单片机根据串口1接收不同的字符串对IO口进行高低电平控制。

串口调试助手给单片机串口1发送字符串。

①发送'a'、IO输出高电平。单片机串口0,给串口调试助手发送单片机串口1接收到的字符串。

②发送‘b’、IO输出低电平。单片机串口0,给串口调试助手发送单片机串口1接收到的字符串。

(2)代码

const long _1000msTime = 1000;    // 1000 milli seconds
unsigned long _1000msLastTime;
const long _100msTime = 100;      // 100 milli seconds
unsigned long _100msLastTime; 
const long _10msTime = 10;        // 10 milli seconds
unsigned long _10msLastTime;const int redLed=22;void setup() 
{//设置IO口为输出模式pinMode(redLed,OUTPUT);//IO口初始输出低电平。Led灯正极接IO口,即输出高电平点亮。digitalWrite(redLed,LOW);//串口开启-波特率9600Serial.begin(9600);             //串口0,USB口连电脑Serial1.begin(9600);            //串口1Serial2.begin(9600);            //串口2Serial3.begin(9600);            //串口3}void loop() 
{TimeProc();if(Serial1.available()>0){char ch=Serial1.read();Serial.print("Serial Recive: ");Serial.print(ch);Serial.println(" ;");if(ch=='a'){digitalWrite(redLed,HIGH);Serial.println("Turn On Success");}if(ch=='b'){digitalWrite(redLed,LOW);      Serial.println("Turn Off Success");}}}void TimeProc()
{//1000ms执行一次if ((millis() - _1000msLastTime) >= _1000msTime){_1000msLastTime = millis( );    //串口发送//Serial.println("USB Serial Send.");//Serial1.println("Serial1 Send.");}//100ms执行一次if ((millis() - _100msLastTime) >= _100msTime){_100msLastTime = millis( );  //}//10ms执行一次if ((millis() - _10msLastTime) >= _10msTime){_10msLastTime = millis( );  //}}

(3)测试

IO输出打开

IO输出关闭

3、串口中断事件

(1)串口中断介绍

当串口接收缓冲区有数据时自动触发该事件。串口0中断事件serialEvent()。

Arduino MEGA开发板:

串口1中断事件serialEvent1()。

串口2中断事件serialEvent2()。

串口3中断事件serialEvent3()。

(2)串口0、串口1中断测试

实现功能:

给串口0或者串口1发送字符串,串口0或者串口1接收完成、将接收的字符串再通过串口0发送出去。

接收结束使用标识符‘#’

代码


String inputString = "";          //保存串口接收的字符串
bool stringComplete = false;      //串口接收完成标志位void setup() 
{Serial.begin(9600);Serial1.begin(9600);inputString.reserve(200);
}void loop() 
{if (stringComplete) {Serial.println(inputString);  //串口0发送出去  //清空接收字符串inputString = "";stringComplete = false;}
}//串口0中断事件
void serialEvent() 
{while (Serial.available()) {char inChar = (char)Serial.read();inputString += inChar;if (inChar == '#')        //结束符{stringComplete = true;}}  
}//串口1中断事件
void serialEvent1()
{while (Serial1.available()) {char inChar = (char)Serial1.read();inputString += inChar;if (inChar == '#')        //结束符{stringComplete = true;}}  
}

(3)串口中断设置接收标识符、结束标识符

①发送的字符串第一个字符为'$'、结束字符为'#',才可以正常的发送和接收。

②串口0和串口1接收到的数据都通过串口1再发送出去,并且反馈发送接收的字符数量。

举例说明:

串口调试助手发送字符串:$1,0,0,0,0,0,0,0,0,0#

代码

const long _1000msTime = 1000;    // 1000 milli seconds
unsigned long _1000msLastTime;
const long _100msTime = 100;      // 100 milli seconds
unsigned long _100msLastTime; 
const long _10msTime = 10;        // 10 milli seconds
unsigned long _10msLastTime;const int redLed=22;int num1 = 0;                     // 接收的字符数
int incomingByte = 0;             // 接收到的 data byte
String inputString = "";          // 用来储存接收到的内容
boolean startBit  = false;        // 协议开始标志
bool recvComplete = false;        // 接收完成标志void setup() 
{//设置IO口为输出模式pinMode(redLed,OUTPUT);//IO口初始输出低电平。Led灯正极接IO口,即输出高电平点亮。digitalWrite(redLed,LOW);//串口开启-波特率9600Serial.begin(9600);             //串口0,USB口连电脑Serial1.begin(9600);            //串口1Serial2.begin(9600);            //串口2Serial3.begin(9600);            //串口3}void loop() 
{TimeProc();if(recvComplete){recvComplete=false;Serial1.println(inputString);Serial1.print("Char count is:");Serial1.println(num1);num1 = 0;startBit = false;inputString = "";}}void TimeProc()
{//1000ms执行一次if ((millis() - _1000msLastTime) >= _1000msTime){_1000msLastTime = millis( );    ////Serial.println("USB Serial Send.");//Serial1.println("Serial1 Send.");}//100ms执行一次if ((millis() - _100msLastTime) >= _100msTime){_100msLastTime = millis( );  //}//10ms执行一次if ((millis() - _10msLastTime) >= _10msTime){_10msLastTime = millis( );  //}}//上位机发送举例:'$1,0,0,0,0,0,0,0,0,0#'//串口0中断
void serialEvent()
{while (Serial.available()){incomingByte = Serial.read();                 //一个字节一个字节地读,下一句是读到的放入字符串数组中组成一个完成的数据包if(incomingByte == '$')                       //'$'是开始读取的标识符 {num1 = 0;startBit = true;}if(startBit == true){num1++;inputString += (char) incomingByte;         // 全双工串口可以不用在下面加延时,半双工则要加的//}if(startBit == true && incomingByte == '#')   //'#'是读取结束的标识符 {recvComplete = true;startBit = false;} }}//串口1中断
void serialEvent1()
{while (Serial1.available()){incomingByte = Serial1.read();                 //一个字节一个字节地读,下一句是读到的放入字符串数组中组成一个完成的数据包if(incomingByte == '$')                       //'$'是开始读取的标识符 {num1 = 0;startBit = true;}if(startBit == true){num1++;inputString += (char) incomingByte;         // 全双工串口可以不用在下面加延时,半双工则要加的//}if(startBit == true && incomingByte == '#')   //'#'是读取结束的标识符 {recvComplete = true;startBit = false;}  }}

测试

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

elasticsearch系列七:聚合查询

概述 今天咱们来看下es中的聚合查询,在es中聚合查询分为三大类bucket、metrics、pipeline,每一大类下又有十几种小类,咱们各举例集中,有兴许的同学可以参考官网:https://www.elastic.co/guide/en/elasticsearch/refere…

闲来无事互相翻包,来看看我们的2023通勤EDC

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / 声湃轩北京录音间 EDC,Every Day Carry,顾名思义就是每天包里装的东西。 什么?难道除了…

idea的pom.xml文件灰色删除线解决办法

以上是点击了移除module后就变成这样 如果再次对着已移除的module右键会发现有个delete,点击这个是真删了,要谨慎备份哦 解决方案:恢复误操作remove module的解决方法 idea最右边,有个Maven控件,找到要恢复的module&a…

ssm基于vue的大学生社团管理系统的设计与实现+vue论文

基于vue的大学生社团管理系统的设计与实现 计算机科学与技术 2022届 姓名 学号 摘要 当下,正处于信息化的时代,许多行业顺应时代的变化,结合使用计算机技术向数字化、信息化建设迈进。传统的大学生社团信息管理模式,采用人工登…

java-MyBatis项目配置

java-MyBatis项目配置 最近博主在学习MyBatis,学习了一下MyBatis项目配置。 下面博主就讲一下这个项目配置的一个情况 先看一下配置流程大纲: 后续,我会解释一下这些配置文件的意义 1.创建一个maven项目,为什么要创建这个项目&…

在markdown中添加视频的两种方法

查看专栏目录 Network 灰鸽宝典专栏主要关注服务器的配置,前后端开发环境的配置,编辑器的配置,网络服务的配置,网络命令的应用与配置,windows常见问题的解决等。 文章目录 方式一源代码: 方式二结尾语网络的梦想 markd…

Qt篇——QwtPainter::drawPie绘制扇形

QwtPainter::drawPie(QPainter *painter, const QRectF &rect, int startAngle, int angle); 一、参数含义: painter: 重绘函数中的painter对象 rect: 要绘制扇形的圆的外切矩形。 startAngle: 要绘制的扇形的起始角 …

Scala知识点——App类

我们在代码中一般程序都是是通过main方法进入。但是在scala中提供了一个App类,通过继承可以实现不用显式的调用main方法就能运行。 App类中实现了main方法:

Prometheus/Loki+Alertmanager+Grafana监控告警

@toc 告警模式 1、Prometheus+Alertmanager 2、Loki+Alertmanager 除了上面提到的服务,我们可以补充主要服务如下图: 部署方式 Node exporter+Prometheus+Alertmanager:Helm Promtail+Loki:Helm Grafana:Helm 1、Node exporter+Prometheus+Alertmanager方式 1)安装 添加H…

基于ssm西安旅游管理系统论文

摘 要 在如今社会上,关于信息上面的处理,没有任何一个企业或者个人会忽视,如何让信息急速传递,并且归档储存查询,采用之前的纸张记录模式已经不符合当前使用要求了。所以,对西安旅游信息管理的提升&#x…

Python/R/GUI/BI类型常用数据可视化工具

什么是数据可视化工具? 数据可视化工具是指旨在可视化数据的所有形式的软件。它们处理数据输入,将其转换为用户可以根据自己的需求进行定制的视觉效果。 不同的工具可以包含不同的功能,但最基本的是,数据可视化工具提供输入数据集…

2024 年政府和技术预测

新的一年即将来临,这意味着专家、技术专家和专栏作家应该尝试预测 2024 年政府和技术即将出现的一些最大趋势。今年可能使这些预测变得更加困难的是事实上,许多技术正在以惊人的速度向前发展。在某些情况下,过去需要多年才能慢慢发生的变化现…

每日汇评:黄金走势艰难,但有望在2023年上涨14%

黄金价格在此前从三周高点回落后又回到了上涨轨迹; 在2023年最后一个交易日,由于美债收益率低迷,美元再次走弱; 黄金价格有望突破2100美元,每日技术面仍有利于买家; 尽管前一天金价从三周高点 2089 美元回落…

元气森林与纷享销客深化合作:用数据连通业务驱动决策

快消行业标杆企业元气森林与纷享销客将进一步深化合作。日前,元气森林信息中心团队相关负责人到访纷享销客。元气森林信息中心负责人唐昕高度肯定了与纷享销客的合作成果,并表示未来双方将进一步加强在营销体系数字化运营上的合作。 01、数据驱动决策&am…

CSAPP《深入理解计算机系统》深读笔记3——第二章-信息的表示和处理(下)

CSAPP《深入理解计算机系统》深读笔记3——第二章-信息的表示和处理(下) 你好我是拉依达,这是我秋招结束后更新的第一个系列。我将争取完成“ 年轻人,你渴望力量吗?”的全套深度笔记。 今天开始进行第一本CSAPP:深入理解计算机系统…

【堡垒机小问答】堡垒机最早起源于哪里?是国外吗?

随着大家网络安全意识的增加,对于堡垒机的了解也越来越多。最近有不少小伙伴在问,堡垒机最早起源于哪里?是国外吗?这里我们就来简单回答一下。 堡垒机最早起源于哪里?是国外吗? 【回答】:堡垒…

【行云流水线】满足你对工作流编排的一切幻想~skr

流水线模型 众所周知,DevOps流水线(DevOps pipeline)的本质是实现自动化工作流程,用于支持软件开发、测试和部署的连续集成、交付和部署(CI/CD)实践。它是DevOps方法论的核心组成部分,旨在加速…

vite + javascript 创建纯 javascript项目

1、环境搭建:需要安装 node 管理器命令:安装了node的后,可以使用 npm ,也可以安装使用 cnpm / pnpm 下载 cnpm npm install -g cnpm --registryhttps://registry.npm.taobao.org 下载 pnpm npm i -g pnpm pnpm config set r…

详解IP安全:【IPSec协议簇 | AH协议 | ESP协议 | IKE协议】

目录 IP安全概述 IPSec协议簇 IPSec的实现方式 AH(Authentication Header,认证头) ESP(Encapsulating Security Payload,封装安全载荷) IKE(Internet Key Exchange,因特网密钥…

【苏州】买套二手房需要多少钱?

买新房存在一定的交付风险,买二手房毕竟是现货,所以最近二手房购房者越来越多了。 根据住房和城乡建设部副部长董建国在中国国际经济交流中心举行的2023-2024中国经济年会上的发言,今年1到11月,全国二手房交易量占全部…