【STM32F407的DSP教程】第10章 Matlab的WIFI通信实现

完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547

第10章       Matlab的WIFI通信实现

本章节主要为大家讲解Matlab的WIFI方式波形数据传输和后期数据分析功能,非常实用。

目录

第10章       Matlab的WIFI通信实现

10.1 初学者重要提示

10.2 程序设计框架

10.3 实验操作步骤

10.3.1        第1步,WIFI模块的插入位置

10.3.2        第2步,串口打印的操作说明

10.3.3        第3步,K1按键按下后,会打印附近的WIF热点

10.3.4        第4步,K2按键按下后,加入其中一个WIFI热点

10.3.5        第5步,摇杆上键打印WIFI获取的IP地址

10.3.6        第6步,摇杆左键创建一个TCP服务器,端口号1001

10.3.7        第7步,摇杆右键进入Matlab通信状态

10.3.8        第8步,修改Matlab上位机程序的服务器地址

10.3.9        第9步,最有一步,运行matlab上位机程序

10.4 下位机STM32F4程序设计

10.4.1        第1步,发送的数据格式

10.4.2        第2步,接收同步信号$并发送数据

10.5 上位机Matlab程序设计

10.5.1        第1步,配置TCP客户端

10.5.2        第2步,相关变量设置

10.5.3        第3步,数据同步部分

10.5.4        第4步,显示串口上传的数据

10.5.5        第5步,FFT数据展示

10.6 实验例程说明(MDK)

10.7 实验例程说明(IAR)

10.8 总结


 

10.1 初学者重要提示

1、  测试本章节例程注意事项。

  •  请优先运行开发板,然后运行matlab。

2、 测试使用前,务必优先看本章第3小节。

10.2 程序设计框架

WIFI模块用的ESP8266,串口通信方式。Matlab端是作为TCP客户端,而WIFI模块是作为TCP服务器。上位机和下位机的程序设计框架如下:

 

10.3 实验操作步骤

由于要用到WIFI模块,非常有必要把实验操作步骤说一下,主要是考虑到一些用户没有用过WIFI。

注意:务必要保证WIFI模块和电脑在同一个局域网内。

10.3.1        第1步,WIFI模块的插入位置

 

10.3.2        第2步,串口打印的操作说明

波特率 115200,数据位 8,奇偶校验位无,停止位 1。

注:别注意截图里面的注释说明。

10.3.3        第3步,K1按键按下后,会打印附近的WIF热点

特别注意自己用的WIFI热点是否在识别出来的WIFI列表里面。

 

10.3.4        第4步,K2按键按下后,加入其中一个WIFI热点

本章配套程序的main.c文件有如下一段代码:

case KEY_DOWN_K2:            /* K2键按下, 加入某个WIFI 网络*/
    g_TCPServerOk = 0;
    ret = ESP8266_JoinAP("Netcore_7378CB", "512464265", 15000);
    if(ret == 1)
    {
       printf("\r\nJoinAP Success\r\n");
    }
    else
    {
        printf("\r\nJoinAP fail\r\n");                    
    }
    
    break;

Netcore_7378CB是热点名,而512464265是密码。需要大家根据自己的情况设置。

加入一次即可,以后上电会自动加入。

10.3.5        第5步,摇杆上键打印WIFI获取的IP地址

这个IP地址要记住,因为Matlab上位机要使用。

当前从WIFI热点获取的IP是192.168.1.5。

10.3.6        第6步,摇杆左键创建一个TCP服务器,端口号1001

打印CreateTCP Success的话,表示创建成功:

10.3.7        第7步,摇杆右键进入Matlab通信状态

这里只是设置一下状态标志,方便进入Matlab通信程序:

10.3.8        第8步,修改Matlab上位机程序的服务器地址

将第5步获取的IP地址填写到上位机程序:

%**********************************************************************************************************

%连接远程服务器,IP地址192.168.1.5,端口号1001。
t = tcpclient('192.168.1.5', 1001);

10.3.9        第9步,最有一步,运行matlab上位机程序

M文件的程序代码在例子V5-205_Matlab的WIFI波形刷新和数据分析m文件里面。M文件的运行方法在第4章的4.2小节有详细说明。

注意,测试程序时,先将板子上电,也就是先把服务器创建好,然后运行matlab程序。

10.4 下位机STM32F4程序设计

STM32F4端的程序设计思路。

10.4.1        第1步,发送的数据格式

数据格式比较简单,创建了5个uint16_t类型的数据:

uint16_t SendDATA[5];

10.4.2        第2步,接收同步信号$并发送数据

Matlab发送同步信号$(ASCII编码值是36)给开发板。

int main(void)
{
    /* 省略未写,仅留下关键代码 */

    /* 进入主程序循环体 */
    while (1)
    {

        /* 判断定时器超时时间 */
        if (bsp_CheckTimer(0))    
        {
            /* 每隔100ms 进来一次 */  
            bsp_LedToggle(2);
        }

         if (g_TCPServerOk == 1)
        {
            cmd_len = ESP8266_RxNew(cmd_buf, &tcpid);
            if(cmd_len >0)
            {
                 printf("\r\n接收到数据长度 = %d\r\n远程ID =%d\r\n数据内容=%s\r\n", 
cmd_len, tcpid, cmd_buf);
                
                /* 检索matlab发送过来的同步帧字符$,对应的ASCII数值是36 */
                if(strchr((char *)cmd_buf, 36))
                {
                    /* 回复同步帧$ */
                    ESP8266_SendTcpUdp(tcpid, (uint8_t *)&SyncData, 1);
                    bsp_DelayMS(10);
                    SendDATA[0] = rand()%65536;
                    SendDATA[1] = rand()%65536;
                    SendDATA[2] = rand()%65536;
                    SendDATA[3] = rand()%65536;
                    SendDATA[4] = rand()%65536;
                    
                    /* 发送数据,10个字节 */
                    ESP8266_SendTcpUdp(tcpid, (uint8_t *)SendDATA, 10);
                    printf("找到了相应的字符串\r\n");
                }
                else
                {
                    printf("没有找到了相应的字符串\r\n");
                }
            }
        }
    }
}

通过函数ESP8266_RxNew获取串口接收到的数据,如果数值是36(对应的ASCII字符是$),说明接收到Matlab发送过来的同步信号了。然后再通过函数ESP8266_SendTcpUdp回应一个同步字符$。

回复完毕后,迟了10ms再发数据给matlab,主要是因为matlab的波形刷新有点快,程序这里每发送给matlab一次数据,matlab就会刷新一次,10ms就相当于100Hz的刷新率,也会有一定的闪烁感。

通过这两步就完成了STM32H7端的程序设计。

10.5 上位机Matlab程序设计

Matlab端的程序设计要略复杂些,需要大家理解matlab端的API。具体说明可以看如下地址:

http://www.armbbs.cn/forum.php?mod=viewthread&tid=94598

10.5.1        第1步,配置TCP客户端

下面操作是配置TCP客户端连接服务器:

%*********************************************************************************************************

%连接远程服务器,IP地址192.168.1.5,端口号1001。
t = tcpclient('192.168.1.5', 1001);

务必要根据本章3.5小节获取的IP地址进行配置。

10.5.2        第2步,相关变量设置

程序里面对这些变量的注释已经比较详细:

AxisMax =  65536;    %坐标轴最大值
AxisMin = -65536;    %坐标轴最小值
window_width = 800;  %窗口宽度

g_Count =0;          %接收到的数据计数
SOF = 0;             %同步帧标志
AxisValue = 1;       %坐标值
RecDataDisp = zeros(1,100000); %开辟100000个数据单元,用于存储接收到的数据。
RecData = zeros(1,100);        %开辟100个数据单元,用于数据处理。
Axis = zeros(1,100000);        %开辟100000个数据单元,用于X轴。

window = window_width * (-0.9); %窗口X轴起始坐标
axis([window, window + window_width, AxisMin, AxisMax]); %设置窗口坐标范围

%子图1显示串口上传的数据
subplot(2,1,1); 
grid on;
title('串口数据接收');
xlabel('时间');
ylabel('数据');

%子图2显示波形的幅频响应
subplot(2,1,2);
grid on;
title( 'FFT');
xlabel( '频率');
ylabel( '幅度');

Fs = 100;       % 采样率
N = 50;         % 采样点数
n = 0:N-1;      % 采样序列
f = n * Fs / N; %真实的频率

这里有以下几点需要大家了解:

  •   变量RecDataDisp,RecData和Axis

这几个变量专门开辟好了数据空间,防止matlab警告和刷新波形慢的问题,大家根据需要可以进行加大。

  •  采样率Fs = 100和采样点数N = 50

这个地方要根据实际的情况进行设置。

10.5.3        第3步,数据同步部分

这部分代码比较关键,matlab先发送同步信号$出去,然后等待开发板回复同步信号$,并读取本次通信的数据。

%设置同步信号标志, = 1表示接收到下位机发送的同步帧
SOF = 0;

%发送同步帧,36对应字符'$'
data(1) = 36;
write(t, data(1));

%读取返回值
RecData = read(t,1,'uint8');

%如果检索到$,读取10个字节的数据,也就是5个uint16的数据
if(RecData == 36)
    RecData = read(t, 5, 'uint16');
    SOF =1;
    StartData = 0;
end

这里有以下几点需要大家了解:

  •   函数write(t, data(1))

用于发送同步信号$(ASCII值是36)。

  •   函数read(t,1,'uint8')

读取1个uint8类型的数据,也就是1个字节。

  •   函数if(RecData == 36)

检查接收到的数据是否是同步信号$。如果是$,继续读取10个字节的数据,也就是5个uint16的数据。

10.5.4        第4步,显示串口上传的数据

下面matlab的数据显示波形

%更新接收到的数据波形
if(SOF == 1)
    %更新数据
    RecDataDisp(AxisValue) =  RecData(1);
    RecDataDisp(AxisValue + 1) =  RecData(2);
    RecDataDisp(AxisValue + 2) =  RecData(3);
    RecDataDisp(AxisValue + 3) =  RecData(4);
    RecDataDisp(AxisValue + 4) =  RecData(5);
    
    %更新X轴
    Axis(AxisValue) = AxisValue;
    Axis(AxisValue + 1) = AxisValue + 1;
    Axis(AxisValue + 2) = AxisValue + 2;
    Axis(AxisValue + 3) = AxisValue + 3;
    Axis(AxisValue + 4) = AxisValue + 4;

    %更新变量
    AxisValue = AxisValue + 5;
    g_Count = g_Count + 5;
    
    %绘制波形
    subplot(2,1,1);
    plot(Axis(1:AxisValue-1),  RecDataDisp(1:AxisValue-1), 'r');
    window = window + 5;
    axis([window, window + window_width, AxisMin, AxisMax]);
    grid on;
    title('串口数据接收');
    xlabel('时间');
    ylabel('数据');
    drawnow
end

这里有以下几点需要大家了解:

  •   数组RecDataDisp,RecData和Axis

这里要尤其注意,matlab的数组索引是从1开始的,也是开头直接定义AxisValue = 1的原因。

  •   函数plot

这里plot的实现尤其重要,务必要注意坐标点和数值个数要匹配。

10.5.5        第5步,FFT数据展示

FFT部分会在在后面章节为大家详细讲解,这里也做个说明,这里是每接收够50个数据,做一次FFT:

if(g_Count== 50)
   subplot(2,1,2); 
   %对原始信号做 FFT 变换
   y = fft(RecDataDisp(AxisValue-50:AxisValue-1), 50); 
   
   %求 FFT 转换结果的模值
   Mag = abs(y)*2/N;  
   
   %绘制幅频相应曲线
   plot(f, Mag, 'r'); 
   grid on;
   title( 'FFT');
   xlabel( '频率');
   ylabel( '幅度');
   g_Count = 0;
   drawnow
end

10.6 实验例程说明(MDK)

配套例子:

V5-204_Matlab的WIFI通信实现

实验目的:

  1. 学习matlab的串口数据通信。

实验内容:

  1. K1键  : 列举AP,就是WIFI热点;
  2. K2键  : 加入AP,就是加入WIFI热点;
  3. K3键  : 9600波特率切换到115200,并设置为Station模式;
  4. 摇杆上键  : AT+CIFSR获取本地IP地址;
  5. 摇杆下键  : AT+CIPSTATUS获得IP连接状态;
  6. 摇杆左键  : AT+CIPSTART建立TCP服务器;
  7. 摇杆右键  : 进入Maltab数据通信状态;

使用AC6注意事项

特别注意附件章节C的问题。

上电后串口打印的信息:

波特率 115200,数据位 8,奇偶校验位无,停止位 1

Matlab的上位机效果:

程序设计:

  系统栈大小分配:

 

  硬件外设初始化

硬件外设的初始化是在 bsp.c 文件实现:

/*
*********************************************************************************************************
*    函 数 名: bsp_Init
*    功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次
*    形    参:无
*    返 回 值: 无
*********************************************************************************************************
*/
void bsp_Init(void)
{
    /* 
       STM32F407 HAL 库初始化,此时系统用的还是F407自带的16MHz,HSI时钟:
       - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。
       - 设置NVIV优先级分组为4。
     */
    HAL_Init();

    /* 
       配置系统时钟到168MHz
       - 切换使用HSE。
       - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。
    */
    SystemClock_Config();

    /* 
       Event Recorder:
       - 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。
       - 默认不开启,如果要使能此选项,务必看V5开发板用户手册第8章
    */    
#if Enable_EventRecorder == 1  
    /* 初始化EventRecorder并开启 */
    EventRecorderInitialize(EventRecordAll, 1U);
    EventRecorderStart();
#endif
    
    bsp_InitKey();        /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */
    bsp_InitTimer();      /* 初始化滴答定时器 */
    bsp_InitUart();    /* 初始化串口 */
    bsp_InitLed();        /* 初始化LED */        

    bsp_InitESP8266();    /* 配置ESP8266模块相关的资源 */
}

  主功能:

主程序实现如下操作:

  •  接收matlab发送过来的同步信号,并回一个同步信号后,传输相应的数据过去
/*
*********************************************************************************************************
*    函 数 名: main
*    功能说明: c程序入口
*    形    参:无
*    返 回 值: 错误代码(无需处理)
*********************************************************************************************************
*/
int main(void)
{
    uint8_t ucKeyCode;        /* 按键代码 */
    uint8_t ucValue;
    uint8_t ret;
    uint8_t SyncData = 36;
    uint16_t SendDATA[5];


    bsp_Init();        /* 硬件初始化 */
    PrintfLogo();    /* 打印例程信息到串口1 */

    PrintfHelp();    /* 打印操作提示信息 */

    /* 模块上电 */
    printf("\r\n【1】正在给ESP8266模块上电...(波特率: 74880bsp)\r\n");
    ESP8266_PowerOn();

    printf("\r\n【2】上电完成。波特率: 115200bsp\r\n");
    
    /* 检测模块波特率是否为115200 */
    ESP8266_SendAT("AT");
    if (ESP8266_WaitResponse("OK", 50) == 1)
    {
        printf("\r\n【3】模块应答AT成功\r\n");
        bsp_DelayMS(1000);
    }
    else
    {
        printf("\r\n【3】模块无应答, 请按K3键修改模块的波特率为115200\r\n");
        bsp_DelayMS(1000);
    }
    
    g_TCPServerOk = 0;
    
    bsp_StartAutoTimer(0, 100);    /* 启动1个100ms的自动重装的定时器 */

    /* 进入主程序循环体 */
    while (1)
    {
        bsp_Idle();        /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */

        /* 判断定时器超时时间 */
        if (bsp_CheckTimer(0))    
        {
            /* 每隔100ms 进来一次 */  
            bsp_LedToggle(2);
        }
        
        /* 进入Matlab通信状态执行下面程序 */
        if (g_TCPServerOk == 1)
        {
            cmd_len = ESP8266_RxNew(cmd_buf, &tcpid);
            if(cmd_len >0)
            {
                printf("\r\n接收到数据长度 = %d\r\n远程ID =%d\r\n数据内容=%s\r\n", 
cmd_len, tcpid, cmd_buf);
                
                /* 检索matlab发送过来的同步帧字符$,对应的ASCII数值是36 */
                if(strchr((char *)cmd_buf, 36))
                {
                    /* 回复同步帧$ */
                    ESP8266_SendTcpUdp(tcpid, (uint8_t *)&SyncData, 1);
                    bsp_DelayMS(10);
                    SendDATA[0] = rand()%65536;
                    SendDATA[1] = rand()%65536;
                    SendDATA[2] = rand()%65536;
                    SendDATA[3] = rand()%65536;
                    SendDATA[4] = rand()%65536;
                    
                    /* 发送数据,10个字节 */
                    ESP8266_SendTcpUdp(tcpid, (uint8_t *)SendDATA, 10);
                    printf("找到了相应的字符串\r\n");
                }
                else
                {
                    printf("没有找到了相应的字符串\r\n");
                }
            }
        }
        /* 未进入Matlab通信状态执行下面程序 */
        else
        {            
            /* 从WIFI收到的数据发送到串口1 */
            if (comGetChar(COM_ESP8266, &ucValue))
            {
                comSendChar(COM1, ucValue);
            }
            /* 将串口1的数据发送到8266模块 */
            if (comGetChar(COM1, &ucValue))
            {
                comSendChar(COM_ESP8266, ucValue);
            }
        }

        ucKeyCode = bsp_GetKey();    /* 读取键值, 无键按下时返回 KEY_NONE = 0 */
        if (ucKeyCode != KEY_NONE)
        {
            switch (ucKeyCode)
            {
                case KEY_DOWN_K1:            /* K1键按下,列举当前的WIFI热点 */
                    g_TCPServerOk = 0;
                    ESP8266_SendAT("AT+CWLAP");    
                    break;

                case KEY_DOWN_K2:            /* K2键按下, 加入某个WIFI 网络*/
                    g_TCPServerOk = 0;
                    //ESP8266_SendAT("AT+CWJAP=\"Netcore_7378CB\",\"512464265\"");
                    ret = ESP8266_JoinAP("Netcore_7378CB", "512464265", 15000);
                    if(ret == 1)
                    {
                       printf("\r\nJoinAP Success\r\n");
                    }
                    else
                    {
                        printf("\r\nJoinAP fail\r\n");                    
                    }
                    
                    break;

                case KEY_DOWN_K3:                        /* K3键-9600波特率切换到115200 */
                    g_TCPServerOk = 0;
                    ESP8266_9600to115200();
                    break;

                case JOY_DOWN_U:                      /* 摇杆上键, AT+CIFSR获取本地IP地址 */
                    g_TCPServerOk = 0;
                    ESP8266_SendAT("AT+CIFSR");
                    break;

                case JOY_DOWN_D:                      /* 摇杆下键 AT+CIPSTATUS获得IP连接状态 */
                    g_TCPServerOk = 0;
                    ESP8266_SendAT("AT+CIPSTATUS");
                    break;

                case JOY_DOWN_L:                      /* 摇杆左键按下,创建TCP服务器 */
                    g_TCPServerOk = 0;
                    ret = ESP8266_CreateTCPServer(1001);
                    if(ret == 1)
                    {
                       printf("\r\nCreateTCP Success\r\n");
                    }
                    else
                    {
                        printf("\r\nCreateTCP fail\r\n");                    
                    }
                    break;

                case JOY_DOWN_R:                    /* 摇杆右键按下,进入Maltab数据通信状态 */
                    g_TCPServerOk = 1;
                    printf("\r\n 进入Maltab数据通信状态 \r\n");
                    break;

                case JOY_DOWN_OK:                   /* 摇杆OK键按下,创建WIFI热点 */
                    g_TCPServerOk = 0;
                    #if 0
                     ESP8266_SendAT("AT+CIPSTART=\"TCP\",\"WWW.ARMFLY.COM\",80");
                    #endif
                
                    #if 0
                     {
                      char ip[20], mac[32];
                      ESP8266_GetLocalIP(ip, mac);
                      printf("ip=%s, mac=%s\r\n", ip, mac);            
                     }
                    #endif
                
                    #if 1
                     ESP8266_SetWiFiMode(3);
                     ESP8266_SendAT("AT+CWSAP=\"ESP8266\",\"1234567890\",1,3");
                    #endif
                    break;

                default:
                    /* 其他的键值不处理 */
                    break;
            }
        }
    }
}

10.7 实验例程说明(IAR)

配套例子:

V5-204_Matlab的WIFI通信实现

实验目的:

  1. 学习matlab的串口数据通信。

实验内容:

  1. K1键  : 列举AP,就是WIFI热点;
  2. K2键  : 加入AP,就是加入WIFI热点;
  3. K3键  : 9600波特率切换到115200,并设置为Station模式;
  4. 摇杆上键  : AT+CIFSR获取本地IP地址;
  5. 摇杆下键  : AT+CIPSTATUS获得IP连接状态;
  6. 摇杆左键  : AT+CIPSTART建立TCP服务器;
  7. 摇杆右键  : 进入Maltab数据通信状态;

使用AC6注意事项

特别注意附件章节C的问题。

上电后串口打印的信息:

波特率 115200,数据位 8,奇偶校验位无,停止位 1

Matlab的上位机效果:

程序设计:

  系统栈大小分配:

  硬件外设初始化

硬件外设的初始化是在 bsp.c 文件实现:

/*
*********************************************************************************************************
*    函 数 名: bsp_Init
*    功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次
*    形    参:无
*    返 回 值: 无
*********************************************************************************************************
*/
void bsp_Init(void)
{
    /* 
       STM32F407 HAL 库初始化,此时系统用的还是F407自带的16MHz,HSI时钟:
       - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。
       - 设置NVIV优先级分组为4。
     */
    HAL_Init();

    /* 
       配置系统时钟到168MHz
       - 切换使用HSE。
       - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。
    */
    SystemClock_Config();

    /* 
       Event Recorder:
       - 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。
       - 默认不开启,如果要使能此选项,务必看V5开发板用户手册第8章
    */    
#if Enable_EventRecorder == 1  
    /* 初始化EventRecorder并开启 */
    EventRecorderInitialize(EventRecordAll, 1U);
    EventRecorderStart();
#endif
    
    bsp_InitKey();        /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */
    bsp_InitTimer();      /* 初始化滴答定时器 */
    bsp_InitUart();    /* 初始化串口 */
    bsp_InitLed();        /* 初始化LED */        

    bsp_InitESP8266();    /* 配置ESP8266模块相关的资源 */
}

  主功能:

主程序实现如下操作:

  •   接收matlab发送过来的同步信号,并回一个同步信号后,传输相应的数据过去
/*
*********************************************************************************************************
*    函 数 名: main
*    功能说明: c程序入口
*    形    参:无
*    返 回 值: 错误代码(无需处理)
*********************************************************************************************************
*/
int main(void)
{
    uint8_t ucKeyCode;        /* 按键代码 */
    uint8_t ucValue;
    uint8_t ret;
    uint8_t SyncData = 36;
    uint16_t SendDATA[5];


    bsp_Init();        /* 硬件初始化 */
    PrintfLogo();    /* 打印例程信息到串口1 */

    PrintfHelp();    /* 打印操作提示信息 */

    /* 模块上电 */
    printf("\r\n【1】正在给ESP8266模块上电...(波特率: 74880bsp)\r\n");
    ESP8266_PowerOn();

    printf("\r\n【2】上电完成。波特率: 115200bsp\r\n");
    
    /* 检测模块波特率是否为115200 */
    ESP8266_SendAT("AT");
    if (ESP8266_WaitResponse("OK", 50) == 1)
    {
        printf("\r\n【3】模块应答AT成功\r\n");
        bsp_DelayMS(1000);
    }
    else
    {
        printf("\r\n【3】模块无应答, 请按K3键修改模块的波特率为115200\r\n");
        bsp_DelayMS(1000);
    }
    
    g_TCPServerOk = 0;
    
    bsp_StartAutoTimer(0, 100);    /* 启动1个100ms的自动重装的定时器 */

    /* 进入主程序循环体 */
    while (1)
    {
        bsp_Idle();        /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */

        /* 判断定时器超时时间 */
        if (bsp_CheckTimer(0))    
        {
            /* 每隔100ms 进来一次 */  
            bsp_LedToggle(2);
        }
        
        /* 进入Matlab通信状态执行下面程序 */
        if (g_TCPServerOk == 1)
        {
            cmd_len = ESP8266_RxNew(cmd_buf, &tcpid);
            if(cmd_len >0)
            {
                printf("\r\n接收到数据长度 = %d\r\n远程ID =%d\r\n数据内容=%s\r\n", 
cmd_len, tcpid, cmd_buf);
                
                /* 检索matlab发送过来的同步帧字符$,对应的ASCII数值是36 */
                if(strchr((char *)cmd_buf, 36))
                {
                    /* 回复同步帧$ */
                    ESP8266_SendTcpUdp(tcpid, (uint8_t *)&SyncData, 1);
                    bsp_DelayMS(10);
                    SendDATA[0] = rand()%65536;
                    SendDATA[1] = rand()%65536;
                    SendDATA[2] = rand()%65536;
                    SendDATA[3] = rand()%65536;
                    SendDATA[4] = rand()%65536;
                    
                    /* 发送数据,10个字节 */
                    ESP8266_SendTcpUdp(tcpid, (uint8_t *)SendDATA, 10);
                    printf("找到了相应的字符串\r\n");
                }
                else
                {
                    printf("没有找到了相应的字符串\r\n");
                }
            }
        }
        /* 未进入Matlab通信状态执行下面程序 */
        else
        {            
            /* 从WIFI收到的数据发送到串口1 */
            if (comGetChar(COM_ESP8266, &ucValue))
            {
                comSendChar(COM1, ucValue);
            }
            /* 将串口1的数据发送到8266模块 */
            if (comGetChar(COM1, &ucValue))
            {
                comSendChar(COM_ESP8266, ucValue);
            }
        }

        ucKeyCode = bsp_GetKey();    /* 读取键值, 无键按下时返回 KEY_NONE = 0 */
        if (ucKeyCode != KEY_NONE)
        {
            switch (ucKeyCode)
            {
                case KEY_DOWN_K1:            /* K1键按下,列举当前的WIFI热点 */
                    g_TCPServerOk = 0;
                    ESP8266_SendAT("AT+CWLAP");    
                    break;

                case KEY_DOWN_K2:            /* K2键按下, 加入某个WIFI 网络*/
                    g_TCPServerOk = 0;
                    //ESP8266_SendAT("AT+CWJAP=\"Netcore_7378CB\",\"512464265\"");
                    ret = ESP8266_JoinAP("Netcore_7378CB", "512464265", 15000);
                    if(ret == 1)
                    {
                       printf("\r\nJoinAP Success\r\n");
                    }
                    else
                    {
                        printf("\r\nJoinAP fail\r\n");                    
                    }
                    
                    break;

                case KEY_DOWN_K3:                        /* K3键-9600波特率切换到115200 */
                    g_TCPServerOk = 0;
                    ESP8266_9600to115200();
                    break;

                case JOY_DOWN_U:                      /* 摇杆上键, AT+CIFSR获取本地IP地址 */
                    g_TCPServerOk = 0;
                    ESP8266_SendAT("AT+CIFSR");
                    break;

                case JOY_DOWN_D:                      /* 摇杆下键 AT+CIPSTATUS获得IP连接状态 */
                    g_TCPServerOk = 0;
                    ESP8266_SendAT("AT+CIPSTATUS");
                    break;

                case JOY_DOWN_L:                      /* 摇杆左键按下,创建TCP服务器 */
                    g_TCPServerOk = 0;
                    ret = ESP8266_CreateTCPServer(1001);
                    if(ret == 1)
                    {
                       printf("\r\nCreateTCP Success\r\n");
                    }
                    else
                    {
                        printf("\r\nCreateTCP fail\r\n");                    
                    }
                    break;

                case JOY_DOWN_R:                    /* 摇杆右键按下,进入Maltab数据通信状态 */
                    g_TCPServerOk = 1;
                    printf("\r\n 进入Maltab数据通信状态 \r\n");
                    break;

                case JOY_DOWN_OK:                   /* 摇杆OK键按下,创建WIFI热点 */
                    g_TCPServerOk = 0;
                    #if 0
                     ESP8266_SendAT("AT+CIPSTART=\"TCP\",\"WWW.ARMFLY.COM\",80");
                    #endif
                
                    #if 0
                     {
                      char ip[20], mac[32];
                      ESP8266_GetLocalIP(ip, mac);
                      printf("ip=%s, mac=%s\r\n", ip, mac);            
                     }
                    #endif
                
                    #if 1
                     ESP8266_SetWiFiMode(3);
                     ESP8266_SendAT("AT+CWSAP=\"ESP8266\",\"1234567890\",1,3");
                    #endif
                    break;

                default:
                    /* 其他的键值不处理 */
                    break;
            }
        }
    }
}

10.8 总结

本章讲解的例程非常实用,建议大家熟练掌握。

 

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值