今日头条
在我学习单片机串口发送与接收数据的时候,对串口的掌握不熟悉,看了不少的学习资料。今天与大家分享使用HAL库封装ESP8266经过串口发送与接收数据的函数。当然,我会用很详细的过程带着大家去了解程序,因为我也是从一个初学者慢慢走过来的。在这里我也感谢教过我知识的那些老师与分享知识的同学们。
1、打开STM32CubeMX软件后,选择STM32F103C8T6的MCU,在可视化界面对我们所需要的引脚进行功能配置。
图1.1 STM32CubeMX可视化界面2、本次使用串口编写代码,需要对串口IO口的引脚配置。
PA10→USART1_RX
PA9 →USART1_TX
图1.2 引脚IO口配置3、配置完成后,生成我们所需要的keil文件。
我们使用到的是ESP8266WIFI模块的UDP通信方式,所以我们需要编写一个方便我们发送与接收AT指令的串口代码。
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的长度
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\n
OK
如果不加\r\n
AT
Error
数据发送函数的使用:
ESP8266_SendCMD("AT", "OK", 500);
//解析:给模块发送AT指令,500ms之内返回"OK",说明数据发送成功。
//若返回Error,说明数据发送失败。或者超时500ms也会返回失败
大家多提建议,我们一起学习成长。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !