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://www.mzph.cn/news/584593.shtml

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

相关文章

Kafka:本地设置

这是设置 Kafka 将数据从 Elasticsearch 发布到 Kafka 主题的三部分系列的第一部分;该主题将被 Neo4j 使用。第一部分帮助您在本地设置 Kafka。第二部分将讨论如何设置Elasticsearch将数据发布到Kafka主题。最后 将详细介绍如何使用连接器订阅主题并使用数据。 Kafka Kafka 是…

JavaScript中实现页面跳转的几种常用方法

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍在JavaScript中实现页面跳转的几种常用方法以及部分理论知识 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主收将持续更新学习记录获,友友们有任何问题…

《Spring Cloud学习笔记:分布式事务Seata》

1.分布式事务理论基础 1.1.本地事务 本地事务,也就是传统的单机事务,在传统的数据库事务中,必须要满足ACID四个原则: 1.2.分布式事务 分布式事务,就是指不是在单个服务或单个数据库架构下产生的事务。 分布式事务是…

状态模式-举例

在软件系统中,有些对象也像水一样具有多种状态, 这些状态在某些情况下能够相互转换, 而且对象在不同的状态下也将具有不同的行为。 参考日志来设置状态。 如何判断一个设计模式是行为模式还是什么其他模式? 什么叫行为模式&#…

蓝桥圣诞树(C++)

问题描述 输入样例: 1 3 101 1 2 2 3 输出样例: YES 思路: 这道题还是比较好想的,因为它构造的二叉树是用边连接起来的,不是像之前一样从上到下从左到右按编号构造的,所以可以用邻接表来存每个点还有边&am…

腾讯云价格计算器,一键计算精准报价,好用!

腾讯云价格计算器:可以计算腾讯云服务器不同CVM实例规格、CPU内存、公网带宽和系统盘费用明细表,可以一键计算出精准报价明细表,腾讯云服务器网txyfwq.com分享大家腾讯云服务器价格计算器入口链接、使用方法及限制说明: 腾讯云服…

Python 操作 MySQL:使用 mysql-connector-python 操作 MySQL 数据库

大家好,我是水滴~~ 当涉及到使用 Python 操作 MySQL 数据库时,mysql-connector-python 库是一个强大而常用的选择。该库提供了与 MySQL 数据库的交互功能,使您能够执行各种数据库操作,如连接数据库、执行查询和插入数据等。在本文…

第十一章 Stream消息驱动

Stream消息驱动 gitee:springcloud_study: springcloud:服务集群、注册中心、配置中心(热更新)、服务网关(校验、路由、负载均衡)、分布式缓存、分布式搜索、消息队列(异步通信)、数据库集群、…

maven命令行安装依赖测试

mvn dependency:get -DgroupIdorg.springframework -DartifactIdspring-core -Dversion5.3.9作用:可用于测试配置环境变量后,能否下载依赖到本地仓库

前后端分离架构的特点以及优缺点

文章目录 一、前后端不分离架构(传统单体结构)1.1 什么是前后端不分离1.2 工作原理1.3 前后端不分离的优缺点1.4 应用场景 二、前后端分离架构2.1 为什么要前后端分离2.2 什么是前后端分离2.3 工作原理2.4 前后端分离的优缺点 参考资料 一、前后端不分离架构(传统单体结构) 首…

【linux】cut的基本使用

cut主要用于按列切分文本行,并输出指定的字段,这是类unix系统中常用的文本处理工具。 基本使用 首先随便去网上找个文本或者列表文件 如果使用cat看文本的话就是这样的 sh-3.2# cat data.csv Name,Age,City,Salary Alice,30,New York,70000 Bob,25,L…

C++ 侯捷 内存管理

C 的内存获取机制&#xff1a; void* p1 malloc(512); free(p1);complex<int>* p2 new complex<int>; delete p2;void* p3 ::operator new(512); ::operator delete(p3);//GNUC void* p4 alloc::allocate(512); alloc::deallocate(p4, 512);//GNUC4.9 void* p5…

Hbase详解

Hbase 概念 base 是分布式、面向列的开源数据库&#xff08;其实准确的说是面向列族&#xff09;。HDFS 为 Hbase 提供可靠的底层数据存储服务&#xff0c;MapReduce 为 Hbase 提供高性能的计算能力&#xff0c;Zookeeper 为 Hbase 提供稳定服务和 Failover 机制&#xff0c;…

OR-NeRF论文笔记

OR-NeRF论文笔记 文章目录 OR-NeRF论文笔记论文概述Abstract1 Introduction2 Related Work3 Background4 Method4.1 Multiview Segmentation4.2 Scene Object Removal 5 ExperimentsDatasetsMetricsMultiview SegmentationScene Object Removal 6 Conclusion 论文概述 目的&am…

【软件工程】漫谈增量过程模型:软件开发的逐步之道

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 软件工程 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言&#xff1a; 正文 增量过程模型&#xff08;Incremental Process Model&#xff09; 主要特点和阶段&#xff1a; 优点&#xff1…

TCP 协议为什么要设计三次握手 TCP 协议,是一种可靠的,基于字节流的,面向连接的传输层协议。

文章目录 TCP 协议为什么要设计三次握手TCP 协议&#xff0c;是一种可靠的&#xff0c;基于字节流的&#xff0c;面向连接的传输层协议。TCP 通信双方的数据传输是通过字节流来实现传输的客户端向服务端发送连接请求并携带同步序列号 SYN。 今天我们来谈谈tcp的三次握手 TCP 协…

Vue2+element-ui 实现select选择器结合Tree树形控件实现下拉树效果

效果&#xff1a; DOM部分 &#xff1a; // 设置el-option隐藏的下拉选项&#xff0c;选项显示的是汉字label&#xff0c;值是value // 如果不设置一个下拉选项&#xff0c;下面的树形组件将无法正常使用 <el-form-item label"报警区域" prop"monitorId"…

如何让python在手机上运行,python程序在手机上运行

大家好&#xff0c;给大家分享一下python怎么在手机上运行爱心代码&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 1. 写在前面的话 天天都在PC端运行Python代码的我&#xff0c;今天突然灵光一现&#xff0c;想着是不是能够在移动端运行P…

CSS 缩减顶部

<template><!-- mouseenter"startAnimation" 表示在鼠标进入元素时触发 startAnimation 方法。mouseleave"stopAnimation" 表示在鼠标离开元素时触发 stopAnimation 方法。 --><!-- 容器元素 --><div class"container" mou…

通用搜索的工作原理

了解 Google 的通用搜索结果为何如此重要&#xff0c;通用搜索的发展方向&#xff0c;以及它对您意味着什么。 让我们从回答一个显而易见的问题开始&#xff1a; 什么是通用搜索&#xff1f; 网络上有一些通用搜索的定义&#xff0c;但我更喜欢从马的嘴里听到这样的事情。 …