1 esp8266作为设备 esp-01s
1.1入网设置
设置工作模式
AT_CWMODE=1 //1. 是station(设备)模式2.是AP(路由器)模式3.是双模
OK
以设备模式接入家中路由器配置
AT+CWJAP="2604","nh26042604"
WIFI CONNECT //如果成功
WIFI GOT IP
设置单路连接模式(透传只能使用此模式)
AT+CIPMUX=0
OK
查询IP地址 没连上WIFI之前只有两条指令
AT+CIFSR
+CIFSR:APIP, "192.168.1.11"
+CIFSR:APMAC, "4e:75:25:0d:ae:2f"
+CIFSR:STAIP, "192.168.0.148"
+CIFSR:STAMAC,"4c:75:25:0d:ae:2f"
OK
代码实现AT指令
代码实现esp8266连接tcp服务器不能发数据
断网再连就可以了
网络调试助手的TCP client打不开
联系快速的断连
头文件
cpp
/* 错误代码 */
#define ESP8266_EOK 0 /* 没有错误 */
#define ESP8266_ERROR 1 /* 通用错误 */
#define ESP8266_ETIMEOUT 2 /* 超时错误 */
#define ESP8266_EINVAL 3 /* 参数错误 */
/* UART收发缓冲大小 */
#define ESP8266_RX_BUF_SIZE 128
#define ESP8266_TX_BUF_SIZE 64
void esp8266_init(uint32_t baudrate);//所以增加新添加一个
void esp8266_receiv_data(void);
void esp8266_test(void);
esp8266串口初始化
cpp
uint16_t esp8266_rx_buf[ESP8266_RX_BUF_SIZE]
uint16_t eso8266_cnt = 0,esp8266_cntPre = 0;
UART_HandleTypeDef esp8266_handle = {0};
void esp8266_uart_init(uint32_t baudrate)
{
esp8266_handle.Instance = ;//选择USART1
esp8266_handle.Init.Baudrate = baudrate;//波特率设置
esp8266_handle.Init.WordLength = UART_WORDLENGTH; /*字长为8位设置模式*/
esp8266_handle.Init.StopBits = UART_STOPBITS_1; /*一个停止位*/
esp8266_handle.Init.Parity = UART_PARITY_NONE; /* 无奇偶校验位 */
esp8266_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;/*无硬件流控制*/
esp8266_handle.Init.Mode = UART_MODE_TX_RX; /设置为收发模式/
HAL_UART_init(&esp8266_handle); /*会使能esp8266*/
}
接收数据清除
cpp
void esp8266_rx_clear(void)
{
memset(esp8266_RX_buf,0,sizeof(esp8266_rx_buf));/* 清空接收缓冲区 */
eso8266_cnt = 0; /* 接收计数器清零 */
}
中断服务函数
cpp
void USART2_TRQHandler(void)
{
uint8_t receive_data = 0;
/* 获取接收RXNE标志位是否被置位 */
if(__HAL_UART_GET_FLAG(&esp8266,UART_FLAG_RXNE) != RESET)
{
/* 如果接收的字符数大于接收缓冲区大小, */
if(esp8266_cnt >= sizeof(esp8266_rx_buf))
esp8266_cnt = 0; /* 则将接收计数器清零 */
/* 接收一个字符 */
HAL_UART_Receive(&esp8266_handle, &receive_data,1,1000);
/* 将接收到的字符保存在接收缓冲区 */
esp8266_rx_buf[esp8266_cnt++] = receive_data;
}
/* 获取接收空闲中断标志位是否被置位 */
if(__HAL_UART_GET_FLAG(&esp8266_handle,UART_FLAG_IDLE) != RESET)
{
/* 将接收到的数据打印出来 */
printf("recv: %s\r\n", esp8266_rx_buf);
esp8266_rx_clear();
__HAL_UART_CLEAR_IDLEFLAG(&esp8266_handle);/* 清除UART总线空闲中断 */
}
}
接收等待函数
cpp
uint8_t esp8266_wait_receive(void)
{
if(esp8266_cnt == 0)
return ESP8266_ERROR;//没传送玩
if(esp8266_cnt == esp8266_cntPre)
{
esp8266_cnt = ;
return ESP8266_EOK;//接收完成
}
esp8266_cntPre = esp8266_cnt;接收未完成
return ESP8266_ERROR;
}
接收数据函数
cpp
void esp8266_receive_data(void)
{
if(esp8266_wait_receive() == ESP8266_EOK)//判断是否接收完成
{
printf("sp8266 recv: %s\r\n", esp8266_rx_bu);
esp8266_rx_clear(); //接收的数据清除
}
}
esp8266初始化函数
cpp
void esp8266_init(int baudrate)
{
esp8266_uart_init(baudrate);
}
发送一个指令去 在指定时间内返回回来 否则没有接收到一个返回值 等待OK返回
cpp
uint8_t esp8266_send_command(char *cmd,char *res)
{
uint8_t timeout_out = 250;
esp8266_rx_clear();
HAL_UART_Transmit(&esp8266_handle,(uint8_t *)cmd,strlen(cmd),100);//发送命令,期待回复
等待
while(timeout_out--)//不停的等待
{
if(esp8266_wait_receive() == ES8266_EOK)
{
if(strstr((const char*)esp8266_rx_buf, res) != NULL)//判断是否有期待的字符串
return ESP8266_EOK
}
delay_ms(10);
}
return ESP8266_ERROR;//否则接收错误
}
测试函数
cpp
void esp8266_test(void)
{
if(esp8266_send_command("AT","OK") == ESP8266_EOK)
printf("esp8266_test: %s\r\n",esp8266_rx_buf);
}
AT测试
cpp
uint8_t esp8266_at_test(void)
{
return esp8266_send_command("AT\r\n","OK");
}
四个模式设置
cpp
void esp8266_set_mode(uint8_t mode)
{
switch(mode)
{
case ESP8266_STA_MODE:
return esp8266_send_command("AT+CWMODE=1\r\n","OK");
case ESP8266_AP_MODE:
return esp8266_Send_command("AT+CWMODE=2\r\n","OK");
case ESP8266_STA_AP_MODE:
return esp8266_send_command("AT+CWMODE=3\r\n","OK");
default:
return ESP8266_EINVAL;//指令不存在
}
}
ap模式输入账号密码
cpp
uint8_t esp8266_join_ap(char *ssid,char *pwd)//账号密码
{
char cmd[64];
//\"HUAWEIAP-1\",=\"%s\ 就指令带引号直接写不行,我们需要如此就不会将""认为是配对的
sprintf(cmd, "AT+CWJAP=\"%s\",\"%s\"\r\n",ssid,pwd);
return esp8266_send_command(cmd,"WIFI GOT IP");//调用指令函数期待回复WIFI GOT IP
}
设置单路连接模式
cpp
uint8_t esp8266_connect_mode(uint8_t mode)
{
char cmd[64];
sprintf(cmd."AT+CIPMUX=%d\r\n",mode);//作为模式传输进入
return esp8266_send_command(cmd,"OK");
}
esp8266初始化函数pro
cpp
void esp8266_init(uint32_t baudrate)
{
printf("esp8266初始化开始...\r\n");
esp8266_uart_init(bardrate);
printf("1测试esp8266是否存在\r\n");
while(esp8266_at_test())//也是可以的不过一直不成功那就一直等待更为保险
delay_ms(500);
printf("2设置工作模式为STA...\r\n");
while(esp8266_set_mode(ESP8266_STA_MODE))
delay_ms(500);
printf("3设置单路连接模式");
while(esp8266_connect_mode(ESP8266_SINGLE_CONNECTION))
delay_ms(500);
printf("4连接WIFI,SSID:%s,PWD: %s\r\n", WIFI_SSID,WIFI_PWD);
while(esp8266_join_ap(WIFI_SSID,WIFI_PWD))
delay_ms(1500);//时间长一些更保险
printf("esp8266初始化完成...\r\n");
}
cpp
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "esp8266.h"
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
led_init(); /* LED初始化 */
uart1_init(115200);
esp8266_init(115200);
printf("helloworld!\r\n");
while(1)
{
}
}