赞
踩
蓝牙,ESP-01s,Zigbee, NB-Iot等通信模块都是基于AT指令的设计
AT指令
AT指令集是从终端设备(Terminal Equipment,TE)或数据终端设(Data Terminal Equipment,DTE)向终端适配器(Terminal Adapter,TA)或数据电路终端设备(Data Circuit Terminal Equipment,DCE)发送的
其对所传输的数据包大小有定义:即对于AT指令的发送,除AT两个字符外,最多可以接收1056个字符的长度(包括最后的空字符)
每个AT命令行中只能包含一条AT指令;对于由终端设备主动向PC端报告的URC指示或者response 响应,也要求一行最多有一个,不允许上报的一行中有多条指示或者响应。AT指令以回车作为结尾,响应或上报以回车换行为结尾
初始配置和验证
ESP-01s出厂波特率正常是115200,
注意:AT指令,控制类都要加回车,数据传输时不加回车
################################################
arch:ESP8266, 1
compile_time:Ai-Thinker|B&T
wifi_mac:4c75250dAE2F
sdk_version:v3.4-22-g967752e2
firmware_version:2.2.0
compile_time:Jun 30 2021 11:28:20
ready
################################################
AT
OK
AT+UART=9600,8,1,0,0
入网设置
AT+CWMODE=3 //1. 是station(设备)模式 2.是AP(路由)模式 3.是双模
OK
AT+CWJAP="TP-LINK_3E30","18650711783" //指令//wifi名字和密码
WIFI CONNECTED //结果
WIFI GOT IP //结果
AT+CIFSR //指令
+CIFSR:APIP,"192.168.4.1"
+CIFSR:APMAC,"4e:75:25:0d:ae:2f"
+CIFSR:STAIP,"192.168.0.148"
+CIFSR:STAMAC,"4c:75:25:0d:ae:2f"
OK
连接到 TCP server
1.开关网络助手,设立TCP服务器
2. 连接服务器
AT+CIPSTART="TCP","192.168.0.113",8888 //指令,注意双引号逗号都要半角(英文)输入
CONNECT //结果:成功
OK //结果:成功
3.发送数据
AT+CIPSEND=4 // 设置即将发送数据的长度 (这里是4个字节)
>CLCA // 看到大于号后,输入消息,CLCA,不要带回车
Response :SEND OK //结果:成功
//注意,这种情况下,每次发送前都要先发送AT+CIPSEND=长度 的指令,再发数据!
透传
每次发送数据都要进行字符长度设定,如果设置成透传,就有点像蓝牙模块的玩法
连接服务器之后
AT+CIPMODE=1 //开启透传模式
Response :OK
AT+CIPSEND //带回车
Response: > //这个时候随意发送接收数据咯
退出透传模式
//在透传发送数据过程中,若识别到单独的⼀包数据 “+++”,则退出透传发送
ESP-01s当服务器
USB转TTL插入电脑,TX–RX RX-TX VCC-3.3V GDN-GND
查询IP地址:AT+CIFSR
//1 配置成双模 AT+CWMODE=2 Response :OK //2 使能多链接 AT+CIPMUX=1 Response :OK //3 建立TCPServer AT+CIPSERVER=1 // default port = 333 Response :OK //4 发送数据 AT+CIPSEND=0,4 // 发送4个字节在连接0通道上 >abcd //输入数据,不带回车 Response :SEND OK //• 接收数据 +IPD, 0, n: xxxxxxxxxx //+IPD是固定字符串 0是通道,n是数据长度,xxx是数据 //断开连接 AT+CIPCLOSE=0 Response :0, CLOSED OK
项目需求
通过ESP8266模块,实现手机控制wifi插座/风扇/
项目设计:
注意:
#define SIZE 12 char buffer[SIZE]; char LJWL[] = "AT+CWJAP=\"TP-LINK_3E30\",\"18650711783\"\r\n"; //入网指令 char LJFWQ[] = "AT+CIPSTART=\"TCP\",\"192.168.0.130\",8880\r\n"; //连接服务器指令 char TCMS[] = "AT+CIPMODE=1\r\n"; //透传指令 char SJCS[] = "AT+CIPSEND\r\n"; //数据传输开始指令 char CQMK[] = "AT+RST\r\n"; //重启模块指令 char AT_OK_Flag = 0; //OK返回值的标志位 char AT_Connect_Net_Flag = 0; //WIFI GOT IP返回值的标志位 // 接收完成回调函数,收到一个数据后,在这里处理 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { // 判断中断是由哪个串口触发的 if(huart->Instance == USART1) { // 判断接收是否完成(UART1_RX_STA bit15 位是否为1) if((UART1_RX_STA & 0x8000) == 0) { // 如果已经收到了 0x0d (回车), if(UART1_RX_STA & 0x4000) { // 则接着判断是否收到 0x0a (换行) if(buf == 0x0a) { // 如果 0x0a 和 0x0d 都收到,则将 bit15 位置为1 UART1_RX_STA |= 0x8000; // 查看是否收到 WIFI GOT IP if(!strcmp((uint8_t *)UART1_RX_Buffer, "WIFI GOT IP")) AT_Connect_Net_Flag = 1; // 查看是否收到 OK if(!strcmp((uint8_t *)UART1_RX_Buffer, "OK")) AT_OK_Flag = 1; // 查看是否收到 FAIL if(!strcmp((uint8_t *)UART1_RX_Buffer, "FAIL")) { int i = 0; for(i = 0; i < 5; i++) { HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_8); HAL_Delay(1000); }HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET); printf(CQMK); }// 灯控指令 if(!strcmp((uint8_t *)UART1_RX_Buffer, "L-1")) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET); if(!strcmp((uint8_t *)UART1_RX_Buffer, "L-0")) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET); memset(UART1_RX_Buffer, 0, UART1_REC_LEN); UART1_RX_STA = 0; }else // 否则认为接收错误,重新开始 UART1_RX_STA = 0; }else // 如果没有收到了 0x0d (回车) { //则先判断收到的这个字符是否是 0x0d (回车) if(buf == 0x0d) { // 是的话则将 bit14 位置为1 UART1_RX_STA |= 0x4000; }else { // 否则将接收到的数据保存在缓存数组里 UART1_RX_Buffer[UART1_RX_STA & 0X3FFF] = buf; UART1_RX_STA++; // 如果接收数据大于UART1_REC_LEN(200字节),则重新开始接收 if(UART1_RX_STA > UART1_REC_LEN - 1) UART1_RX_STA = 0; } } }/ / 重新开启中断 HAL_UART_Receive_IT(&huart1, &buf, 1); } } int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init();/* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_USART1_UART_Init(); MX_USART2_UART_Init(); /* USER CODE BEGIN 2 */ HAL_NVIC_SetPriority(SysTick_IRQn,0,0); // 开启接收中断 HAL_UART_Receive_IT(&huart1, &buf, 1); HAL_UART_Transmit(&huart2, "let's go!!\r\n", strlen("let's go!!\r\n"), 100); //发送联网AT指令并等待成功 printf(LJWL); //while(!AT_Connect_Net_Flag); while(!AT_OK_Flag) HAL_Delay(50); AT_OK_Flag = 0; //发送连服务器指令并等待成功 printf(LJFWQ); while(!AT_OK_Flag) HAL_Delay(50); AT_OK_Flag = 0; //发送透传模式指令并等待成功 printf(TCMS); while(!AT_OK_Flag) HAL_Delay(50); AT_OK_Flag = 0; //发送数据传输指令并等待成功 printf(SJCS); while(!AT_OK_Flag) HAL_Delay(50); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ printf("liangxu shuai\r\n"); HAL_UART_Transmit(&huart2, "hello liangxu\r\n", strlen("hello liangxu\r\n"), 100); HAL_Delay(3000); }/* USER CODE END 3 */ }
STA模式:
#include <stdio.h> #include <string.h> char buffer[SIZE]; //1 工作在路由模式 char LYMO[] = "AT+CWMODE=2\r\n"; //2 使能多链接 char DLJ[] = "AT+CIPMUX=1\r\n"; //3 建立TCPServer char JLFW[] = "AT+CIPSERVER=1\r\n"; // default port = 333 //发送数据 char FSSJ[] = "AT+CIPSEND=0,5\r\n"; char AT_OK_Flag = 0; //OK返回值的标志位 char AT_Connect_Net_Flag = 0; //WIFI GOT IP返回值的标志位 char Client_Connect_Flag = 0; // 接收完成回调函数,收到一个数据后,在这里处理 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { // 判断中断是由哪个串口触发的 if(huart->Instance == USART1) { // 判断接收是否完成(UART1_RX_STA bit15 位是否为1) if((UART1_RX_STA & 0x8000) == 0) { // 如果已经收到了 0x0d (回车), if(UART1_RX_STA & 0x4000) { // 则接着判断是否收到 0x0a (换行) if(buf == 0x0a) { // 如果 0x0a 和 0x0d 都收到,则将 bit15 位置为1 UART1_RX_STA |= 0x8000; // 查看是否收到 WIFI GOT IP if(!strcmp(UART1_RX_Buffer, "WIFI GOT IP")) AT_Connect_Net_Flag = 1; // 查看是否收到 OK if(!strcmp(UART1_RX_Buffer, "OK")) AT_OK_Flag = 1; // 查看是否收到 FAIL if(!strcmp(UART1_RX_Buffer, "0,CONNECT")) Client_Connect_Flag = 1; // 灯控指令if(!strcmp(UART1_RX_Buffer, "L-1")) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET); if(!strcmp(UART1_RX_Buffer, "L-0")) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET); memset(UART1_RX_Buffer, 0, UART1_REC_LEN); UART1_RX_STA = 0; }else // 否则认为接收错误,重新开始 UART1_RX_STA = 0; }else // 如果没有收到了 0x0d (回车) { //则先判断收到的这个字符是否是 0x0d (回车) if(buf == 0x0d) { // 是的话则将 bit14 位置为1 UART1_RX_STA |= 0x4000; }else { // 否则将接收到的数据保存在缓存数组里 UART1_RX_Buffer[UART1_RX_STA & 0X3FFF] = buf; UART1_RX_STA++; // 如果接收数据大于UART1_REC_LEN(200字节),则重新开始接收 if(UART1_RX_STA > UART1_REC_LEN - 1) UART1_RX_STA = 0; } } }/ / 重新开启中断 HAL_UART_Receive_IT(&huart1, &buf, 1); } } int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init *//* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_USART1_UART_Init(); MX_USART2_UART_Init(); /* USER CODE BEGIN 2 */ HAL_NVIC_SetPriority(SysTick_IRQn,0,0); // 开启接收中断 HAL_UART_Receive_IT(&huart1, &buf, 1); HAL_UART_Transmit(&huart2, "let's go\r\n", strlen("let's go\r\n"), 100); printf(LYMO); while(!AT_OK_Flag) HAL_Delay(50); AT_OK_Flag = 0; printf(DLJ); while(!AT_OK_Flag) HAL_Delay(50); AT_OK_Flag = 0; printf(JLFW); while(!Client_Connect_Flag) HAL_Delay(50); AT_OK_Flag = 0; if(Client_Connect_Flag){ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET); } /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ //4 发送数据 printf(FSSJ); HAL_Delay(2000); printf("Hello"); HAL_Delay(2000); }/* USER CODE END 3 */ }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。