ESP8266WIFI模块之串口编程(一)

作者寄语: 在我学习单片机串口发送与接收数据的时候,对串口的掌握不熟悉,看了不少的学习资料。今天与大家分享使用hal库封装esp8266经过串口发送与接收数据的函数。当然,我会用很详细的过程带着大家去了解程序,因为我也是从一个初学者慢慢走过来的。在这里我也感谢教过我知识的那些老师与分享知识的同学们。
正文 一、使用stm32cubemx创建keil程序 1、打开stm32cubemx软件后,选择stm32f103c8t6的mcu,在可视化界面对我们所需要的引脚进行功能配置。
图1.1 stm32cubemx可视化界面 2、本次使用串口编写代码,需要对串口io口的引脚配置。
pa10→usart1_rx
pa9 →usart1_tx
图1.2 引脚io口配置 3、配置完成后,生成我们所需要的keil文件。
二、串口程序的编写 我们使用到的是esp8266wifi模块的udp通信方式,所以我们需要编写一个方便我们发送与接收at指令的串口代码。
1、清空接收数据的函数void esp8266_recieveclear(void)void esp8266_recieveclear(void)//向模块发送数据{ memset((uint8_t *)usart_rx_buf, 0 ,200);//metset数据清空函数 //把usart_rx_but里面的200数据全部赋值为0}void *memset(void *buffer, int c, int count) // buffer:为指针或是数组// c:是赋给buffer的值// count:是buffer的长度 2、数据发送的函数uint8_t esp8266_sendcmd(char *cmd, char *reply, uint16_t time)我们先来看hal库自带的串口发送函数:usart1_transmit(uint8_t *data, uint16_t len, uint16_t time)这个串口发送函数显然是只管发送数据,不管数据是否发送成功。对于我们接下来的操作肯定是不行的。首先我们要了解讲解编写的函数功能:①,数据发送并且接收返回的数据,已达到判断at指令是否发送成功(例如发送at,返回给ok或者error)②,数据发送等待时间自定义(因为at指令每个指令数据返回的时间不同,我们需要对不同的at指令设置不同的等待时间。例如:我们上课时间为45分钟,课间休息时间10分钟,如果我们设置上课时间和课间休息都为45分钟,那肯定是不行的。)③,程序基本适用于所有的at指令操作。uint8_t esp8266_sendcmd(char *cmd, char *reply, uint16_t time)//因为我们发送数据后接收的数据要去判断返回的数据和设置去判断的数据正确与否,此时就需要去让他传回一个参数。//char *cmd -- 发送的at指令//char *repley -- 判断的数据//uint16_t time --数据等待的时间,当设置time为20ms时,20ms内收到数据,就返回正常,大于20ms未返回数据,就返回异常。 uint8_t esp8266_sendcmd(char *cmd, char *reply, uint16_t time){ char save_buf[256] = {0};//保存收到的数据 //发送数据函数,at指令每次发送数据都需要加入\r\n,所以需要对这个函数进行封装。 //因此每次要对cmd数据判断是否有结尾换行字符,有换行字符就不处理,没有换行字符就增加换行字符 //esp8266_recieveclear(cmd, sizeof); //使用strcat函数来进行两个字符的拼接,也可以使用strcpy //例如a = abc, b = def; //strcat(a,b); 结果a = abcdef 1,保存传入的指令 strcat(save_buf, cmd);//先把cmd的数据保存在save_buf //使用strstr函数判断save_buf有没有换行字符 //例如a = 'abc, b = c, c = efg //strstr(a, b) = 3 //strstr(a, c) = 0(或者null) 2,处理at指令(添加换行) if(strstr(save_buf, \r\n) == 0) { //能够进入这里说明save_buf没有\r\n,所以要给save_buf添加\r\n strcat(save_buf, \r\n);//save_buf增加\r\n } 3,清空数据,防止之前的数据未被清理,影响后面使用 //为防止之前的数据未被清理,所以在这里清空一下save_buf里的数据 esp8266_recieveclear(); 4,发送数据 //此时使用数据发送函数 esp8266_recieveclear((uint8_t *)save_buf, sizeof(save_buf), 500); 5,接收数据 memset((uint8_t *)save_buf, 0 ,256);//清理数据save_buf usart1_recieve(save_buf); 6,判断接收的数据是否与reply数据相同 //time的时间等待,若时间内at指令发送成功,返回为1,否则为0 while(time != 0) { //判断save_buf有数据 if(usart1_receive((uint8_t *)save_buf)) { //发回的数据与repley校验,相同返回1,不相同继续判断 if(strstr(save_buf, reply)) { printf(%s send ok); return 1; } else { time --; hal_delay(1);//比如time为500,在500ms内一直去判断接收的数据是否正确 } } } //超过time时间内没有返回reply的数据,就返回失败 printf(%s send error); } 如何使用数据发送函数呢?
当我们给esp8266模块发送at指令时,看一下返回的结果:at \r\nok如果不加\r\naterror 数据发送函数的使用:
esp8266_sendcmd(at, ok, 500);//解析:给模块发送at指令,500ms之内返回ok,说明数据发送成功。//若返回error,说明数据发送失败。或者超时500ms也会返回失败 大家多提建议,我们一起学习成长。


oppor11什么时候上市最新消息:oppor11拍照神器即将发布,不服来战!这次oppor11强力打压小米
关于4D Radar 天线布局的一些思考
基于NI SDR平台的软件无线电平台软件
4晶体管AB类音频放大器电路图
工业机器人的潜在市场如冰山下的金矿
ESP8266WIFI模块之串口编程(一)
如何使用Excel来提高你的工作效率10个Excel基本技巧让你事半功倍
TDS3054B数字荧光示波器产品特点及技术指标
智能制造很多时候先进性并没有那么的重要
TFN FB18寻径及识别单元T6000的简介
曾经的光环过后,人工智能芯片第一股寒武纪在资本市场再次迎来挑战
工业无线网络性能测试方法
英创信息技术嵌入式Linux应用程序自动载入驱动模块方法简介
ASCB1智慧空开 智能微型断路器
双极型晶体管的工作原理详解
新制程引导新需求,满足韩国在内的亚洲地区PCB厂的市场需求
建筑中BIM数字化建模过程
微雪电子ROC-RK3308主板CC固件编译介绍
三星Galaxy S21 Ultra:慢动作模式解释了差异
电源效率的关键因素-电池拓扑