首先是发送的函数
/* 串口发送函数 *str为指令 len为指令长度 */ void ESP_SendString(unsigned char *str, unsigned short len) { uint8_t i; for(i=0;i<len;i++) { HAL_UART_Transmit(&huart1, str++, 1, 0xFFFF); } }
然后发送并匹配数据
/* AT指令发送函数 *cmd为AT指令 *res为需匹配的数据 timeOut未等待时间 匹配成功返回 0 匹配失败返回 1 */ _Bool ESP8266_SendCmd(char *cmd, char *res,uint16_t timeOut) { ESP_SendString((unsigned char *)cmd, strlen((const char *)cmd));//发送AT指令 while(timeOut--)//等待 { if(usart1_rx.flag) //如果收到数据 { if(strstr((const char *)usart1_rx.rx_buff, res) != NULL) //如果匹配到数据 { Clear_Usart(&usart1_rx); //清空缓存 return 0; } else{ Clear_Usart(&usart1_rx); //清空缓存 } } HAL_Delay(1); } return 1; }根据上篇的例程编写一个初始化过程
我们这次直接用网络调试助手来做了
首先我们根据上篇所测试的,把所需发送的指令和返回的指令做个数组
//前边是发送的指令,后边是要确定的回令 char *const esp_inti_cmd[][2] = { {"AT\r\n", "OK"}, {"ATE0\r\n", "OK"}, {"AT+CWMODE=3\r\n", "OK"}, {"AT+CWJAP=\"shr\",\"12345678\"\r\n", "GOT IP"}, {"AT+CIFSR\r\n", "OK"}, {"AT+CIPSTART=\"TCP\",\"192.168.2.4\",8080\r\n", "CONNECT"}, {"AT+CIPSEND=4\r\n", "OK"}, {"test", "SEND OK"}, {0, 0} };
然后写个函数
_Bool esp_init(void) { uint8_t i; for(i=0;i<100;i++) { if(esp_inti_cmd[i][0]) { //发送数组中的指令,并匹配数组中返回指令 if(ESP8266_SendCmd(esp_inti_cmd[i][0],esp_inti_cmd[i][1],5000)) { printf("Init:%d error\r\n",i);//失败 } else { printf("Init:%d ok\r\n",i);//成功 } } else { printf("ESP Init Success\r\n"); return 0;//初始化完成 } } return 1; }
然后我们直接可以直接把这个函数放进main函数中
Clear_Usart(&usart1_rx);//初始化串口结构体 __HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);//使能空闲中断 HAL_UART_Receive_DMA(&huart1, (uint8_t*)usart1_rx.rx_buff, RX_BUF_MAX_LEN);//设置DMA传输,串口2的数据搬运到缓存中 esp_init();
###展示
可以说是已经迈进了物联网的门槛了