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() 
{
  //串口开启-波特率9600
  Serial.begin(9600);             //串口0,USB口连电脑
  Serial1.begin(9600);            //串口1
  Serial2.begin(9600);            //串口2
  Serial3.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);
  //串口开启-波特率9600
  Serial.begin(9600);             //串口0,USB口连电脑
  Serial1.begin(9600);            //串口1
  Serial2.begin(9600);            //串口2
  Serial3.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);
  //串口开启-波特率9600
  Serial.begin(9600);             //串口0,USB口连电脑
  Serial1.begin(9600);            //串口1
  Serial2.begin(9600);            //串口2
  Serial3.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;
    }  
    
  }
  
}

测试

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

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

相关文章

【 YOLOv5】目标检测 YOLOv5 开源代码项目调试与讲解实战(3)-训练yolov5模型(本地)

训练yolov5模型(本地) 训练文件 train.py训练如下图 一些参数的设置weights:对于weight参数,可以往Default参数中填入的参数有 cfg:(缩写)cfg参数可以选择的网络模型 data对于data hyp 超参数epochs 训练多…

全新ui自动化测试框架教学——Cypress

前言 在现阶段自动化测试领域大规模普及的是selenium及appium等常规自动化测试工具,但在其中会有遇到很多影响因素导致测试结果不理想和不准确的情况发生。在经过Darren洋对自动化测试工具调研后,发现了Cypress这一款针对端到端的自动化测试工具&#xf…

【Python基础】字符串

文章目录 [toc]什么是字符串索引示例索引越界 切片语法示例 字符串方法find()方法rfind()方法count()方法replace()方法 个人主页:丷从心 系列专栏:Python基础 什么是字符串 如下定义的变量url存储的是字符串类型的值 url www.baidu.com print(url)u…

【银行测试】金融银行-理财项目面试/分析总结(二)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 银行理财相关的项…

在Adobe Acrobat上如何做PDF文档签名

Adobe Acrobat如何做PDF文档签名?PDF文档签名是指对PDF文档进行基于证书的数字签名,类似于传统的手写签名,可标识签名文档的人员。与手写签名不同,数字签名难以伪造,因为其包含签名者唯一的加密信息。为PDF文档进行基于…

Starling-LM-7B与GPT-4:开源AI的新纪录

引言 在人工智能的前沿领域,Starling-LM-7B的出现标志着开源大型语言模型(LLM)的一大突破。与GPT-4的近距离竞争不仅展示了Starling-LM-7B的技术实力,也突显了开源社区在推动AI发展方面的重要作用。 模型特点 Starling-LM-7B&a…

java 企业工程管理系统软件源码+Spring Cloud + Spring Boot +二次开发+ 可定制化

工程项目管理软件是现代项目管理中不可或缺的工具,它能够帮助项目团队更高效地组织和协调工作。本文将介绍一款功能强大的工程项目管理软件,该软件采用先进的Vue、Uniapp、Layui等技术框架,涵盖了项目策划决策、规划设计、施工建设到竣工交付…

通过Python将PDF转为文本,快速提取PDF中的文字

快速高效地从PDF文档中提取信息对于专业人士来说非常重要。处理大量PDF文件时,将PDF转换为可编辑的文本格式可以节省时间和精力。而强大的Python语言正是在这些方面发挥其作用。利用Python中丰富的API,我们可以轻松在Python程序中将PDF转换为文本&#x…

im6ull学习总结(三)文字显示

文字显示 字符编码方式 编码与字体 一个字符以不同编码形式会保存为不同的二进制数。 ASCII American Standard Code for Information Interchange”的缩写,美国信息交换标准代码。 一个字节的 7 位就可以表示 128 个数值,在 ASCII 码中最高位永远是…

天津医科大学临床医学院专升本药学专业有机化学考试大纲

天津医科大学临床医学院高职升本科专业课考试大纲药学专业《有机化学》科目考试大纲 一、考试基本要求 本考试大纲主要要求考生对《有机化学》基本概念有较深入的了解,能够系统地掌握各类化合物的命名、结构特点及立体异构、主要性质、反应、来源和合成制备方法等…

将正规文法转化为正规式

将正规文法转化为正规式有以下几个规则: 通过一道例题来讲解: ①A-->aC|bA ②C-->bD ③D-->aC|bD| (1)首先将②带入③(不能将自身带入自身例如D-->aC|bD|,文法中带D,不能带入D) DabD|bD|(…

用电脑将图片转为excel表格有几种方法?怎么操作?

将图片转为Excel表格,一般需要借助OCR(光学字符识别)技术。OCR技术可以将图片中的文字提取出来,并转换成Excel表格中的数据。以下是几种常用的方法: 一、.使用在线OCR工具 1、打开金鸣表格文字识别(简称金鸣识别)网站…

第十一章 Stream消息驱动

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

32阵元 MVDR和DREC DOA估计波束方向图对比

32阵元 MVDR和DREC DOA估计波束方向图对比 一、原理 MVDR原理:https://zhuanlan.zhihu.com/p/457528114 DREC原理(无失真响应特征干扰相消器):http://radarst.ijournal.cn/html/2019/3/201903018.html 主要参数: 阵…

Idea如何从磁盘中应用 下载好的插件流程,安装zip压缩包。

1、将下载的插件文件(通常是一个ZIP文件)复制到IntelliJ IDEA的“plugins”文件夹中。 IDEA版本 2、重启IntelliJ IDEA。 3、在设置窗口中,选择左侧的“Plugins”。 4、选择之前复制到“plugins”文件夹中的插件文件,点击“OK”按…

大数据与人工智能|万物皆算法(第三节)

要点一:数据与智能的关系 1. 一切的核心都是数据,数据和智能之间是密切相关的。 数据是对客观现实的描述,而信息是数据转化而来的。 例如,24是数据,但说“今天的气温是24摄氏度”是信息,而说“班可以分成24…

Unity Shader UVLightReveal (紫外线显示,验钞效果)

Unity Shader UVLightReveal (紫外线显示,验钞效果) UVLight Reveal 实现验钞机的效果实现方案操作实现1.Light2.将另一个图形加入3.加上图形效果4.加上灯光的颜色自定义判定 源码 UVLight Reveal 实现验钞机的效果 大家应该都有见过验钞机验…

电脑系统坏了用U盘重装系统教程

我们平时办公、学习都会用到电脑,如果电脑系统坏了,就会影响自己正常使用电脑,这时候就可以通过U盘来重装一个正常的操作系统。如果您不知道具体的重装操作步骤,那么可以参考下面小编分享的利用U盘快速完成操作系统重装的步骤介绍…

VSCODE : SSH远程配置+免密登录

SSH基础配置 填入地址,回车 ssh userhost-or-ip 然后选择默认的配置,回车,得到以下结果: 点击链接 选择远程的系统 输入密码 免密登录 生成SSH密钥: 首先,确保你已经在本地生成了SSH密钥。你可以使…

在电脑上免费分区的 5 个有效磁盘分区软件工具

磁盘分区可能是一个脆弱而复杂的过程,磁盘崩溃或用户设备受到病毒攻击的风险很高。因此,它们很难由用户单独或手动管理。本文详细介绍了可以帮助简化磁盘分区过程的不同软件工具、它们的功能和优点。那么让我们开始吧。 什么是磁盘分区工具? …