来,偷偷瞄一眼数据手册
当我们单链接的时候会如下图
分析一下子,首先有个固定的 +IPD, 然后有一个数据长度 即 3 然后是冒号: 后边的666则为发过来的数据
嚯,一下子就清晰了起来
弄个结构体
typedef struct { int16_t len; //网络数据长度 uint8_t *IPD_buff;//平台下发的数据 }IPD;
写个解析函数
/* 服务器下发解析函数 返回值为结构体 ipd_rx.len 非下发数据返回:0 解析失败返回:-1 正确解析返回:数据长度 */ IPD ESP8266_GetIPD(void) { IPD ipd; uint8_t i; char *ptrIPD = NULL; ipd.len = 0; ptrIPD = strstr((char *)usart1_rx.rx_buff, "+IPD,");//搜索“IPD”头 if(ptrIPD == NULL)//没找到直接退出 { ipd.len = 0; return ipd; } else { ptrIPD = strchr(ptrIPD, ',');//找到',' ptrIPD++; for(i=0;i<10;i++)//获取数据长度 { if((ptrIPD[i]>='0')&&(ptrIPD[i]<='9')) { ipd.len = ipd.len*10+(ptrIPD[i]-'0'); } else break; } ptrIPD = strchr(ptrIPD, ':');//找到':' if(ptrIPD != NULL) { ptrIPD++; ipd.IPD_buff = (uint8_t *)(ptrIPD); return ipd; } else { ipd.len = -1; return ipd; } } }
while(1)里添加判断函数
if(usart1_rx.flag)//接收到数据 { ipd_rx = ESP8266_GetIPD();//解析数据 if(ipd_rx.len>0)//判断是否为网络下发数据 { if(strstr((char *)ipd_rx.IPD_buff, "LED_ON"))//数据中有匹配"LED_ON" { printf("LED已打开\r\n"); HAL_GPIO_WritePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin,GPIO_PIN_SET); } else if(strstr((char *)ipd_rx.IPD_buff, "LED_OFF"))//数据中有匹配"LED_OFF" { printf("LED已关闭\r\n"); HAL_GPIO_WritePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin,GPIO_PIN_RESET); } } Clear_Usart(&usart1_rx);//清空缓存 }效果图下
当然我们也可以用手机控制 首先查一查手机的局域网ip
打开服务器
修改单片机所链接的服务器ip
烧录
能看到已经发过来了
发送也正常,今天就搞到这吧