程序流程:
- 启动串口2的接收,USART_StartRx();
- 串口2发送AT指令,启动TCP服务。ESP8266_SendCommand();
- 接收数据: ①按键按下,发送门铃信号 ②接收列数据控制灯亮灭
TCP通信流程:
- 复位 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”}
#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++;
}
}