【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 總結

本章講解的例程非常實用,建議大家熟練掌握。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章