最近学习了用stm32连接wifi模块,过程比较坎坷,这里记录一下学习过程 您所在的位置:网站首页 canonip110怎么连接wifi 最近学习了用stm32连接wifi模块,过程比较坎坷,这里记录一下学习过程

最近学习了用stm32连接wifi模块,过程比较坎坷,这里记录一下学习过程

2023-06-12 11:16| 来源: 网络整理| 查看: 265

这里用到开发板为stm32f103,wifi模块为ESP8266,实验目的是PC机建立一个TCP server,ESP8266作为Client加入到此网络中,要求每次开发板启动时自动完成对Wifi模块的初始化

**目录: stm32CuMx的配置Keil编写代码调试 一:配置stm32CubeMx

在这里插入图片描述 定时器使用的是timer4,设置为每一秒产生中断,两个串口都要打开,其中串口2用于和PC端连接,串口1和wifi模块相连。这里与wifi模块用四根杜邦线连接,其中两根分别连接3.3V和GND分别对应开发板的管脚。PC10、PC9分别连接ESP8266的TX、RX管脚。至此,工程配置完成。

二:编写Keil代码

定时器的设置及初始化在此不再赘述,这里主要讲一下AT指令,首先看一下要用到的AT指令

测试指令:AT

用于是否连通,若是返回OK

重启模块:AT+RST设置工作模式:AT+CWMODE=1

这里有必要说一下,数字为1时表示为STA模式,只能加入到已有的网络 2表示为AP模式,类似于手机热点,可以让其他的终端加入到此网络 3表示同时兼容AP和STA模式

查询当前Wifi:AT+CWLAP加入特定wifi网络:AT+CWJAP=“wifi名”,“密码”查询是否连接到网络中:AT+CWJAP?模块以cliet身份连接远程服务器:AT+CIPMUX=0

wifi模块可以同时连接多个TCP Server,这里我们设置为0,建立单连接,性能比较优越

8.用TCP方式连接服务器:AT+CIPSTART=”TCP”,”192.168.31.32”,3456

TCP前省略了一个参数,因为是单连接,这里就不用指定服务器ID了

9.Client发送数据:AT+CIPSEND=size

size是发送数据的位数,如果想要发送“123”,即size=3 这里可以设置成透传模式,即一直让模块传送数据,这样不必每次发送指令和指定大小,指令如下: 1.AT+CIPMODE=1 2.AT+CIPSEND

以上就是需要掌握的AT指令,放一张结构图,比较简陋,大家将就着看 在这里插入图片描述 意思就是只需要在F103内部写一个用串口1发送的函数,里面存放用于控制Wifi模块的AT指令就可以完成Wifi 的初始化

部分代码如下

char Test[]="AT\r\n"; char JoinWifi[]="AT+CWJAP=\"gjq\",\"12345678\"\r\n"; char TestJoin[]="AT+CWJAP?\r\n"; char SimpleConnect[]="AT+CIPMUX=0\r\n"; char JoinServer[]="AT+CIPSTART=\"TCP\",\"192.168.43.13\",3456\r\n"; char Mode[]="AT+CIPMODE=1\r\n"; char ModeSend[]="AT+CIPSEND\r\n";

这里把用到的指令用字符串存储起来,方便调用,大家也可以定义一个二维数组,会更简便一点,这里有个大坑!!!每个AT指令后面都要加上“\r\n”!!!(敲黑板!!!)

void command(char f[]) { int i=strlen(f); HAL_UART_Transmit(&huart1,f,i,1000); HAL_Delay(2000); }

定义一个command函数,用于发送AT指令,这里用到的是串口1

command(Test); command(JoinWifi); command(TestJoin); command(SimpleConnect); command(JoinServer); command(Mode); command(ModeSend);

分别发送AT指令,完成Wifi模块初始化

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart==&huart1) { HAL_UART_Receive_IT(&huart1,&my_re_buf1[++pt_w1],1); } if(huart==&huart2) { HAL_UART_Receive_IT(&huart2,&my_re_buf2[++pt_w2],1); } }

以上是串口的接收中断,分别用于接收Wifi数据(huart1)和串口助手输入的数据(huart2)

uint8_t my_re_buf1[2000]; uint8_t my_re_buf2[2000]; uint16_t pt_w1=1,pt_w2=0,pt_r1=1,pt_r2=0; void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim==&htim4) { HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5); while(pt_r1=pt_w1) { pt_w1=pt_r1=0; } while(pt_r2=pt_w2) { pt_w2=pt_r2=0; } } }

这里把串口的两个发送都写到了定时器的溢出中断里,翻转小灯,向Wifi模块发送数据(huart1)以及向串口助手发送数据(huart2),这里的关键在于下面的while语句,用于判断每次的接收是否完全发送出去然后重置读指针和写指针,至此,Keil主要代码编写完成

三:调试

我用的是SOCKET调试助手,类似的工具都可以,让PC机加入一个Wifi,然后查看本机的IP地址,打开SOCKET调试助手建立TCP Server,之后修改Keil里相应的AT指令,编译下载,界面如图所示 在这里插入图片描述 至此,stm32f103就可以自动完成对Wifi模块的初始化

这里有个小bug,服务器发数据,第一位总是被吞掉,每次发数据之前总是要加个空格才行,弄了一天也没解决。。 在这里插入图片描述在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有