arduino——串口通讯(笔记)

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类库成员函数

  1. available


    image.png

    获取串口接收到的数据个数。注意是个数而非具体的值。
    Serial.available()

  2. begin()
    初始化串口,可以配置串口的参数。
    Serial.begin(speed)
    Serial.begin(speed,config)


    image.png
  3. end()
    结束串口通信。
    Serial.end()
  4. find()
    从串口缓冲区读取数据,直到读到指定的字符串。(很像excel中的find函数)
    Serial.find(target)
    返回值为布尔型,true表示找到,false没找到。
  5. findUntil()
    从串口缓冲区读取数值,知道读到指定的字符串或指定的停止符。
    Serial.findUntil(taget,terminal)


    image.png
  6. flush()
    等待正在发送的数据发送完成。
    (flush英文的意思应该使冲洗的意思,用在这里确实有点理解困难)
    Serial.flush()
  7. parseFloat()
    从串口缓冲区返回第一个有效的float型数据。
    Serial.parseFloat()
    8.parseInt()
    返回第一个整数数据、
  8. peek()
    返回1字节的数据,但不会从接收缓冲区删除该数据。
    (peek的英文为偷窥的意思,很形象,偷看你但不影响你。)
  9. print()
    将数据输出到串口。
    Serial.print(val)
    Serial.pirnt(val,format)
  10. println()
  11. read()
    从串口读取数据。会从接收缓冲区移除数据。
    Serial.read()
  12. readBytes()
    从接收缓冲区读取指定长度的字符,并将其存在一个数组中。
    Serial.readBytes(buffer,length)

    buffer,用于存储数据的数组,字符或者字节。
    image.png

    length,读取的字符长度。
    (buff想到一个游戏中常见的用语,加一个buff,增加一个增益状态。)
  13. readBytesUntil()
  14. 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对应的字符为{。

你可能感兴趣的:(arduino——串口通讯(笔记))