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/2659301.html

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

相关文章

鸿蒙开发之android对比开发《基础知识》

基于华为鸿蒙未来可能不再兼容android应用,推出鸿蒙开发系列文档,帮助android开发人员快速上手鸿蒙应用开发。 1. 鸿蒙使用什么基础语言开发? ArkTS是鸿蒙生态的应用开发语言。它在保持TypeScript(简称TS)基本语法风…

记录 | ubuntu源码编译python3.7.3(指定版本)

一、安装依赖包 sudo apt-get install -y make build-essential libssl-dev zlib1g-dev sudo apt-get install -y libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm sudo apt-get install -y libncurses5-dev libncursesw5-dev xz-utils tk-dev 二、从Python网…

二叉树数据结构:深入了解二叉树的概念、特性与结构

在探索栈和队列之后(大家可以移步至我的数据结构专栏):T-rLN的数据结构专栏 我们转向了更为复杂而有趣的数据结构——二叉树。本文将引领我们进入二叉树的世界,从最基本的概念和结构开始,逐步深入了解二叉树的顺序结构…

听GPT 讲Rust源代码--src/tools(30)

File: rust/src/tools/clippy/clippy_lints/src/casts/cast_slice_from_raw_parts.rs 在Rust源代码中,cast_slice_from_raw_parts.rs文件位于rust/src/tools/clippy/clippy_lints/src/casts/目录下,它是Clippy工具中的一个lint,用于检查通过f…

【技巧】7z分卷压缩文件如何解压?

7z分卷压缩格式是一种常用的文件压缩格式,可以在压缩文件时将文件分割成多个独立的文件,更方便储存或者传输。那压缩好的7z分卷文件要如何解压呢?不清楚的小伙伴一起来看看吧。 想要解压7z分卷压缩文件,需要用到支持7z格式的解压…

Springboot拦截器及统一异常处理

文章目录 一、Java中异常相关概念1、异常类2、异常处理方法3、注意事项4、自定义异常 二、配置全局异常处理1、统一返回体定义2、定义异常处理实现类3、全局异常处理类 三、Springboot拦截器1、定义拦截器2、注册拦截器 四、验证效果 一、Java中异常相关概念 1、异常类 Throw…

微信小程序登录用户信息、手机号、照片等隐私api不能使用解决的方案

问题 突然小程序不能使用用户信息、手机号、图片上传的功能 例如这种错误 "getUserProfile:fail api scope is not declared in the privacy agreement" 定位问题 经过微信社区查询得知 为规范开发者的用户个人信息处理行为,保障用户的合法权益&…

(2)llvm解析器和抽象语法树

解析器的输出是抽象语法树 对于数字字面量,创造了一个实例,并捕捉 变量捕捉函数名;二元表达式捕捉运算符;函数调用捕捉函数名和函数调用参数 函数原型和函数定义 构建语法树 getNextToken会从输入流里拿一个token,Cur…

2023年中职“网络安全”——B-5:网络安全事件响应(Server2216)

B-5:网络安全事件响应 任务环境说明: 服务器场景:Server2216(开放链接) 用户名:root密码:123456 1、黑客通过网络攻入本地服务器,通过特殊手段在系统中建立了多个异常进程,找出启…

医院安全(不良)事件报告系统源码 支持二次开发、支持源码交付

医疗不良事件报告系统源码旨在建立全面的、统一的医疗不良事件标准分类系统和患者安全术语,使不良事件上报管理更加标准化和科学化。通过借鉴国内外医疗不良事件报告系统的先进经验,根据医疗不良事件的事件类型、处理事件的不同部门,灵活设置…

How to Develop Word Embeddings in Python with Gensim

https://machinelearningmastery.com/develop-word-embeddings-python-gensim/ 本教程分为 6 个部分;他们是: 词嵌入 Gensim 库 开发 Word2Vec 嵌入 可视化单词嵌入 加载 Google 的 Word2Vec 嵌入 加载斯坦福大学的 GloVe 嵌入 词嵌入 单词嵌入是一种提供单词的…

Android Jetpack之用Room+ViewModel+LiveData实现增删改查数据(createFromAsset())

文章目录 一、Room简介二、用RoomViewModelLiveData增删改查数据三、下载源码 一、Room简介 Room是Google推出的数据库框架,是一个 ORM (Object Relational Mapping)对象关系映射数据库、其底层还是对SQLite的封装。 Room包含三个主要组件: 数据库类&…

润和软件HopeStage与亚信安全云主机深度安全防护系统完成产品兼容性互认证

近日,江苏润和软件股份有限公司(以下简称“润和软件”)HopeStage 操作系统与亚信科技(成都)有限公司(以下简称“亚信安全”)云主机深度安全防护系统完成兼容性测试。 测试结果表明,企…

golang并发安全-sync.map

sync.map解决的问题 golang 原生map是存在并发读写的问题,在并发读写时候会抛出异常 func main() {mT : make(map[int]int)g1 : []int{1, 2, 3, 4, 5, 6}g2 : []int{4, 5, 6, 7, 8, 9}go func() {for i : range g1 {mT[i] i}}()go func() {for i : range g2 {mT[…

Mysql 将数据按照年月分组 统计

要的效果: 方案: ① 使用 DATE_FORMAT(date, ‘%Y-%m-%d’) 函数 DATE_FORMAT 怎么去使用格式化,取决于后面的格式模式。 我们这里只是想区分到年 、月, 所以我们的sql 里面使用 %Y-%m : SELECT DATE_FORMAT(create_time, %Y-%m) AS …

Bind for 0.0.0.0:2379 failed: port is already allocated

1、执行命令docker-compose -p docker-apisix up -d 报错 Error response from daemon: driver failed programming external connectivity on endpoint docker-apisix-etcd-1 (2a92a0cefff9194fcd1dad4bdeabf4201d9047ec2633eda455c6e46528668af4): Bind for 0.0.0.0:2379 fa…

c++输入输出流和文件操作总结

目录 一、c的输入输出流——> 指的是字节流的数据传送;具有类型安全和可扩展性。 二、流的出入路径 三、c流类库 ①概览 ②标准输出流: ③标准输入流: 四、文件操作(ascii文件和二进制文件) 五、字符串流(或称…

【力扣题解】P94-二叉树的中序遍历-Java题解

👨‍💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【力扣题解】 文章目录 【力扣题解】P94-二叉树的中序遍历-Java题解🌏题目描述💡题解&#x1f30f…

oracle与mysql的分析函数(窗口函数)

分析函数定义 在SQL语句中,很多查询语句需要进行GROUP BY分组汇总,但是一旦经过分组,SELECT返回的记录数就会减少。为了保留所有原始行记录,并且仍可以进行分组数据分析,分析函数应运而生。 Oracle 8i 版本开始支持窗…

C++实现令牌桶过滤算法

什么是令牌桶算法 令牌桶算法通过限制令牌桶的固定容量,实现对资源以及流量的延迟控制。请求者需先获取令牌,方可执行动作。若令牌桶内具有足够令牌便可通过消耗相等数量放过请求;而若令牌不足,则会拒绝请求。 该算法具备平滑的…