不封装AT指令和MQTT协议,单片机还想实现物联网?【开源】

《物联网中你需要了解的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(
评论 61
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mini梁翊洲MAX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值