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也会不断的发送数据过来,只需要打开串口查看即可。