百问网七天物联网家居Day7

程序流程:

  1. 启动串口2的接收,USART_StartRx();
  2. 串口2发送AT指令,启动TCP服务。ESP8266_SendCommand();
  3. 接收数据: ①按键按下,发送门铃信号 ②接收列数据控制灯亮灭

     TCP通信流程:

  1. 复位 AT+RST
  2. 模式设置 AT+CWMODE_DEF = 1
  3. WiFi连接:AT+CWJAP_DEF = “ssid”,”password”
  4. 查看IP:AT+CIFSR
  5. 创建UDP连接:AT+CIPSTART=”UDP”,”ip”,9999,9999,2
  6. 发送数据:AT+CIPSEND = 32; {“data”:”dorrbell”,”status”:”1”}
  7. 接收数据:IPD,26:{“dev”:”led”,”status”:”0”}
#include "stdio.h"
#include "string.h"

UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;

static uint8_t rx_len;
static uint8_t rx_data;
static uint8_t usart_rx_buf[200];

///串口2启动接收
void USART2_StartRx(void)
{
	HAL_UART_Receive_IT(&huart1, (uint8_t*)&rx_data, 1);


}

//串口2的中断回调函数(保存每次接收到的数据,并且提供下一次接收)
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	usart_rx_buf[rx_len%200] = rx_data;
	rx_len++;
	HAL_UART_Receive_IT(&huart1, (uint8_t*)&rx_data, 1);

}

///串口2接收的数据
uint16_t USART2_Receive(uint8_t *pdata)
{
	memcpy(pdata,(uint8_t*)usart_rx_buf,rx_len);
	return rx_len;
}

//串口2发送数据
void USART2_Transmit(uint8_t *pData, uint16_t Size, uint32_t Timeout)
{
	HAL_UART_Transmit(&huart2, pData, Size, Timeout);
}

///清理串口2接收的数据
void USART2_CleanBuf(void)
{
	rx_len = 0;
	memset((uint8_t*)usart_rx_buf,0,200);


}

//发送指令
uint8_t ESP8266_SendCommand(char *cmd, char *reply, uint16_t timeout)
{
	//1、保存传入的指令
	char buf[256] = {0};
	strcat(buf,cmd);  ///strcat拼接
	
	///2、处理AT指令
	if(strstr(buf,"\r\n") == 0)  ///字符串比较函数strstr,判断有无换行符
	{
		strcat(buf,"\r\n");  ///拼接换行符
	
	}
	
	///3、清理前面接收到的buf
	USART2_CleanBuf();
	
	///4、发送数据
	USART2_Transmit((uint8_t *)buf, strlen(buf), 500);  ///发送数据,数据长度,超时时间500ms
	
	
	///5、接收数据
	memset(buf, 0 ,256);  ///清空buf
	
	while(timeout != 0 )
	{
		if(USART2_Receive((uint8_t *)buf))
		{
			if(strstr(buf, reply))   buf和reply比较,strstr字符串比较函数
			{
				printf("%s Send ok!\r\n", cmd);   //发送成功
				if(strstr(buf,"	CIFSR"))     
					printf("%s\r\n",buf);     ///打印IP地址
				return 0;
				return 0;
		
			}
			else 
			{
				timeout--;
				HAL_Delay(1);
			}
		}
	
	}
	
	printf("%s Send Error!\r\n",cmd);   发送失败
	return 1;
	
}

代码改进:添加UDP连接,更新WiFi连接信息

UDP通信连接流程:

  • 复位 AT+RST
  • 模式设置 AT+CWMODE_DEF = 1
  • WiFi连接:AT+CWJAP_DEF = “ssid”,”password”
  • 查看IP:AT+CIFSR
  • 创建UDP连接:AT+CIPSTART=”UDP”,”ip”,9999,9999,2
  • 发送数据:AT+CIPSEND = 32; {“data”:”dorrbell”,”status”:”1”}
  • 接收数据:IPD,26:{“dev”:”led”,”status”:”0”}
	///	//向ESP8266发送TCP数据
uint8_t ESP8266_Send_TCP(char *data)
{
	///1、准备发送指令
	char buf[256]={0};
	uint8_t len = strlen(data);
	sprintf(buf, "AT+CIPSEND=0,5,%d\r\n",len);
	//2、发送指令
	if(ESP8266_SendCommand(buf,"OK",500) == 0)
	{
		//3、发送数据
		ESP8266_SendCommand(data,"OK",1000);
		return 0 ;
		
	}
	return 1;		
}



代码升级:添加UDP连接和更新WiFi信息、
///	//向ESP8266发送UDP数据
uint8_t ESP8266_Send_UDP(char *data)
{
	///1、准备发送指令
	char buf[256]={0};
	uint8_t len = strlen(data);
	sprintf(buf, "AT+CIPSEND=%d\r\n",len);
	//2、发送指令
	if(ESP8266_SendCommand(buf,"OK",500) == 0)
	{
		//3、发送数据
		ESP8266_SendCommand(data,"OK",1000);
		return 0 ;
		
	}
	return 1;
	
}



///更新WIFI连接信息
void Key_Update_WIFI(char *cmd, uint16_t time)
{
	char ch = 0;
	char len = 0;
	char ssid_buf[20] = "xxxxx";
	char pwd_buf[20] = "xxxxxxxxx";
	char wifi_buf[100] = "AT+CWJAP_DEF=\""; 
	
	//设置等待时间
	HAL_Delay(time);
	检测按键是否按下,是否需要更新WIFI账号雨密码
	if(Key_GetFlag() == 1)   //按键按下
			{
				///2、1获取WIFI账号
				memset(ssid_buf, 0, 20);
				
				printf("Please enter SSID:");
				while(ch != '\r')
				{
						ch = getchar();
						if(ch > ' ')
						{
							printf("%c",ch);
							ssid_buf[len] = ch;
							len++;
						
						}
				}
				
				
				///获取WIFI的密码
				ch = 0;
				len = 0;
				memset(pwd_buf, 0, 20);
				
				printf("Please enter Password:");
				while(ch != '\r')
				{
						ch = getchar();
						if(ch > ' ')
						{
							printf("%c",ch);
							pwd_buf[len] = ch;
							len++;
						
						}
				}
		

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值