文章目录

  • 1.前言
  • 2.常用串口函数
    • 2.1 begin —— 启用串口
    • 2.2 end —— 停用串口
    • 2.3 print、println、printF —— 打印输出数据
    • 2.4 read —— 读取传入的串口的数据
    • 2.5 available —— 当前缓冲区中接收到的数据字节数
  • 3.实验
    • 3.1 与电脑串口通信,读取数据并原样返回数据
    • 3.2 串口控制开关灯
  • 4.总结

1.前言

    Ardunio与计算机通信最常用的方式就是串口通信。在Arduino控制器上,串口都是位于Rx和Tx两个引脚,Arduino的USB口通过一个转换芯片与这两个串口引脚连接。该转换芯片会通过USB接口在计算机上虚拟出一个用于Arduino通信的串口。当你使用串口功能的时候,就意味着你不能引用串口引脚作为输入或者输出。
    要想使串口与计算机通信,首先需要先启用串口功能,初始化Arduino的串口通信功能,也就是:

  • Serial.begin(speed)

    其中参数speed指串口通信波特率,用于设定串口通信速率的参数。串口通信双方必须使用相同的波特率才可以正确通信。
    波特率是一个衡量通信速度的参数,表示每秒传送的bit的个数。如9600波特表示每秒发送9600bit的数据,常用以下波特率:300,600,1200,2400,4800,9600,14400,19200,28800,38400,57600,115200。波特率高表示串口通信速率越快。
    你可以使用Arduino IDE内置的串口监视器与Arduino板子通信。点击工具栏上的串口监视器按钮(注意设置相同波特率),我们接下来的实验就是用到它。
    Arduino Mega上有三个额外的串口:Serial1,Serial2,Serial3。若有使用这三对引脚与您的个人电脑通信,你需要一个额外的USB转串口适配器;若要用它们来与外部的TTL串口设备进行通信,将Tx引脚连接到设备Rx引脚,将Rx引脚连接到设备的Tx引脚,将GND连接到设备的GND。

2.常用串口函数

    接下来介绍一下串口常用函数。

2.1 begin —— 启用串口

  • 打开串口,设置波特率。
  • 对于Arduino Mega:Serial1.begin(speed) Serial2.begin(speed) Serial3.begin(speed)

2.2 end —— 停用串口

  • 停用串口通信,使Rx和Tx引脚用于一般输入输出;
  • 要重新使用串口通信,需要Serial.begin()语句;
  • 对于Mega:Serial1.end() Serial2.end() Serial3.end();

2.3 print、println、printF —— 打印输出数据

  • 打印输出数据 Serial.println 函数会在输出完指定数据后,再输出一组回车换行符。

2.4 read —— 读取传入的串口的数据

  • 读取传入的串口的数据,每次都会返回1字节的数据。
  • 在使用串口时,Arduino会在SRAM中开辟一段大小为64B的空间,串口接收到的数据都会被暂时存放在该空间中,称这个存储空间为缓冲区。
  • 当调用read()函数时,就会从缓冲区中取出1B的数据。

2.5 available —— 当前缓冲区中接收到的数据字节数

  • 当前缓冲区中接收到的数据字节数。通常我们都要判断缓存区中是否有数据,然后才调用read方法。

3.实验

那么,问题来了,串口到底有什么用?根据我自己的经验:

  • 对于习惯于希望可以看到调试过程的我来说,我喜欢用串口打印调试信息,那么可能就有人问,一般情况下只有在需要调试的时候才显示调试结果,那么正式环境我又不想有调试信息,应该怎么办?其实,可以像下面这样:
#define BTSerial Serial1
#define MyDebugSerial Serial//该条语句用于使能DEBUG输出信息,屏蔽掉就不会输出debug调试信息
#define DEBUG#ifdef DEBUG
#define DBGLN(message)    MyDebugSerial.println(message)
#else
#define DBGLN(message)
#endif

当不需要调试信息时就注释掉 #define DEBUG。

  • 串口当然可以用来和符合串口通信协议的模块进行通信,比如 蓝牙模块HC06 Wifi模块ESP系列等等。这就意味着我们可以基于硬件串口功能区开发我们所需功能。

3.1 与电脑串口通信,读取数据并原样返回数据

/**
* @Desc  读取数据并原样返回数据
* @author 单片机菜鸟
* @Date  2016/12/10
*/void setup() {// 初始化串口Serial.begin(9600);//等待串口准备好while(!Serial);
}void loop() {//如果缓冲区中有数据,则读取并输出if(Serial.available()>0){char ch = Serial.read();Serial.print(ch);}
}

打开Arduino IDE自带的串口监视器进行调试(要设置相同波特率),当进行串口通信时,Arduino控制器上就会看到标有RX TX的2个LED灯闪烁提示,如没有意外,应该显示如下(我自己随便写的):

3.2 串口控制开关灯

/**
* @Desc  串口控制开关灯
* @author 单片机菜鸟
* @Date  2016/12/10
* 注意:LED的一端接到5V,另外一端接到输出引脚,低电平亮
*/#define LED_START 2
#define LED_END  9void setup() {// 初始化串口Serial.begin(9600);//等待串口准备好while(!Serial);led_Init();
}void loop() {//如果缓冲区中有数据,则读取并输出if(Serial.available() > 0){char ch = Serial.read();Serial.print(ch);//开灯if(ch == 'a'){led_On();}else if(ch == 'b'){led_Off();}}
}/**
* @Desc 初始化LED
*/
void led_Init(){// 将2-9号引脚设置为输出状态for(int i=LED_START;i<=LED_END;i++){pinMode(i,OUTPUT);digitalWrite(i,HIGH);//灭掉LED}
}/**
* @Desc 打开LED
*/
void led_On(){//从引脚2到9引脚,点亮LEDfor(int i=LED_START;i<=LED_END;i++){digitalWrite(i,LOW);//LED亮}
}/**
* @Desc 关闭LED
*/
void led_Off(){//从引脚2到9引脚,关闭LEDfor(int i=LED_START;i<=LED_END;i++){digitalWrite(i,HIGH);//LED灭}
}

我的实验结果就是灯根据我的指令亮灭.

4.总结

总体来说,这节课不难,在理解串口基础上运用串口提供的一些函数就能进行基本的串口通信开发。

Arduino学习笔记⑥ 硬件串口通信相关推荐

  1. 【K210】K210学习笔记五——串口通信

    [K210]K210学习笔记五--串口通信 前言 K210如何进行串口通信 K210串口配置 K210串口发送相关定义 K210串口接收相关定义 K210串口发送接收测试 完整源码 前言 本人大四学生 ...

  2. 51单片机学习笔记-6串口通信

    6 串口通信 [toc] 注:笔记主要参考B站江科大自化协教学视频"51单片机入门教程-2020版 程序全程纯手打 从零开始入门". 注:工程及代码文件放在了本人的Github仓库 ...

  3. 嵌入式学习笔记7——串口通信

    并行通信和串行通信的区别: 并行通信通常是将数据字节的各位用多条数据线同时进行传送 . 串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送. 异步 不要求收发双方时钟的严格一致,实现容易, ...

  4. 51单片机学习笔记(串口通信 LED点阵屏 DS1302)

    四.串口通信 1.基本概念 通信中最重要的两个方面: 信息表示和解析方法: 信息的传输方法. 通信双方事先需要约定好信息的表示方法和解析方法,做到一致,否则信息不能有效传递. 信号的传输方法是指经过编 ...

  5. C51单片机学习笔记之串口通信

    简介 串口通信就是单片机和pc之间的一种通信方式. 通信方式:并行,串行,同步,异步(最常用的) 传输方向:单工,半双工(不同时间),全双工 基本结构 ​ 相关寄存器 SCON串口控制寄存器(主要用方 ...

  6. STM32学习笔记-USART串口通信+与野火STM32F407板载ESP8266进行通信

    文章目录 STM32USART介绍 STM32USART框图 第一部分 第二部分 第三部分 发送器 时序图 接收器 第四部分 软件部分: STM32通过USART与板载ESP8266通讯实验 板载WI ...

  7. Arduino学习笔记:串口中断

    实习任务需要实现一个优先级变换,因此在此要自学一下串口中断. 1 为何要中断 计算机读取信息有两种方法:查询和中断.查询即为不断读取,直到得到数据.而中断为只有接到数据后才会响应.在Arduino中, ...

  8. Arduino学习笔记2

    一.蜂鸣器输出实验 1.源代码 int buzzer=2;//设置控制蜂鸣器的数字口对应板子上2口 void setup() { pinMode(buzzer,OUTPUT);//设置对应的输出模式 ...

  9. Arduino学习笔记(1):太极创客 第一部分

    Arduino学习笔记 太极创客 第一部分 笔记 1-5 变量 1-6 程序结构 1-7 变量操作 1-8/1-9 程序函数 1-10/1-11 数字输出 1-12 面包板 1-13/1-14 数字输 ...

最新文章

  1. Oracle学习操作(6)函数与存储过程
  2. 实现Redis用户会话 - 2
  3. HTML--HTML对象的关于位置和大小的属性的图解
  4. 少儿编程100讲轻松学python(六)-pycharm怎么汉化?
  5. android触屏音文件地址,Android音视频-音频采集
  6. pmwiki 安装和基本配置
  7. mysqlreport 文档
  8. springboot15 集成Druid(德鲁伊)
  9. centos telnet提示No route to host
  10. 【Flutter】Dart中的var、final 和 const基本使用
  11. linux DNS 简单配置
  12. SQL 怎么创建一个只有查询数据库用户权限呢
  13. (十)stm32 GPIO口复用,重映射 RCC_APB2Periph_AFIO
  14. 第一章课后习题源代码(笔记自用)
  15. lan和adsl是什么信号_光纤、以太网、ADSL上网有什么区别?
  16. Android仿射密码破译app
  17. 对求一个数的各个位数的理解
  18. 【Cocos2dx】利用导演类、场景类完成重新开始游戏、暂停游戏、关闭游戏功能
  19. Google Earth Engine(GEE)扩展——制作的GEE app的误区
  20. 中南大学python试卷_中南大学考研常见问题汇总

热门文章

  1. mysql当前时间往后推一周_一篇文章搞定Mysql日期时间函数
  2. 转载自android 开发--抓取网页解析网页内容的若干方法(网络爬虫)(正则表达式)
  3. Commercial terms
  4. 【正点原子FPGA连载】第十九章FreeRtos Hello World实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南
  5. 微信小程序web-view嵌入h5———微信名包含emoji表情,导致数据无法存入数据库
  6. 如何在新版谷歌中加载crx拓展程序(已解决无法拖入加载、重启插件消失的问题)
  7. 要找个像我哥哥那样的人当男朋友
  8. 台式电脑计算机怎么打不开怎么回事,电脑主机启动不了怎么解决?解决电脑主机打不开问题...
  9. 静电计算机故障的原因,电脑出现故障的原因
  10. [RK3399][Android7.1] 调试笔记 --- I2S1工作输出是12MHz问题