Arduino学习笔记⑥ 硬件串口通讯

1.前言

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

  • 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。oop

  • 串口固然能够用来和符合串口通讯协议的模块进行通讯,好比 蓝牙模块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灯闪烁提示,如没有意外,应该显示以下(我本身随便写的):ui

image

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灭
  }
}

image

个人实验结果就是灯根据个人指令亮灭.debug

4.总结

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

相关文章
相关标签/搜索