最近学习了用stm32连接wifi模块,过程比较坎坷,这里记录一下学习过程
阅读原文时间:2021年04月20日阅读:1

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

**目录:
  1. stm32CuMx的配置
  2. Keil编写代码
  3. 调试

一:配置stm32CubeMx


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

二:编写Keil代码

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

  1. 测试指令:AT

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

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

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

  1. 查询当前Wifi:AT+CWLAP
  2. 加入特定wifi网络:AT+CWJAP=“wifi名”,“密码”
  3. 查询是否连接到网络中:AT+CWJAP?
  4. 模块以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 )
        {
            HAL_UART_Transmit(&huart2,&my_re_buf1[pt_r1++],1,1000);
        }
        if(pt_r1>=pt_w1)
        {
            pt_w1=pt_r1=0;

        }
        while(pt_r2<pt_w2 )
        {
            HAL_UART_Transmit(&huart1,&my_re_buf2[pt_r2++],1,1000);
        }
        if(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,服务器发数据,第一位总是被吞掉,每次发数据之前总是要加个空格才行,弄了一天也没解决。。

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章