ESP32 串口的使用(发送和接收)

首先串口这种很重要的东西应该早点讲的,但是串口发送简单,读取起来是要废一番脑筋的,所以下面有两个部分,第一部分只有ESP32的几个串口使能和发送的讲解,第二部分就包含串口接收,我们将要...

首先串口这种很重要的东西应该早点讲的,但是串口发送简单,读取起来是要废一番脑筋的,所以下面有两个部分,第一部分只有ESP32的几个串口使能和发送的讲解,第二部分就包含串口接收,我们将要把读取的数据再由我们的调试串口打印出来。

我们将要使用到HardwareSerial这个自带的库,Arduino IDE中编程,将串口映射到别的IO上直接使用

首先第一部分:串口使能与开启以及发送,直接先上代码

#include <HardwareSerial.h>    //导入ESP32串口操作库,使用这个库我们可以把串口映射到其他的引脚上使用


//我们测试需要用到的串口,ESP32一共有3个串口,串口0应该是用于程序烧写和打印输出调试用的,所以我们只用1和2

HardwareSerial MySerial_stm32(1);  


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();  //失能串口,释放占用的资源

}


void loop() {

  MySerial_stm32.println("usart test!!!");

  delay(1000);

}

看看结果:

attachments-2020-09-RcvL744G5f7000a16c327.jpg我用这个原来正点原子的串口调试助手不知道为什么显示中文会乱码,但是英文就没事,可是Arduino IDE自带的串口调试器却可以显示中文,但这不重要,上面的核心就是begin 这个函数

第二部分:串口的读取

#include <HardwareSerial.h>    //导入ESP32串口操作库,使用这个库我们可以把串口映射到其他的引脚上使用


//我们测试需要用到的串口,ESP32一共有3个串口,串口0应该是用于程序烧写和打印输出调试用的,所以我们只用1和2

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("串口接收区的缓存为空!!!");

  }

   

/*    关于串口读取还有一些别的函数,用的不多但是找的资料给大家罗列在这里

 *     

 *     int peek(void);  //返回接收缓存中第一个字节数据,但并不从中删除它;

 *     void flush(void);  //等待串口收发完毕;

 *     下面是两个发送的,我没怎么用过,我一般直接使用println来发送

 *     size_t write(uint8_t);写数据到TX FIFO,在发送FIFO中的数据会自动输出到TX端口上;该方法有很多重载,可以用来发送字符串、长整型、整形;如果TX FIFO已满,则该方法将阻塞;

 *     size_t write(const uint8_t *buffer, size_t size);写数据到TX FIFO,如果发送FIFO已满,则该方法将阻塞;

 *     size_t setRxBufferSize(size_t);  //设置接收缓存大小(默认为256字节);ESP32默认有128字节的硬件RX FIFO,在RX FIFO收到数据后会移送到上面的接收缓存中;这个挺重要的但是我们直接使用默认的就好

*/

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);

}

看看结果:

attachments-2020-09-FW9Tk9is5f700117b3373.jpg这里我们就是直接在这个串口调试器上发送一串数据,然后我的ESP32接收到,从打印串口端给我打印出来,这里其实就只有两个最重要的函数:available() 和 read() 分别是返回缓存区数据个数 以及 读取并删除缓存区一个数据,然后在后面还给大家补充了一些别的可以用的函数,在上面的代码里面注释的那部分就是,感兴趣的可以自己看看。


  • 发表于 2020-09-27 11:05
  • 阅读 ( 4149 )

0 条评论

请先 登录 后评论
淡若清风
淡若清风

35 篇文章

作家榜 »

  1. 淡若清风 35 文章
  2. 杨杨 2 文章
  3. cgisky 1 文章
  4. vvvans 0 文章
  5. meow_sir 0 文章
  6. Scott 0 文章
  7. ddd ddd 0 文章
  8. lx 0 文章