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. elasticsearch document的索引过程分析

    elasticsearch专栏:https://www.cnblogs.com/hello-shf/category/1550315.html 一.预备知识 1.1.索引不可变 看到这篇文章相信大家都 ...

  2. mysql 存储过程 (ps:用法自己看 :)

    delimiter // drop procedure if exists operate_tables // create procedure operate_tables (in db_name ...

  3. String的优化 Stringbuffer和Stringbuilder

    string 上次说到string是最好衍生出来的一种字符类型,实现原理是由char[].我们知道数组一旦创建时不可更改的,所以每一次进行字符串的拼接都是在new一个新的字符串进行添加,这样的话对内存 ...

  4. Hadoop 之 HDFS的使用

    1.列出hadoop下面的目录, hadoop fs -ls /  进入user hadoop fs ls /user 2.再usr/root下新建input目录 hadoop -mkdir inpu ...

  5. python unittest+parameterized,单元测试框架+参数化

    总要写新的自动化测试模块,在这里把demo记录下来,后面方便自己直接复制粘贴 from nose_parameterized import parameterized import unittest ...

  6. 一步步构建.NET Core Web应用程序---仓储层,业务层的实现

    前言 上一篇文章介绍了整个项目的结构,接下来向大家介绍一下 我的 仓储及业务层具体的实现思路,如果有更好的实现方式,希望大家及时指出!!! 构建过程 一,数据访问 首先在 DataProvider 中 ...

  7. 获取Android设备标识符

    Android开发中有时候因业务需要客户端要产生一个唯一的标识符使服务器能识别某台Android设备,目前一般使用三种标识符分别为DeviceId.AndroidId.MAC地址. 获取DeviceI ...

  8. freemarker属性配置

    freemarker属性配置: spring.freemarker.allow-request-override=false # Set whether HttpServletRequest attr ...

  9. JS 生成唯一值UUID

    md5加密new Date()生成的值可能不是唯一的,另一种生成唯一值的方式: getUID: function() { // 获取唯一值 return 'xxxxxxxx-xxxx-4xxx-yxx ...

  10. VR应用评测 - Luna

    Luna http://store.steampowered.com/app/605770/Luna/ Steam VR 2017年10月发布 | 开发者:Funomena | 好评率92% 一款制作 ...