ESP32与STM32串口通信实现指南

ESP32与STM32的语法全是C语言,ESP32是基于Arduino框架的,ESP32与STM32之间的通信主要靠<HardwareSerial.h>

以下是在ESP32中烧入的代码:

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

//我们测试需要用到的串口,ESP32一共有3个串口,串口0应该是用于程序烧写和打印输出调试用的,所以我们只用1和2
HardwareSerial MySerial_stm32(1);  
unsigned short i;
char temp;
char buffer_1[10];  // 定义一个缓冲区,用于存储读取到的数据
char buffer_2[10];  // 定义一个缓冲区,用于存储读取到的数据
char temp_buffer[10];
char humi_buffer[10];
int j = 0;     // 缓冲区索引,用于记录当前读取到的位置
char data_str_1;
char data_str_2;

//这个函数适用于清理串口读取缓存区的缓存,其实也就是用读一个删除一个的方式清理,我还会打印出有没有进行清理,清理了哪些内容
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){
    while(i--){
      temp = MySerial_stm32.read();   //读取一个数据并且将它从缓存区删除
      if(j<5)
      {
        buffer_1[j] = temp;
      }
      else if (j>=5)
      {
        if(j==5)
        {
          buffer_1[j] = '\0';  // 在 buffer 数组的末尾添加一个空字符,表示字符串的结束
        }
        buffer_2[j-5] = temp;
      }
      j++;
      }
    // 在读取完成后,将 buffer 数组中的数据拼接成一个字符串
    buffer_2[j-5] = '\0';  // 在 buffer 数组的末尾添加一个空字符,表示字符串的结束
    j=0;

    dtostrf(atof(buffer_1), 5, 2, temp_buffer);
    data_str_1 = temp_buffer[0];
    dtostrf(atof(buffer_2), 5, 2, humi_buffer);
    data_str_2 = humi_buffer[0];
    Serial.println(data_str_1);
    Serial.println(data_str_2);
    }
  }

void setup() {
  Serial.begin(115200);
  //串口的开启,这里还可以传一些别的参数,但是我们只传入下面四个最重要的:波特率,默认SERIAL_8N1为8位数据位、无校验、1位停止位,后面两个分别为 RXD,TXD 引脚
  MySerial_stm32.begin(115200, SERIAL_8N1, 17, 18);
  clear_usart_buffer();  //清空接收区缓存函数
  
}

void loop() {
  MySerial_stm32.printf("of");
  read_usart();
  delay(500);
  read_usart();
  delay(500);
  read_usart();
  delay(500);
}

以下是STM32的主要代码:

/* USER CODE BEGIN 1 */
	uint8_t recv_dat[6] = {0};
    float temperature = 0.0;
    float humidity = 0.0;
	char temp[30]={0};
	char humi[30]={0};
	char recv_buf[4] = {0};
  /* USER CODE END 1 */
HAL_Delay(1000);
	SHT30_Read_Dat(recv_dat);
	SHT30_Dat_To_Float(recv_dat, &temperature, &humidity);
	sprintf(temp,"%.2f",temperature);
	sprintf(humi,"%.2f",humidity);
	HAL_UART_Transmit(&huart2, (uint8_t*)temp, 5, 0xFFFF);
	HAL_UART_Transmit(&huart2, (uint8_t*)humi, 5, 0xFFFF);
	HAL_UART_Receive(&huart2, (uint8_t*)recv_buf, 4, 5000);

ESP32与STM32的通信主要是传递温度和湿度的数据,STM32收集温度和湿度的数据,通过串口,将数据传给ESP32,ESP32也会不断的发送数据过来,只需要打开串口查看即可。

物联沃分享整理
物联沃-IOTWORD物联网 » ESP32与STM32串口通信实现指南

发表回复