串口输入

Serial.read()

通过串口连接的 Arduino 在交互式设计中能够为 PC 机提供一种全新 的交互方式,比如用 PC 机控制一些之前看来非常复杂的事情,像声音和视频等。很多场合中都要求 Arduino 能够通过串口接收来自于PC 机的命令,并完成相应的功能,这可以通过 Arduino 语言中提供的 Serial.read() 函数来实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int ledPin = 13; 
int val;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
val = Serial.read();
if (-1 != val) //有数据到达时
{
if ('H' == val) {
digitalWrite(ledPin, HIGH);
delay(500);
digitalWrite(ledPin, LOW);
}
}
}

该程序运行起来之后会不断调用 Serial.read()函数从串口获得数据。Arduino 语言提供的这个函数是不阻塞的,也就是说不论串口上是否真的有数据到达,该函数都会立即返回。

Serial.read()函数每次只读取一个字节的数据,当串口上有数据到达的时候,该函数的返回值为到达的数据中第一个字符的 ASCII 码;当串口上没有数据到达的时候,该函数的返回值则为-1。

Serial.available()

函数 Serial.available()的功能是返回串口缓冲区中当前剩余的字符个数,按照 Arduino 提供的该函数的说明,串口缓冲区中最多能缓冲128 个字节。我们可以一次给 Arduino 模块发送多个字符,来验证这 一功能.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int ledPin = 13; 
int val;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
val = Serial.read();
if (-1 != val) {
if ('H' == val) {
digitalWrite(ledPin, HIGH);
delay(500);
digitalWrite(ledPin, LOW);

Serial.print("Available: ");
Serial.println(Serial.available(), DEC);
}
}
}

在这一实验中,每当 Arduino 成功收到一个字符 H,连接在数字 I/O端口管脚 13 上的发光二极管就会闪烁一次。

区别用法

1
2
3
4
5
while(Serial.available()>0)
{
data = Serial.read();
dalay(200);
}

运行该程序,当串口接收到数据时(Serial.available()>0),反复读取串口数据,并赋值给data(data = Serial.read()),一直到数据读完为止(Serial.available()=0)。