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,一经查实,立即删除!

相关文章

【Linux Shell学习笔记】Linux She的流控制

1、 if条件判断 1.1 格式 1.1.1 单分支 if [ 判断表达式 ];then 代码块 fi 1.1.2 双分支 if [ 判断表达式 ];then 代码1 else 代码2 fi 1.1.3 多分支 if [ 判断表达式1 ];then 代码1 elif [ 判断表达式2 ];then 代码2 elif [ 判断表达式3 ];then 代…

Kafka:本地设置

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

Linux重启命令介绍

下面介绍在 Linux 操作系统中重启和关闭相关的命令:shutdown、reboot、init、halt、poweroff、systemctl,你可以根据需要来选择适合的 Linux 命令关闭或重新启动系统。其中 shutdown、halt、poweroff、reboot 命令是用来停机、重启或切断电源&#xff0c…

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

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

第二百三十四回

文章目录 1.概念介绍2.使用方法2.1 NumberPicker2.2 CupertinoPicker 3.示例代码4.内容总结 我们在上一章回中介绍了"如何在任意位置显示PopupMenu"相关的内容,本章回中将介绍如何实现NumberPicker.闲话休提,让我们一起Talk Flutter吧。 1.概念…

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

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

Java解决统计有序矩阵中的负数问题

Java解决统计有序矩阵中的负数问题 01 题目 给你一个 m * n 的矩阵 grid,矩阵中的元素无论是按行还是按列,都以非递增顺序排列。 请你统计并返回 grid 中 负数 的数目。 示例 1: 输入:grid [[4,3,2,-1],[3,2,1,-1],[1,1,-1,-…

状态模式-举例

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

蓝桥圣诞树(C++)

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

[spark] 将dataframe中的数据插入到mysql

文章目录 分区写入 foreachPartition直接写入 write.jdbc()有没有插入成功在插入时记录行数 累加器 分区写入 foreachPartition 在Spark中,你可以使用foreachPartition或foreach来将DataFrame中的数据插入到MySQL数据库。以下是一个基本的Scala代码示例&#xff0c…

模板 BIEE (一):模板插入数据遇到的问题和解决方案

1 说明 1.1 环境 BIEE: Oracle Business Intelligence Enterprise Edition(Oracle商业智能企业版) 版本: OBIEE 12c Server 版本: 基于Oracle Analytics Server 6.4.0 版本 模板: 制造→生产成本→按前 10 个 GL 帐户列出的生产成本 1.2 问题 不熟悉Tools根据已插入的…

一个用于并发批量执行大量关键字的robot framework库。

这个库用于并发批量执行大量robot framework关键字。从而缩短案例执行时间。 使用concurrent.futures.ProcessPoolExecutor进程池并发执行同一个robot framework关键字很多次。 源代码如下: import concurrent.futuresfrom robot.libraries.BuiltIn import Built…

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

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

网络攻击之-暴力破解/密码喷射流量告警运营分析篇

本文从暴力破解/密码喷射的定义,暴力破解/密码喷射的流量数据包示例,暴力破解/密码喷射的suricata规则,暴力破解/密码喷射的告警研判,暴力破解/密码喷射的处置建议等几个方面阐述如何通过IDS/NDR,态势感知等流量平台的暴力破解/密码喷射类型的告警的线索,开展日常安全运营…

【SD】语法格式 分析

正确语法&#xff1a; //人物 best quality,masterpiece,solo,1boy,male focus, //人物形容 blue long hair,katana,muscular,fingerlessgloves,samurai,japanese armor,chibi,full body,blood, //背景 模型 red background,<lora:CHIBI:0.35>, 错误语法&#…

D. Unnatural Language Processing

题目&#xff1a; D. Unnatural Language Processing 每次测试的时间限制1秒钟 每次测试的内存限制256兆字节 投入标准输入 输出标准输出 露拉觉得很无聊&#xff0c;决定用这五个字母创造一种简单的语言a, b, c, d, e。有两种类型的信件: 元音—信件a和e。他们由以下人员代表…

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

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

第十一章 Stream消息驱动

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

maven命令行安装依赖测试

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

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

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