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  9

void 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引脚,点亮LED
  for(int i=LED_START;i<=LED_END;i++){
    digitalWrite(i,LOW);//LED亮
  }
}

/**
* @Desc 关闭LED
*/
void led_Off(){
  //从引脚2到9引脚,关闭LED
  for(int i=LED_START;i<=LED_END;i++){
    digitalWrite(i,HIGH);//LED灭
  }
}

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

4.总结

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

Arduino学习笔记⑥ 硬件串口通信的更多相关文章

  1. ARM学习笔记15——串口通信基本原理【转】

    计算机串口基本理论 1.什么是串口? 2,什么是RS-232? 3,什么是RS-422? 4,什么是RS-485? 5,什么是握手? 1,什么是串口? 串口是计算机上一种非常通用的设备通信的协议(不要 ...

  2. stm32学习笔记之串口通信

    在基础实验成功的基础上,对串口的调试方法进行实践.硬件代码顺利完成之后,对日后调试需要用到的printf重定义进行调试,固定在自己的库函数中. b) 初始化函数定义: void USART_Confi ...

  3. stm32寄存器版学习笔记02 串口通信

    stm32F103RCT6提供5路串口.串口的使用,只要开启串口时钟,设置相应的I/O口的模式,然后配置下波特率.数据位长度.奇偶校验等信息,即可使用. 1.串口的配置步骤 ①串口时钟使能 APB2外 ...

  4. Arduino学习笔记① 初识Arduino

    1.前言     近段时间,博主陆续更新了ESP8266学习笔记,主要开发平台是Arduino.但是,对于很多无基础的初学者来说,甚至不了解Arduino是什么.因此,博主决定加入一个Arduino学 ...

  5. stm32学习笔记----双串口同时打开时的printf()问题

    stm32学习笔记----双串口同时打开时的printf()问题 最近因为要使用串口2外接PN532芯片实现通信,另一方面,要使用串口1来将一些提示信息输出到上位机,于是重定义了printf(),使其 ...

  6. Arduino和C51之串口通信

    技术:51单片机.Arduino.串口通信   概述 本文主要讲解串口通信技术的使用方法,并通过串口点灯实验介绍了51单片机和Arduino串口的使用,为初学者学习串口知识提供帮助 详细 代码下载:h ...

  7. 基于Arduino和python的串口通信和上位机控制

    引言 经常的时候我们要实现两个代码之间的通信,比如说两个不同不同人写的代码要对接,例如将python指令控制Arduino控件的开关,此处使用串口通信是非常方便的,下面笔者将结合自己踩过的坑来讲述下自 ...

  8. ucos实时操作系统学习笔记——任务间通信(消息)

    ucos另一种任务间通信的机制是消息(mbox),个人感觉是它是queue中只有一个信息的特殊情况,从代码中可以很清楚的看到,因为之前有关于queue的学习笔记,所以一并讲一下mbox.为什么有了qu ...

  9. Arduino学习笔记A6(补充) - 在串口读取多个字符串,并且转换为数字数组

    功能如题目. 在串口收到逗号分割的6串数字比如 100,200,45,4,87,99 然后在6个PWM端口3, 5, 6, 9, 10, 11输出对应PWM值 代码注释很详细了,就不再说明了. ARD ...

随机推荐

  1. @RequestMapping 用法详解之地址映射(转)

    这段时间项目中用到了RESTful模式来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没有加任何注解),查看了提交方式为application/js ...

  2. Mysql学习笔记整理之索引

    索引的概念: 索引是一个分散存储的数据结构(检索)对数据库表中一列或多列的值进行排序 为什么要用索引? 索引能极大的减少存储引擎需要扫描的数据量 索引可以把随机IO变成顺序IO 索引可以帮助我们进行分 ...

  3. 素数路径Prime Path POJ-3126 素数,BFS

    题目链接:Prime Path 题目大意 从一个四位素数m开始,每次只允许变动一位数字使其变成另一个四位素数.求最终把m变成n所需的最少次数. 思路 BFS.搜索的时候,最低位为0,2,4,6,8可以 ...

  4. WinServer 2012 R2 安装python3.6时出现错误:0x80240017 导致安装失败

    解决方法: 依次检查并更新补丁:KB2919442,KB2919355,kb2999226 KB2919442:https://www.microsoft.com/zh-cn/download/det ...

  5. Chrome 调试AJAX请求返回的JS脚本

    有时候会使用AJAX请求加载局部的Html页面,这个时候如果想调试局部页面中的js就比较麻烦,现在暂时发现了两种方法.第一种是在js代码中想要断点的地方加debugger,这样代码执行到此处会进入断点 ...

  6. mysql 排序规则

    一.对比 1.utf8_general_ci 不区分大小写,utf8_general_cs 区分大小写 2.utf8_bin: compare strings by the binary value ...

  7. 玩转 SpringBoot 2 快速整合拦截器

    概述 首先声明一下,这里所说的拦截器是 SpringMVC 的拦截器 HandlerInterceptor.使用SpringMVC 拦截器需要做如下操作: 创建拦截器类需要实现 HandlerInte ...

  8. java基础之循环遍历List和Map

    List和Map是在编程中使用的最频繁的集合类型了,每天都不知道要见它们多少面.在这里介绍下这两种类型的循环遍历,以供学习参考和使用. 一.List 遍历List一般有三种方法,如下: List< ...

  9. html 试题试卷(包含latex)下载成word - - java

    html 试题试卷(包含latex)下载成word 主要目的: 分享将带latex的html格式的试题试卷以word的格式下载,并且加一些灵活的排版样式 接受群众的检阅,获得反馈 骗取打赏,或者git ...

  10. MongoDB 学习笔记之 索引选项和重建索引

    索引选项: {background:true}在后台创建索引,索引在构建过程中,其他客户端仍然可以查询数据,不会阻塞. db.comments.createIndex({anonymous: 1},{ ...