第八章——串口通信 UART

1. Arduino 的 Serial

Arduino AVR 开发板只有一个 UART,直接和 USB 相连。当然,你也可以通过使用 RX(D0)和 TX(D1)进行串口通信,但是,同时只能使用一个,任意一处被占用都无法正常通信。

在 mega 板上,一共有 4 个串口,默认的 UART 和 USB 相连,因此你除了可以使用Serial之外,还可以使用Serial1Serial2Serial3

2. begin

语法:

Serial.begin(speed);
Serial.begin(speed, config);

speed 参数:设置波特率,常用的波特率有 300,600,1200,2400,4800,9600,14400,19200,28800,38400,57600,115200 等。

config 参数:Arduino 默认设置是一个起始位,一个终止位,没有校验位,你可以通过第二个可选参数设置进行设置,下面是可供选择的参数:

  • SERIAL_5N1
  • SERIAL_6N1
  • SERIAL_7N1
  • SERIAL_8N1 (the default)
  • SERIAL_5N2
  • SERIAL_6N2
  • SERIAL_7N2
  • SERIAL_8N2
  • SERIAL_5E1: even parity
  • SERIAL_6E1
  • SERIAL_7E1
  • SERIAL_8E1
  • SERIAL_5E2
  • SERIAL_6E2
  • SERIAL_7E2
  • SERIAL_8E2
  • SERIAL_5O1: odd parity
  • SERIAL_6O1
  • SERIAL_7O1
  • SERIAL_8O1
  • SERIAL_5O2
  • SERIAL_6O2
  • SERIAL_7O2
  • SERIAL_8O2

3. print/println

语法:

Serial.print(val);
Serial.print(val, format);

val 参数:需要输出的值,该值可以是 int,long,flaot,double,char,String 等等。

format 参数:需要输出的格式,可以是以下四个参数:

  • BIN 输出二进制
  • OCT 输出八进制
  • DEC 输出十进制
  • HEX 输出十六进制

如果输出的是浮点数,第二个可选参数可以用来限制输出的小数位。

下面是 print 的一些实例:

语句输出结果
Serial.print(78,BIN)1001110
Serial.print(78, OCT)116
Serial.print(78, DEC)78
Serial.print(78, HEX)4E
Serial.print(1.23456, 2)1.23

pintln 和 print 用法基本相同,只是 println 会在结束输出后自动换行。

下面是一个使用串口输出电位器模拟值的程序:

int potentiometer = A0;

void setup() {
  Serial.begin(9600);
  pinMode(potentiometer, INPUT);
}

void loop() {
  int value = analogRead(potentiometer);
  Serial.println(value);
  delay(100);
}

4. available

语法:

Serial.available();

该函数返回值为 1 表示当前串口缓存区有数据可以读取,返回值为 0 表示缓存区没有数据。

5. read

语法:

Serial.read();

读取串口缓存区的一个字节。

下面是读取串口输入的内容,再以不同格式输出的一个实例:

void setup() {
  Serial.begin(9600);
}

void loop() {
  if (Serial.available()) {
    uint8_t value = Serial.read();
    Serial.println(value, BIN);
    Serial.println(value, OCT);
    Serial.println(value, DEC);
    Serial.println(value, HEX);
  }
}

有关 Arduino 串口通信的其他函数可以参考以下内容:Arduino Serial Function Lists

这里只对 Arduino 的串口通信进行简单介绍,有关 UART 的通信机制及更多内容,请参考后面的章节(通讯专题/UART)