1.STM32CUBEMX配置
打开串口一
串口中断一定要打开
点击生成工程
2.keil代码编写
(1).char *strstr(const char *,const char *);
strstr
是 C 和 C++ 标准库中用于字符串处理的函数之一。它的作用是在一个字符串(称为 haystack
)中查找另一个字符串(称为 needle
)的第一个出现位置。
(2).keil勾选,并重定向printf
int fputc(int ch,FILE *f)
{
uint8_t temp=ch;
HAL_UART_Transmit(&huart1,&temp,1,2);
return temp;
}
(3).代码编写
新建一个bsp.c和bsp.h
bsp.h
#include "bsp.h"
char *strx,*extstrx,*Readystrx;
char RxBuffer[200],Rxcouter;
uint8_t Res;
int len;
int number;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
UNUSED(huart);
if(huart->Instance ==USART1){
RxBuffer[Rxcouter++] = Res;
HAL_UART_Receive_IT(&huart1, (uint8_t *)&Res, 1);
}
}
void Clear_Buffer(void)
{
uint8_t i;
for(i=0;i<200;i++)
RxBuffer[i]=0;
Rxcouter=0;
}
bsp.h
#ifndef __BSP_H
#define __BSP_H
#include "main.h"
#include "stdio.h"
#include "usart.h"
#include "string.h"
char *strstr(const char *,const char *);
void Clear_Buffer(void);
#endif
main.c添加
extern uint8_t Res;
extern int len;
extern int number;
extern char *strx;
extern char RxBuffer[200];
在while(1)前添加
HAL_UART_Receive_IT(&huart1,&Res,1);
//模块初始化,等待1秒
printf("模块初始化");
HAL_Delay(1000);
//查询版本信息
printf("ATI\r\n");
HAL_Delay(1000);
strx=strstr((const char*)RxBuffer,(const char*)"Fibocom");
if(strx==NULL)
{
Clear_Buffer();
printf("查询信息失败\r\n");
HAL_Delay(1000);
printf("ATI\r\n");
HAL_Delay(1000);
strx=strstr((const char*)RxBuffer,(const char*)"Fibocom");
}
Clear_Buffer();
printf("版本信息正确\r\n");
HAL_Delay(1000);
//请求IP
printf("AT+MIPCALL?\r\n");
HAL_Delay(1000);
strx=strstr((const char*)RxBuffer,(const char*)"+MIPCALL: 1");
Clear_Buffer();
printf("AT+MIPCALL?\r\n");
HAL_Delay(1000);
strx=strstr((const char*)RxBuffer,(const char*)"+MIPCALL: 1");
Clear_Buffer();
printf("AT+MIPCALL?\r\n");
HAL_Delay(1000);
strx=strstr((const char*)RxBuffer,(const char*)"+MIPCALL: 1");
Clear_Buffer();
while(strx==NULL)
{
Clear_Buffer();
printf("还未获取到IP\r\n");
HAL_Delay(1000);
printf("AT+MIPCALL=1\r\n");
HAL_Delay(1000);
strx=strstr((const char*)RxBuffer,(const char*)"+MIPCALL: ");
}
Clear_Buffer();
printf("获取IP成功\r\n");
HAL_Delay(1000);
//定位
printf("AT+GTGIS=6\r\n");
HAL_Delay(3000);
strx=strstr((const char*)RxBuffer,(const char*)"+GTGIS:");
while(strx==NULL)
{
Clear_Buffer();
printf("基站定位失败\r\n");
HAL_Delay(3000);
printf("AT+GTGIS=6\r\n");
HAL_Delay(3000);
strx=strstr((const char*)RxBuffer,(const char*)"+GTGIS: ");
}
Clear_Buffer();
printf("基站定位成功");
HAL_Delay(1000);
//设置平台设备信息
printf("AT+TCDEVINFOSET=1,\"WE300YV59F\",\"weilaiRoad_Lamp001\",\"RlqqNdAGME1AvEBv8SiYBw==\"\r\n");
HAL_Delay(1000);
strx=strstr((const char*)RxBuffer,(const char*)"+TCDEVINFOSET: OK");
while(strx==NULL)
{
Clear_Buffer();
printf("平台信息设置失败\r\n");
HAL_Delay(1000);
printf("AT+TCDEVINFOSET=1,\"WE300YV59F\",\"weilaiRoad_Lamp001\",\"RlqqNdAGME1AvEBv8SiYBw==\"\r\n");
HAL_Delay(1000);
strx=strstr((const char*)RxBuffer,(const char*)"+TCDEVINFOSET: OK");
}
Clear_Buffer();
printf("平台信息设置成功\r\n");
HAL_Delay(1000);
//设置连接参数并连接
printf("AT+TCMQTTCONN=1,20000,240,1,0\r\n");
HAL_Delay(1000);
strx=strstr((const char*)RxBuffer,(const char*)"+TCMQTTCONN: OK");
while(strx==NULL)
{
Clear_Buffer();
printf("连接失败\r\n");
HAL_Delay(1000);
printf("AT+TCMQTTCONN=1,20000,240,1,0\r\n");
HAL_Delay(1000);
strx=strstr((const char*)RxBuffer,(const char*)"+TCMQTTCONN: OK");
}
Clear_Buffer();
printf("连接成功\r\n");
HAL_Delay(1000);
//订阅上报下行属性
printf("AT+TCMQTTSUB=\"$thing/down/property/WE300YV59F/weilaiRoad_Lamp001\",1\r\n");
HAL_Delay(1000);
strx=strstr((const char*)RxBuffer,(const char*)"+TCMQTTSUB: OK");
while(strx==NULL)
{
Clear_Buffer();
printf("订阅标签失败\r\n");
HAL_Delay(1000);
printf("AT+TCMQTTSUB=\"$thing/down/property/WE300YV59F/weilaiRoad_Lamp001\",1\r\n");
HAL_Delay(1000);
strx=strstr((const char*)RxBuffer,(const char*)"+TCMQTTSUB: OK");
}
Clear_Buffer();
printf("订阅标签成功\r\n");
HAL_Delay(1000);
//上报属性
printf("AT+TCMQTTPUB=\"$thing/up/property/WE300YV59F/weilaiRoad_Lamp001\",1,\"{\\\"method\\\":\\\"report\\\",\\\"clientToken\\\":\\\"123\\\",\\\"params\\\":{\\\"power_switch\\\":1}}\"\r\n");
HAL_Delay(1000);
strx=strstr((const char*)RxBuffer,(const char*)"success");
while(strx==NULL)
{
Clear_Buffer();
printf("上报失败\r\n");
HAL_Delay(1000);
printf("AT+TCMQTTPUB=\"$thing/up/property/WE300YV59F/weilaiRoad_Lamp001\",1,\"{\\\"method\\\":\\\"report\\\",\\\"clientToken\\\":\\\"123\\\",\\\"params\\\":{\\\"power_switch\\\":1}}\"\r\n");
HAL_Delay(1000);
strx=strstr((const char*)RxBuffer,(const char*)"success");
}
Clear_Buffer();
printf("上报成功\r\n");
HAL_Delay(1000);
Clear_Buffer();
在while(1)后添加
if(RxBuffer[0] != 0)
{
HAL_Delay(1000);
strx=strstr((const char*)RxBuffer,(const char*)"power_switch");
if (strx==NULL)
{printf("电灯属性获取失败");}
else
{
len = strlen(strx);
number = strx[14];
printf("电灯属性获取成功");
HAL_Delay(500);
printf("收到信息:power_switch=%c" ,number);
HAL_Delay(500);
Clear_Buffer();
}
Clear_Buffer();
}
HAL_Delay(500);
下载代码进行测试,ok了,大功告成