初级会员
- 积分
- 148
- 金钱
- 148
- 注册时间
- 2022-9-21
- 在线时间
- 14 小时
|
1金钱
在使用正点原子mini板用mqtt协议上传数据时,定义了一个500大小的数组来供sprintf函数装AT指令,在上传六个参数的值时发现错误,改为上传4个参数就可以,于是猜想可能时数组大小定义小了,但是改为1000,还是失败,函数代码如下:
bool ESP8266_MQTTPUB_ME( char temperature,char humidity,int light,float Pressure,float MQ135,char PM)
{
char cCmd [500];
sprintf ( cCmd, "AT+MQTTPUB=0,\"/sys/a1ZyoZhw5CG/device1/thing/event/property/post\",\"{\\\"id\\\":862489675\\,\\\"params\\\":{\\\"temperature\\\":%d\\, \\\"humidity\\\":%d\\, \\\"light\\\":%d\\, \\\"airpressure\\\":%.2f\\, \\\"nh\\\":%.2f\\, \\\"pm\\\":%d\\}\\,\\\"version\\\":\\\"1.0\\\"\\,\\\"method\\\":\\\"thing/event/property/post\\\"}\",1,0",
temperature,humidity,light,Pressure,MQ135,PM);
return ESP8266_Send_AT_Cmd( cCmd, "OK", NULL, 500 );
}
其中ESP8266_Send_AT_Cmd函数如下:
//对ESP8266模块发送AT指令
// cmd 待发送的指令
// ack1,ack2;期待的响应,为NULL表不需响应,两者为或逻辑关系
// time 等待响应时间
//返回1发送成功, 0失败
bool ESP8266_Send_AT_Cmd(char *cmd,char *ack1,char *ack2,u32 time)
{
ESP8266_Fram_Record_Struct .InfBit .FramLength = 0; //重新接收新的数据包
ESP8266_USART("%s\r\n", cmd);
if(ack1==0&&ack2==0) //不需要接收数据
{
return true;
}
delay_ms(time); //延时
delay_ms(1000);
ESP8266_Fram_Record_Struct.Data_RX_BUF[ESP8266_Fram_Record_Struct.InfBit.FramLength ] = '\0';
printf("%s",ESP8266_Fram_Record_Struct .Data_RX_BUF);
if(ack1!=0&&ack2!=0)
{
return ( ( bool ) strstr ( ESP8266_Fram_Record_Struct .Data_RX_BUF, ack1 ) ||
( bool ) strstr ( ESP8266_Fram_Record_Struct .Data_RX_BUF, ack2 ) );
}
else if( ack1 != 0 ) //strstr(s1,s2);检测s2是否为s1的一部分,是返回该位置,否则返回false,它强制转换为bool类型了
return ( ( bool ) strstr ( ESP8266_Fram_Record_Struct .Data_RX_BUF, ack1 ) );
else
return ( ( bool ) strstr ( ESP8266_Fram_Record_Struct .Data_RX_BUF, ack2 ) );
}
|
|