历史上的今天
返回首页

历史上的今天

今天是:2024年09月25日(星期三)

正在发生

2019年09月25日 | stm32-esp8266驱动程序

2019-09-25 来源:eefocus

esp8266模块是串口通讯,通讯的协议是AT指令,要正确的配置对应的AT指令模块才可以工作,这里就需要知道AT指令有没有配置成功,这个比较容易实现,一般发送AT指令配置成功的话,芯片都会返回至少一个OK,当然还有其它数据,我们只需要去解析有没有接收到OK就知道指令发送是否成功了。我这里是作为TCP客服端,所以只需要以下一些指令即可:


1>> 发送 ATrn 返回 "OK"

以上操作确保芯片连接正常,工作正常

 

2>> 发送 ATE0rn 返回 "OK"

关闭回显

 

3>> 发送 AT+CWMODE=1rn 返回 "OK"

设置成客服端模式

 

 

4>> 发送    AT+CIPSTATUS 返回 "2 3 4 5" 2 3为连接

确保连接到路由器

 

5>> 发送 AT+CWJAP="HES_WIFI","wifi_pass" 返回 "OK"

返回 "FAIL"

连接到路由器

 

6>> 发送 AT+CWAUTOCONN=1 返回 "OK"

开机自动连接

 

7>> 发送 AT+CIPSTART="TCP","192.168.0.105",8888 返回 "OK"

连接到服务器

 

8>> 发送 AT+CIPCLOSE 返回 "OK"

关闭服务器连接

 

8>> 发送    AT+CIPMODE=1 返回 "OK"

设置透传模式1

9>> 发送    AT+CIPSEND 返回 ">"

进入透传

10>> 发送 +++ 返回 无

程序驱动也会按照这个流程来实现;


大概框架如下




esp8266wifi.c文件主要是AT指令配置


serial_config.c文件主要用于解析返回的数据,例如OK,>等


uart.c是串口的应用协议


1-先看看esp8266wifi的内容


#define FANHUI_V "OK" //普通指令返回值

 

extern u8 wifi_name[20]; //路由器名字

extern u8 wifi_pass[20]; //路由器密码

 

extern u8 wifi_ip[32]; //服务器ip

extern u8 wifi_port[6]; //服务器端口

 

static u8 wifi_work_mode; //wifi模块的工作模式,1为配置模式,2为透传模式

 

#define _WIFI_TRAN_MODE 2

#define _WIFI_CONFIG_MODE 1

/*模块初始化

1.测试AT命令,保证芯片工作正常

2.关闭回显

3.设置成客服端模式

4.连接到路由器

5.连接到服务器

6.设置透传模式1

7.开始透传

8.关闭透传

*/

u8 esp8266_init(void);

 

//测试AT指令,确保连接和芯片正常

u8 test_at(void);

 

//关闭回显

u8 close_huixian(void);

 

//设置成客户端

u8 set_client(void);

 

//判断是否连接路由器

u8 is_connect_ap(void);

 

//连接到路由器

u8 connect_ap(void);

 

//设置自动连接路由器

u8 aotu_connect_ap(void);

 

//连接到服务器

u8 connect_server(void);

 

//断开服务器

u8 disconnect_server(void);

 

//设置透传模式

u8 set_mode1(void);

 

//开始透传

u8 start_tran(void);

 

//关闭透传

u8 close_tran(void);

 

//设置为透传模式

void set_tran_mode(void);

 

//设置成配置模式

void set_config_mode(void);

 

//获取工作模式

u8 get_work_mode(void);

 

 

//发送命令和等待时间

u8 send_cmd_wait(u8 *str,u8 len,u32 d_ms);

 

 

 

#endif

这里主要介绍一下


//发送命令和等待时间

u8 send_cmd_wait(u8 *str,u8 len,u32 d_ms);


这个函数比较重要,主要功能还是发生一个AT指令,等待nms后检测是否收到OK,下面是实现


//发送命令和等待时间

u8 send_cmd_wait(u8 *str,u8 len,u32 d_ms)

{

 

serial2_sned_buff(str,len);

delay_ms(d_ms);

 

if(find_quq_del(OK)) //查找串口数据缓存是否OK

{

return 1;

}

return 0;

}

关闭透传也比较特殊,实现如下


//关闭透传

u8 close_tran()

{

serial2_sned_buff((u8*)"+++",3);

delay_ms(20);

serial2_sned_buff((u8*)"+++",3);

delay_ms(20);

serial2_sned_buff((u8*)"rn",2);

delay_ms(20);

return 1;

}

所有函数太多,只介绍几个关键的,其它的可以在后面下载源码。


接下来是serial_config文件


这个文件主要实现1-串口缓冲区添加数据(数据要在串口中断添加),2-解析是否存在相应指令


#define MES_LEN 200

 

 

//command

#define OK (char*)"OK"

#define AP2 (char*)"2rn"

#define AP3 (char*)"3rn"

#define OFF (char*)"off"

#define ON (char*)"on"

#define STATE (char*)"state"

 

//Log Switch

#define ERIAL_CONFIG_LOG 0

 

 

static int num;

static char mes_buf[MES_LEN]; //串口队列长度

 

 

//寻找子并移除子串

 

int find_str_del(char *mes,char *str);

//寻找命令

//参数:命令

//查找到命令返回1,否则0

int find_quq_del(char *str);

//添加数据到队列

void add_mes_buf(char ch);

 

#endif

uart.c应用协议是自己定义的,和模块没有关系,其实以上2个文件已经看正常的初始化esp8266了。


初始化函数:


u8 esp8266_init()

{

//设置成配置模式

set_config_mode();

//测试AT

if(test_at())

{

#if ESP8266_LOG

printf("esp8266硬件 正常rn");

#endif

}

else

{

#if ESP8266_LOG

printf("esp8266硬件 异常rn");

printf("尝试关闭透传...rn");

#endif

close_tran();

}

//关回显

if(close_huixian())

{

#if ESP8266_LOG

printf("关闭esp8266回显 正常rn");

#endif

}

else

{

#if ESP8266_LOG

printf("关闭esp8266回显 异常rn");

#endif

}

//设置成客户端

if(set_client())

{

#if ESP8266_LOG

printf("设置成客户端 正常rn");

#endif

}

else

{

#if ESP8266_LOG

printf("设置成客户端 异常rn");

#endif

}

//判断是否连接到路由器 is_connect_ap

if(is_connect_ap())

{

#if ESP8266_LOG

printf("连接路由器 正常rn");

#endif

}

else //如果没有连接路由器,则去连接

{

#if ESP8266_LOG

printf("连接路由器 异常rn");

printf("尝试连接路由器...rn");

#endif

if(connect_ap())

{

#if ESP8266_LOG

printf("连接路由器 正常rn");

#endif

aotu_connect_ap();

}

else

{

#if ESP8266_LOG

printf("连接路由器 异常rn");

#endif

}

}

//连接到服务器

if(connect_server())

{

#if ESP8266_LOG

printf("连接服务器 正常rn");

#endif

}

else

{

#if ESP8266_LOG

printf("连接服务器 异常rn");

printf("尝试关闭连接服务器,重新连接...rn");

#endif

if(disconnect_server())

{

#if ESP8266_LOG

printf("关闭连接服务器 正常rn");

#endif

//连接到服务器

if(connect_server())

{

#if ESP8266_LOG

printf("重新连接服务器 正常rn");

#endif

}

else

{

#if ESP8266_LOG

printf("连接服务器 异常rn");

#endif

}

}

else

{

#if ESP8266_LOG

printf("关闭连接服务器 异常rn");

#endif

}

}

//设置透传模式1

if(set_mode1())

{

#if ESP8266_LOG

printf("设置透传模式1 正常rn");

#endif

}

else

{

#if ESP8266_LOG

printf("设置透传模式1 异常rn");

#endif

}

//开始透传

if(start_tran())

{

#if ESP8266_LOG

printf("开始透传 正常rn");

#endif

//设置成配置模式

set_tran_mode();

}

else

{

#if ESP8266_LOG

printf("开始透传 异常rn");

#endif

return 0;

}

return 1;

}

整体使用的过程。


1,主函数必须初始化串口,esp8266_init()


2,while(1)里面实现如下,


//任务2函数

void task2_func(void *param)

{

 

u8 data_count_time=0;

int j=1;

while(1)

{

if(get_work_mode()==_WIFI_TRAN_MODE) //判断是否是透传模式

{

//检查wifi数据

check_wifi_data();

if(wifi_mes.recv_len>0)

{

printf("%dwifi:%srn",j++,wifi_mes.recv_data);

}

else

{

data_count_time++;

if(data_count_time==5) //如果很久没有接到数据

{

clear_wifi_buf(); //清空缓存

}

}

//serial2_sned_buff((u8*)"hello worldrn",13);

}

task_delay(1);

 

}

}

串口中断实现如下:如果是配置模式,把数据放到命令解析的缓存里,如果是透传模式,把数据放到应用协议的缓存里


void USART2_IRQHandler(void)

{

 

   USART_ClearFlag(USART2,USART_FLAG_TC);  

    if(USART_GetITStatus(USART2,USART_IT_RXNE)!=Bit_RESET)//检查指定的USART中断发生与否  

    {  

   

u8  k=USART_ReceiveData(USART2);  

if(get_work_mode()==_WIFI_CONFIG_MODE) //如果是配置模式

{

add_mes_buf(k);

}else

{

wifi_buf_add(k);

//printf("%x ",k);

}

 

      

    }  

 

}

整体测试下来,效果还是很不错的,一晚上通讯没有死机掉线。用的是TCP工具,没有自己写socket

推荐阅读

史海拾趣

ELESTA GmbH公司的发展小趣事

ELESTA一直注重生产效率和产品质量的提升。公司积极引入精益生产理念,通过优化生产流程、提高生产效率、降低生产成本等方式,不断提升产品竞争力和市场占有率。这一举措不仅为公司带来了显著的经济效益,也为整个电子行业树立了标杆。

CIRCUITCO公司的发展小趣事

随着技术的不断进步,CIRCUITCO公司开始寻求市场拓展的机会。公司积极与国内外知名电子产品制造商建立合作关系,为其提供优质的电路板解决方案。通过与这些企业的合作,CIRCUITCO的产品逐渐渗透到各个领域,如通信、计算机、消费电子等。同时,公司也通过参加国际电子展会等方式,提升品牌知名度,进一步拓展市场份额。

Eclipse Magnetics公司的发展小趣事

昭华公司一直注重品牌建设和市场拓展。他们通过参加各种行业展会、举办技术研讨会等方式,积极宣传公司的产品和技术优势。同时,昭华公司还加强了与客户的沟通和合作,深入了解客户需求并提供定制化的解决方案。这些努力使得昭华公司的品牌知名度不断提升,市场份额也逐渐扩大。

Enterpoint公司的发展小趣事

为了进一步扩大市场份额,Enterpoint公司开始积极拓展国际市场。他们通过参加国际电子展会、建立海外销售网络等方式,不断提升品牌知名度和影响力。同时,公司还积极寻求与国际知名企业的合作机会,通过技术交流和产品合作,不断提升自身的技术实力和产品质量。

ADTech公司的发展小趣事

AdTech公司在成立之初,以其完整的传统半导体器件工艺在通信、激光医疗和激光防卫领域获得了广泛认可。然而,随着技术的不断进步和市场的变化,公司管理层意识到需要转型以维持竞争优势。2008年,经过三年的技术储备,AdTech决定将原有的光电探测器业务剥离,转而专注于量子级联激光器(QCL)的研发和生产。这一决策使公司能够专注于前沿技术,逐渐在QCL领域建立了领先地位,成为美国各大QCL激光设备的核心供应商。

Global Specialties公司的发展小趣事

在电子技术的不断推动下,Global Specialties始终保持对新技术的高度敏感。公司不断投入研发资源,对现有产品进行升级换代,并推出了一系列具有创新性的新产品。例如,公司开发的智能测试仪器能够自动完成复杂的测试任务,大大提高了测试效率和准确性。这些技术创新不仅巩固了Global Specialties在业内的领先地位,还为公司带来了更多的商业机会。

问答坊 | AI 解惑

高速PCB设计EMI规则探讨(二)

规则五:高速PCB设计的布线方向规则 相邻两层间的走线必须遵循垂直走线的原则,否则会造成线间的串扰,增加EMI辐射,如下图: 此主题相关图片如下: 相邻的布线层遵循横平竖垂的布线方向,垂直的布线可以抑制线间的串扰。 规则六:高速PCB设计 ...…

查看全部问答>

有简单人工智能的温度控制电路

有简单人工智能的温度控制电路有简单人工智能的温度控制电路 作者:佚名 来源:网络 发布时间:2007-04-07 发布人:admin    介绍一种具有简单人工智能的温度控制电路,使用该电路进行温度控制时,只需将开关打在2的位置,通过设定控制 ...…

查看全部问答>

华清远见的学员请进~~~

各位有去过华清远见培训过的吗?我说的那个就业班,怎么样啊?给点意见可以吗? 有人了解尚观吗?那怎么样啊?我想去培训,因为嵌入式要是自学可能会走好多弯路,忽忽~~~…

查看全部问答>

液晶1602显示源代码

液晶1602显示源代码 #include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit en=P2^0;sbit rs=P2^1;uchar code table[]=\"I LOVE YOU\";uchar code table1[]=\"FOREVER MAMA!\";uchar num;void delay(uint z);void write ...…

查看全部问答>

【挖电源】身边的电源

我弄的个tps61200升压电源       tps61200太小了   被线挡住了欧司朗节能灯的电源我随手做的线性稳压  可调电压电源   输入12V交流   采用sb540整流    4700uF 2 ...…

查看全部问答>

反激式开关电源变压器设计的详细步骤

85W反激变压器设计的详细步骤1. 确定电源规格. 1).输入电压范围Vin=90—265Vac; 2).输出电压/负载电流:Vout1=42V/2A, Pout=84W 3).转换的效率ŋ=0.80    Pin=84/0.8=105W 2. 工作频率,匝比, 最低输入电压和最大占空 ...…

查看全部问答>

Verilog HDL练习题和Verilog基础知识适合verilog新人.rar

Verilog HDL练习题和Verilog基础知识适合verilog新人 Verilog的135个经典设计实例…

查看全部问答>

74ls192芯片

怎么解决倒数计时器中的,在倒数计时的过程中不能置数啊,用的是74ls192芯片(置数端11号腿怎么接啊)…

查看全部问答>

有关34063升压电路的关断问题

有关34063升压电路的关断问题 ,一款LCD产品的背光部分需要使用34063来驱动,5V输入,升压到26V左右,电路图如图1所示。   图1 34063本身不提供关断功能,没有相关的管脚,但是一款LCD背光如果总是处于点亮状态未免有些不合适,功耗上 ...…

查看全部问答>

Altium Designer14版与10版比较(转)

作者:朱长江     Altium Designer 14是Altium公司于2013年10月推出的Altium Designer最新版本。该版本比10版在界面和功能上都有了相当大的改进。笔者作为10版的深度用户,自然很想知道14版相对于10版,到底在那些方面,带来了 ...…

查看全部问答>