界面
协议

例如在微信温度采集界面点击【10秒】,微信界面发送字符“$TH,1#”至下位机,下位机根据协议打开温湿度传感器开始采集数据,然后向微信返回收集到的数据。
解释协议:打开温湿度传感器开始采集。
然后下位机给微信界面返回数据包$TH,T25.20,H55#,
解释协议:“$TH,T25.20,H55#”,目前温度为25.20,湿度为55。
“$TH,2,#”,匹配失败。
接线图

代码
/*** @par Copyright (C): 2010-2019, Shenzhen Yahboom Tech* @file 8、远程温湿度采集* @author liusen* @version V1.0* @date 2017.11.14* @brief AR套件微信实验* @details* @par History 见如下说明**/#include "dht11.h"#include <MsTimer2.h> //定时器库的 头文件dht11 DHT11;#define DHT11_Pin 4 // 温湿度传感器管脚int incomingByte = 0; // 接收到的 data byteString inputString = ""; // 用来储存接收到的内容boolean newLineReceived = false; // 前一次数据结束标志boolean startBit = false; //协议开始标志String returntemp = ""; //存储返回值char temp[100] = {0};/*** Function setup* @author liusen* @date 2017.11.14* @brief 初始化配置* @param[in] void* @retval void* @par History 无*/void setup(){//初始化温湿度传感器管脚IO口为输出方式pinMode(DHT11_Pin, OUTPUT);Serial.begin(9600); //波特率9600 (WIFI通讯设定波特率)}/*** Function loop* @author liusen* @date 2017.11.14* @brief 按照接收的数据根据协议完成相应的功能* @param[in] void* @retval void* @par History 无*/void loop(){while (newLineReceived){int chk = DHT11.read(DHT11_Pin); //读取温湿度传感器管脚的数值int fTemp = (float)DHT11.temperature; //fTemp赋值为浮点型读取到的温度值int iHumidity = DHT11.humidity; //iHumidity赋值为读取到的湿度值if(inputString.indexOf("TH") == -1) //如果要检索的字符串值“TH”没有出现{returntemp = "$TH,2#"; //返回不匹配Serial.print(returntemp); //返回协议数据包inputString = ""; // clear the stringnewLineReceived = false; // 前一次数据结束break;}//解析开关// $TH,1#memset(temp, 0x00, sizeof(temp)); //清空temp数组dtostrf(fTemp, 3, 1, temp); // 相當於 %3.2fString sTemp = temp; //数组temp中的字符串赋给sTempString sHum = "";sHum += iHumidity;returntemp = "$TH,T" + sTemp + ",H" + sHum + "#";Serial.print(returntemp); //返回协议数据包inputString = ""; // clear the stringnewLineReceived = false;}}/*** Function serialEvent* @author liusen* @date 2017.11.14* @brief 串口接收中断 serialEvent()是IDE1.0及以后版本新增的功能,不清楚为什么大部份人不愿意用,这个可是相当于中断功能一样的啊!* @param[in] void* @retval void* @par History 无*/void serialEvent(){while (Serial.available()){incomingByte = Serial.read(); //一个字节一个字节地读,下一句是读到的放入字符串数组中组成一个完成的数据包if(incomingByte == '$') //如果串口接收到数据则进入循环{startBit= true; //如果到来的字节是'$',开始读取}if(startBit == true){inputString += (char) incomingByte; // 全双工串口可以不用在下面加延时,半双工则要加的//}if (incomingByte == '#'){newLineReceived = true; //如果到来的字节是'#',读取结束startBit = false;}}}
