在《物联网中你需要了解的ESP8266最基本的知识!》和《每谈及物联网都难以离开的MQTT协议!》中,我们使用了模拟的方式让ESP8266通过AT指令加入云服务器和MQTT接入云服务器。但是我们实际使用时中却不能模拟的,不可能每一步都得自己调,这样的话毫无疑问会非常的麻烦。那么我们必须把这些指令和操作写在程序中,让其自动、智能地运行。
以下是我们将AT指令和MQTT协议在单片机封装的C语言程序的过程。当我们需要实现某个功能的时候,引用函数即可。
STM32源码下载地址:https://github.com/Liangyz2019/IoT-LED-STM32-
本例程采用了USART2与ESP8266相连,并使用了HAL库编写。
AT指令封装
//usart2发送和接收数组
uint8_t usart2_txbuf[256];
uint8_t usart2_rxbuf[512];
uint8_t usart2_rxone[1];
uint8_t usart2_rxcounter;
//串口2发送一个字节
static void USART2_SendOneByte(uint8_t val)
{
((UART_HandleTypeDef *)&huart2)->Instance->DR = ((uint16_t)val & (uint16_t)0x01FF);
while((((UART_HandleTypeDef *)&huart2)->Instance->SR&0X40)==0);//等待发送完成
}
//向ESP8266发送定长数据
void ESP8266_ATSendBuf(uint8_t* buf,uint16_t len)
{
memset(usart2_rxbuf,0, 256);
//每次发送前将接收串口接收总数置0,为了接收
usart2_rxcounter = 0;
//定长发送
HAL_UART_Transmit(&huart2,(uint8_t *)buf,len,0xFFFF);
}
//向ESP8266发送字符串
void ESP8266_ATSendString(char* str)
{
memset(usart2_rxbuf,0, 256);
//每次发送前将接收串口接收总数置0,为了接收
usart2_rxcounter = 0;
//发送方法1
while(*str) USART2_SendOneByte(*str++);
//发送法法2
// HAL_UART_Transmit(&huart2,(uint8_t *)str,strlen(str),0xFFFF);
}
//退出透传
void ESP8266_ExitUnvarnishedTrans(void)
{
ESP8266_ATSendString("+++");HAL_Delay(50);
ESP8266_ATSendString("+++");HAL_Delay(50);
}
//查找字符串中是否包含另一个字符串
uint8_t FindStr(char* dest,char* src,uint16_t retry_nms)
{
retry_nms/=10; //超时时间
while(strstr(dest,src)==0 && --retry_nms)//等待串口接收完毕或超时退出
{
HAL_Delay(10);
}
if(retry_nms) return 1;
return 0;
}
uint8_t ESP8266_Check(void)
{
uint8_t check_cnt=5;
while(check_cnt--)
{
memset(usart2_rxbuf,0,sizeof(usart2_rxbuf)); //清空接收缓冲
ESP8266_ATSendString("AT\r\n"); //发送AT握手指令
if(FindStr((char*)usart2_rxbuf,"OK",200) != 0)
{
return 1;
}
}
return 0;
}
void ESP8266_Restore(void)
{
ESP8266_ExitUnvarnishedTrans(); //退出透传
HAL_Delay(500);
ESP8266_ATSendString("AT+RESTORE\r\n"); //恢复出厂
}
//开启透传模式
static uint8_t ESP8266_OpenTransmission(void)
{
//设置透传模式
uint8_t cnt=2;
while(cnt--)
{
memset(usart2_rxbuf,0,sizeof(usart2_rxbuf));
ESP8266_ATSendString("AT+CIPMODE=1\r\n");
if(FindStr((char*)usart2_rxbuf,"OK",200)!=0)
{
return 1;
}
}
return 0;
}
uint8_t DisconnectServer(