int main()
{
int Temp;
int Heart,Sp02;
while(1)
{
printf("%d %d %d ",Temp,Heart,Sp02 );//每次循环都会更新这三个属性值,这里简写了
ESP8266_SendData(Temp,Heart,Sp02);//发送数据
}
}
void ESP8266_Clear(void)
{
memset(esp8266_buf, 0, sizeof(esp8266_buf));
esp8266_cnt = 0;
}
_Bool ESP8266_WaitRecive(void)
{
if(esp8266_cnt == 0) //如果接收计数为0 则说明没有处于接收数据中,所以直接跳出,结束函数
return REV_WAIT;
if(esp8266_cnt == esp8266_cntPre) //如果上一次的值和这次相同,则说明接收完毕
{
esp8266_cnt = 0; //清0接收计数
return REV_OK; //返回接收完成标志
}
esp8266_cntPre = esp8266_cnt; //置为相同
return REV_WAIT; //返回接收未完成标志
}
_Bool ESP8266_SendCmd(char *cmd, char *res)
{
unsigned char timeOut = 200;
Usart_SendString(USART3, (unsigned char *)cmd, strlen((const char *)cmd));
while(timeOut--)
{
if(ESP8266_WaitRecive() == REV_OK) //如果收到数据
{
if(strstr((const char *)esp8266_buf, res) != NULL) //如果检索到关键词
{
ESP8266_Clear(); //清空缓存
return 0;
}
}
delay_ms(10);
}
return 1;
}
void ESP8266_SendData(int Temp,int Heart,int Sp02)
{
char cmdBuf[512];
ESP8266_Clear(); //清空接收缓存
//先发送要发送数据的指令做准备
sprintf(cmdBuf, "AT+MQTTPUB=0,\"%s\",\"{\\\"id\\\":\\\"123\\\"\\,\\\"params\\\":{\\\"Temp\\\":{\\\"value\\\":%d\\}\\,\\\"Heart\\\":{\\\"value\\\":%d\\}\\,\\\"Sp02\\\":{\\\"value\\\":%d\\}}}\",0,0\r\n",pubtopic,Temp,Heart,Sp02); //发送命令
while(ESP8266_SendCmd(cmdBuf, "OK"))
delay_ms(500);
//printf("%d %d %d ",Temp,Heart,Sp02 );
memset(cmdBuf,0,sizeof(cmdBuf));
delay_ms(100);
}
void ESP8266_Init(void)
{
// GPIO_InitTypeDef GPIO_Initure;
//
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//ESP8266复位引脚
// GPIO_Initure.GPIO_Mode = GPIO_Mode_Out_PP;
// GPIO_Initure.GPIO_Pin = GPIO_Pin_13; //GPIOC13-复位
// GPIO_Initure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_Init(GPIOC, &GPIO_Initure);
//
// GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
// delay_ms(250);
// GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
// delay_ms(500);
ESP8266_Clear();
printf("0. AT\r\n");
while(ESP8266_SendCmd("AT\r\n", "OK"))
delay_ms(500);
printf("1. AT+RST\r\n");
while(ESP8266_SendCmd("AT+RST\r\n", ""))
delay_ms(500);
printf("2. CWMODE\r\n");
while(ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK"))
delay_ms(500);
printf( "3. AT+CWDHCP\r\n");
while(ESP8266_SendCmd("AT+CWDHCP=1,1\r\n", "OK"))
delay_ms(500);
printf("4. CWJAP\r\n");
while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "GOT IP"))
delay_ms(500);
printf( "5. MQTTUSERCFG\r\n");
while(ESP8266_SendCmd(ESP8266_USERCFG_INFO, "OK"))
delay_ms(500);
printf( "6. MQTTCONN\r\n");
while(ESP8266_SendCmd(ESP8266_ONENET_INFO, "OK"))
delay_ms(500);
printf("7. ESP8266 Init OK\r\n");
}
void USART3_IRQHandler(void)
{
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接收中断
{
if(esp8266_cnt >= sizeof(esp8266_buf)) esp8266_cnt = 0; //防止串口被刷爆
esp8266_buf[esp8266_cnt++] = USART3->DR;
USART_ClearFlag(USART3, USART_FLAG_RXNE);
}
}
串口显示:
usart1_init_success
usart3_init_success
0. AT
//串口调试助手显示0-7都以成功发送,但是进行到属性值上报时出现了错误,导致while循环不能进行下去
标准的OneJSON格式是这样的,我看您发送的at指令里面 没有version的属性,添加一下试一下呢,类似于下面这种,
{
"id": "123",
"version": "1.0",
"params": {
"Power": {
"value": "12345",
"time": 1599534283111
},
"temp": {
"value": 23.6,
"time": 1599534283111
}
}
}
如果还是不成功,建议登陆一下OneNET平台,查看设备日志信息,看一下是报的什么错误码。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
登录 后才可以发表评论