前些天一直用Arduino UNO测试软串口读取PM2.5温湿度传感器,今天测试一下ESP32的3个物理串口功能,同也把之前的代码优化了一下,写成函数方便调用。
#include <HardwareSerial.h>
HardwareSerial MySerial1(1);
unsigned char pm25ask[9] = {0xFF, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07};
int back_data[40];
void setup() {
Serial.begin(115200);
MySerial1.begin(9600, SERIAL_8N1, 16, 17); //U1RXD=GPIO16,U1TXD=GPIO17
}
由于需要利用默认串口向HMI串口屏发送指令,这里将GPIO16、17定义为Serial1,设置与传感器相同速率9600;
pm25ask[9] = {0xFF, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07}是向传感器发送问询的数据指令,传感器应答帧长度40位;
?
void getpmwh() {
MySerial1.write(pm25ask,9); //串口输出问询帧
delay(500);
int i = MySerial1.available();
Serial.println("");
Serial.print("data len:");
Serial.println(i); //打印返回帧长度
if (i > 0)
{
char pm25[24];
char pm10[24];
char wendu[24];
char shidu[24];
for (int j=0; j<i; j++)
{
back_data[j]=MySerial1.read(); //串口读取一位,赋值给back_data数组
Serial.print("data[");
Serial.print(j);
Serial.print("] = ");
Serial.println(back_data[j],HEX); //打印数组
}
Serial.print("\xff\xff\xff"); //向串口屏输出一个指令结束标志(防止混乱)
sprintf(pm25,"t2.txt=\"%d\"\xff\xff\xff",(back_data[6] * 256 + back_data[7])); //格式化PM2.5数据并赋值给t2.txt( 串口屏定义的PM2.5控件),传感器返回帧6、7位是16进制PM2.5数据
Serial.println(pm25);
sprintf(pm10,"t3.txt=\"%d\"\xff\xff\xff",(back_data[8] * 256 + back_data[9]));
Serial.println(pm10);
sprintf(shidu,"t0.txt=\"%.1f\"\xff\xff\xff",float((back_data[30] * 256 + back_data[31]) * 0.1)); //%.1f 保留后面浮点类型变量数据1位小数
Serial.println(shidu);
sprintf(wendu,"t1.txt=\"%.1f\"\xff\xff\xff",float((back_data[32] * 256 + back_data[33]) * 0.1));
Serial.println(wendu);
}
delay(2000);
}
定时调用这个函数即可向串口屏发送实时的PM2.5及温湿度数据指令了。实际运用时,需要将无用的调式输出信息删除掉,同时向串口屏输出的指令不要有换行。
?
?利用USART设计串口屏界面,添加相应的控件接收串口发来的传感器数据指令即可;
?
?
?
|