Arduino串口通信

我的博客

这是一个 Font Awesome 图标示例:

串口通讯原理

Arduino通讯串口:Arduino的串口通常称为UART或USART,通过0(RX)和1(TX)引脚以及USB 端口,来和其它设备进行通信。

UART(Universal Asynchronous Receiver/Transmitter):UART是通用异步收发器,采用异步串行通信协议,通过信号线把需要发送的数据以二进制的形式发出,高电平为数据“1”,低电平为数据“0”。

通信传输线:串口通常会有三根线来完成通讯,分别是地线、发送线、接收线。串口通信是异步的,能够在一根线上发送数据同时在另一根线上接收数据,其他线用于握手。

数据帧:Arduino用Serial.print和Serial.println函数发送数据时候,其实是发出一连串数字信号,这些数字信号称为数据帧。数据帧通常由四个部分组成,分别是起始位、数据位、校验位和停止位。

起始位:数据帧开始传输的信号,通常起始位电平为低电平。
数据位:包含了实际发送的数据,Arduino默认使用8位数据,每次可以传输1B数据。
校验位:数据检错的方式,可以设置为奇校验和偶校验,Arduino默认无校验位。
停止位:表示该段数据帧传输结束,通常停止位都是高电平。

串口通讯缓冲区:Arduino的USB端口有串口寄存器,可以用来暂存电脑从USB发送的数据。Arduino从串口寄存器读取的速度比串口发送数据的速度快,所以串口通讯读取数据前需要加一定延时。和电脑通信的时候,Arduino UNO的串口寄存器空间默认是63帧的数据帧大小,超出后信息会挤掉前面的信息。

串口通讯函数

Serial 类:通过 Serial 类来使用开发板上的UART串口,只需要指定波特率,就能使用了。

波特率(Baud Rate):在信息传输通道中,携带数据信息的信号单元叫码元,单位时间内通过信道传输的码元数称为码元传输速率,简称波特率。常用的波特率为9600、115200、4800等,波特率越大表明通信的速率越快。。当传输的码元信息量刚好为1比特的时候,波特率等于比特率。通信双方需要使用一致的的波特率才能正常通信。

Serial.begin()

函数作用:开启串口。
使用方法:speed为波特率;config为设置数据位、校验位和停止位。

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

Serial.end()

函数作用:禁止串口传输,此时串口0(RX)和1(TX)引脚可以作为数字引脚使用。

Serial.print()

函数作用:串口输出数据,写入字符数据到串口。
使用方法:val是打印的值;config输出数据格式,BIN(二进制)、OCT(八进制)、DEC(十进制)、HEX(十六进制)等。

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

Serial.println()

函数作用:串口输出数据并换行。
使用方法:

Serial.println(val)
Serial.println(val, format)

Serial.available()

函数作用:判断串口缓冲区的状态,返回从串口缓冲区读取的字节数。

Serial.read()

函数作用:读取串口数据,一次读一个字符,读完后删除已读数据;当没有可读数据时返回-1,整数类型。

Serial.peek()

函数作用:读取串口数据,一次读一个字符,读完后不删除;当没有可读数据时返回-1,整数类型。。

Serial.readString()

函数作用:每次读取一个字符串,返回一个String类型。

Serial.readStringUntil()

函数作用:每次读取一个字符串,知道遇到截止字符,返回一个String类型。
使用方法:inByte为截止字符。

Serial.readStringUntil(inByte)

串口通讯示例

处理一个简单的指令。

示例代码的解释:往串口每次输入一串指令“a1”后,Arduino返回“YES”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
String str;

void setup() {
Serial.begin(115200);// 设置波特率,上位机的波特率要保证相同,不然无法识别
str="";
}

void loop() {
delay(100);//等待100ms=0.1s,加延时是因为Arduino从串口寄存器读取的速度比串口发送数据的速度快
while (Serial.available() > 0)
{
str += char(Serial.read());// read是剪切,而不是复制
}
if(str=="a1\0"){
Serial.println("YES");
}
str="";
}