第四章——总结和拓展

1. 总结

整体来说,不论是蓝牙的使用还是 UART 的使用,在单片机中都非常地简单,没有什么复杂的寄存器操作和配置等。在 Arduino 框架下,你只要会用Serial,一般就可以用好蓝牙,其他框架也类似,使用起来不会很难。

其实 Serial 还有其他几个重要的函数,如果用得好,可以实现很多实用的功能。

下面是一个前面我讲到的 WS2812 灯板,有关蓝牙部分的代码,大家可以参考一下:

void getSerial() {
  if (Serial.available()) {
    uint8_t message = Serial.read();// 获取第一个命令
    uint8_t parameter = Serial.parseInt();// 获取第一个命令的参数

    /* 设置模式的命令 */
    if (message == 'M' || message == 'm') {
      switch (parameter) {
        case 0: Mode = 0; break;
        case 1: Mode = 1; break;
        case 2: Mode = 2; break;
        case 3: Mode = 3; break;
      }
    }

    /* 打开/关闭灯板的命令 */
    else if (message == 'S' || message == 's') {
      switch (parameter) {
        case 0: Dispaly_Status = false; break;
        default: Dispaly_Status = true; break;
      }
    }

    /* 设置灯板亮度的命令 */
    else if (message == 'B' || message == 'b') {
      BRIGHTNESS = parameter;
      if (Mode == 0 || Mode == 2) {
        FastLED.setBrightness(BRIGHTNESS);
      }
    }

    /* 设置显示时间颜色的命令 */
    else if (message == 'R' || message == 'r') {
      R = parameter;
      G = Serial.parseInt();
      B = Serial.parseInt();
    }

    /* 设置时间的命令 */
    else if (message == 'H' || message == 'h') {
      if (Mode == 2) {
        Hour = parameter;
        Minute = Serial.parseInt();
        SetTime();
      }
    }
  }
}

2. 拓展

其实,在学完有关 UART 的通信原理之后,我们是完全可以自己写一个 UART 通信的底层驱动的,我们一般称之为软串口,因为相对于硬件支持的串口通信,通过软件编写的串口通信一般速度会低一些,同时在时序上也没有硬件支持的串口通信精准、稳定。不过我们常用的波特率使用起来是没有问题的。

在 Arduino 框架中,有一个支持的官方库SoftwareSerial.h,它的使用和Serial几乎一致,而且它支持使用任何引脚作为 TX 和 RX 引脚。支持常用的波特率,最高可以设置 115200。你可以创建多个软串口,但同时只能使用一个。

下面是一个使用了软串口的实例:

#include <SoftwareSerial.h>

SoftwareSerial serial(10, 11); // RX:10,TX:11
void setup(){
  serial.begin(38400);
}

void loop(){
  serial.println("Hello world!");
  delay(1000);
}

其实呢,通过软串口,我们可以把 HC-05 接到其他引脚上,这样我们就可以不占用硬件串口,不需要每次更新代码都把 HC-05 拔下来。

同时呢,我们还可以通过软串口实现 AT 配置,也就是通过读取硬件串口的数据,然后借助软件串口将命令发送给 HC-05。这样我们就不需要 USB 转串口,直接使用 Arduino Uno 实现 AT 命令配置。这样就使得整个过程变得简单很多。

下面是一个我使用的借助软串口发送 AT 命令给 HC-05 的代码:

#include <SoftwareSerial.h>

SoftwareSerial serial(2, 3); // RX:2,TX:3

void setup() {
  Serial.begin(38400);
  serial.begin(38400);
  while (!Serial);
}

void loop() {
  /* 读取硬件串口的AT命令 */
  if (Serial.available()) {
    String message = "";
    while (Serial.available()) {
      message += (char)Serial.read();
    }
    // 发送命令给软串口,也就是发送给HC-05
    serial.print(message);
  }

  /* 读取软串口,也就是HC-05的应答数据 */
  if (serial.available()) {
    // 读取HC-05数据,同时发送到硬件串口
    String message = "";
    while (serial.available()) {
      message += (char)serial.read();
    }
    Serial.print(message);
  }
}