Arduino与外部设备通信的方式均属于串行通讯。
串行通讯的概念是相对于并行通信而言的。
image.png
(当然目前来说只是概念上的认知。)
arduino硬件集成了串口、IIC、SPI三种常见的的通信方式,掌握了这三种通讯类库的方法,即可与具有响应通信接口的各种设备通信,也可以为基于这些通信方式的传感器或者模块编写驱动程序。
硬件串口通信
HardwareSerial类库的使用
hard硬
ware器物或者什么
Serial这里是串口或者串行的意思
我们理解arduino和USB接口的简单通信构成了计算机和arduino之间的串口通信,除此之外arduino还可以与其他串口设备进行通信。
image.png
TX发送端
RX接收端
通过简单的图可以理解两个设备之间共用电源接地。
实际的arduino板子上的这两个端口为数字端口0和1
1为发送端
0为接收端
板子上有很明显的标志。
串口工作原理
arduino和其他设备通信的过程中,数据传输实际上都是以数字信号(电平的高低变化)的形式进行的,当使用Serial.print()函数输出数据时,arduino的发送端会输出一连串的数字信号,这些数字信号称为数据帧。
image.png
通过电平的变化来输出数据。
HardwareSerial类库成员函数
-
available
image.png
获取串口接收到的数据个数。注意是个数而非具体的值。
Serial.available() -
begin()
初始化串口,可以配置串口的参数。
Serial.begin(speed)
Serial.begin(speed,config)
image.png
- end()
结束串口通信。
Serial.end() - find()
从串口缓冲区读取数据,直到读到指定的字符串。(很像excel中的find函数)
Serial.find(target)
返回值为布尔型,true表示找到,false没找到。 -
findUntil()
从串口缓冲区读取数值,知道读到指定的字符串或指定的停止符。
Serial.findUntil(taget,terminal)
image.png
- flush()
等待正在发送的数据发送完成。
(flush英文的意思应该使冲洗的意思,用在这里确实有点理解困难)
Serial.flush() - parseFloat()
从串口缓冲区返回第一个有效的float型数据。
Serial.parseFloat()
8.parseInt()
返回第一个整数数据、 - peek()
返回1字节的数据,但不会从接收缓冲区删除该数据。
(peek的英文为偷窥的意思,很形象,偷看你但不影响你。) - print()
将数据输出到串口。
Serial.print(val)
Serial.pirnt(val,format) - println()
- read()
从串口读取数据。会从接收缓冲区移除数据。
Serial.read() -
readBytes()
buffer,用于存储数据的数组,字符或者字节。
从接收缓冲区读取指定长度的字符,并将其存在一个数组中。
Serial.readBytes(buffer,length)
image.png
length,读取的字符长度。
(buff想到一个游戏中常见的用语,加一个buff,增加一个增益状态。) - readBytesUntil()
- setTimeout()
设定超时时长。用于设定Serial.readBytesUntil()和Serial.readBytes()的等待串口数据时间。
16.write()
输出数据到串口,以字节形式输出。
Serial.write(val)
Serial.write(str)
Serial.write(buf,len)
返回输入的字节数。
print()和write()输出方式的差异
首先简单回顾一下数组在arduino的用法。
数据类型 数组名称【数组元素的个数】
例如 int a[5];定义了一个有5个整数型元素数组。
int a[5]={1,2,3,4,5}
和
int a[5];
a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;
是等效的。
取值方法:
a[0]
/*
print()和write()的使用方法和差异
*/
float FLOAT=1.23456;
int INT=123;
byte BYTE[6]={48,49,50,51,52,53};
void setup() {
Serial.begin(9600);
Serial.println("Serial print:");
Serial.println(INT);//会输入123
Serial.println(INT,BIN);//二进制
Serial.println(INT,DEC);//十进制
Serial.println(INT,OCT);//八进制
Serial.println(INT,HEX);//16进制
Serial.println(FLOAT);//默认两位小数
Serial.println(FLOAT,0);
Serial.println(FLOAT,2);
Serial.println(FLOAT,4);
Serial.println();
Serial.println("Serial Write:");
Serial.write(INT);
Serial.println();
Serial.write("Serial");
Serial.println();
Serial.write(BYTE,6);//数组,长度为6
}
void loop() {
// put your main code here, to run repeatedly:
}
image.png
当使用print()发送数据时,发送的不是数据本身,而是将数据转换成字符,再转换成对应的ASCII码发送出去,串口见失去接收到ASCII码,则会显示对应的字符。
而当使用write()时,发送的是数据本身,但当串口见失去接收到数据后,会将数值当成ASCII而显示对应的字符。
因此123对应的字符为{。

image.png











网友评论