目录
Esp32的串口发送,相对来说比串口接收要简单一些,我们第1部分先看一下ESP32的串口发送是如何实现的。第2部分我们使用一些代码用来读取esp32串口所接收到的数据。
一、串口介绍
Esp32一般有三个串口,串口0一般是用于程序的烧写和打印输出调试。所以一般情况下,我们使用其他剩下的两个串口。
二、串口测试
首先我们使用下面的程序来检测一下我们的串口是否能够正常的开启,并通过串口监视器来打印出相关的内容。
#include <HardwareSerial.h>
HardwareSerial MySerial_stm32(1);
void setup() {
Serial.begin(115200);
MySerial_stm32.begin(115200, SERIAL_8N1, 14, 15);
}
void loop() {
MySerial_stm32.println("usart test!!!");
delay(1000);
}
在进行调试的时候,我们要输出的打印信息,最好设置为英文,因为有时候中文是不兼容的,他会出现一些乱码。
我们来简单了解一下这个验证串口是否能够开启和发送的程序,首先include里面包含的是一个库Esp32串口的操作库,使用这个库,我们可以把串口投影到其他引角进行使用,接下来是串口的开启程序,后面的一步是设置波特率的操作。
而最后loop那个程序是用来在一秒钟的时间内打印一次内容的。我们要通过这个程序来了解到begin这个函数如何使用。
三、串口数据的发送和读取
然后我们看串口数据是如何读取的,首先我们的数据发送到串口中是需要有一个储存的位置,而临时的储存位置,我们称为缓存,我们首先使用一个读取和清理缓存的函数,它的功能是读取一个数据后即立刻清除这个数据。
要实现数据读取的功能,我们的思路可以是这样的:首先读取缓存区的数据,然后将读取到的数据立刻删除,然后读取到的数据,在串口监视器中打印,如果储存区没有储存的数据,我们要让串口打印出没有数据的信息,如果存在数据,我们要让他输出串口接收的数据量是什么。经过上述的思路整理,我们的最终程序是这样的。
#include <HardwareSerial.h>
HardwareSerial MySerial_stm32(1);
unsigned short i;
char temp;
//这个函数适用于清理串口读取缓存区的缓存,其实也就是用读一个删除一个的方式清理,我还会打印出有没有进行清理,清理了哪些内容
void clear_usart_buffer(){
i = MySerial_stm32.available();
if(i != 0){
Serial.print("清空串口接收区的缓存......");
Serial.println(MySerial_stm32.available());
while(i--)
MySerial_stm32.read(); //读取串口接收回来的数据但是不做处理只给与打印
}
else
Serial.println("串口接收区的缓存为空!!!");
}
/
void read_usart(){
i = MySerial_stm32.available(); //返回目前串口接收区内的已经接受的数据量
if(i != 0){
Serial.print("串口接收到的数据量为:");
Serial.println(MySerial_stm32.available());
while(i--){
temp = MySerial_stm32.read(); //读取一个数据并且将它从缓存区删除
Serial.print(temp); //读取串口接收回来的数据但是不做处理只给与打印
}
Serial.println("");
//data_analyse(); //至关重要的一步,也就是把读取回来的数据进行分步截取直接拿到我们想要的数据,我下一篇博文会讲如何自己写这个函数
}
else
Serial.println("串口接收区没有数据!!!");
}
void setup() {
Serial.begin(115200);
//串口的开启,这里还可以传一些别的参数,但是我们只传入下面四个最重要的:波特率,默认SERIAL_8N1为8位数据位、无校验、1位停止位,后面两个分别为 RXD,TXD 引脚
MySerial_stm32.begin(115200, SERIAL_8N1, 14, 15);
//MySerial_stm32.updateBaudRate(9600); //重新设置波特率;
//MySerial_stm32.end(); //失能串口,释放占用的资源
clear_usart_buffer(); //清空接收区缓存函数
}
void loop() {
MySerial_stm32.println("usart test!!!");
read_usart();
delay(500);
read_usart();
delay(500);
read_usart();
delay(500);
}
然后再看一下试验的结果。
总之我们这个是在串口调试器上发送的数据,然后并且在ESP中接收到,并从打印窗口直接显示出来,上述程序主要有两个重要的思路,分别是available和read函数的使用以及删除数据的一个操作。
四、不足
这个实验仍然存在一个缺陷,就是串口的数据接收,每次只能接收一次数据,然后你再进行发送就不能正确接收了。这也是一个比较遗憾的地方,如果哪位同学知道他是什么原因,可以在评论里告诉我。