【STM32F429的DSP教程】第10章 Matlab的WIFI通信實現


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

第10章       Matlab的WIFI通信實現

本章節主要為大家講解Matlab的WIFI方式波形數據傳輸和后期數據分析功能,非常實用。

10.1 初學者重要提示

10.2 程序設計框架

10.3 實驗操作步驟

10.4 下位機STM32F4程序設計

10.5 上位機Matlab程序設計

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)

配套例子:

V6-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_InitExtIO();   /* 初始化擴展IO */
    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)

配套例子:

V6-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)
{
    /* 
       STM32F429 HAL 庫初始化,此時系統用的還是F429自帶的16MHz,HSI時鍾:
       - 調用函數HAL_InitTick,初始化滴答時鍾中斷1ms。
       - 設置NVIV優先級分組為4。
     */
    HAL_Init();

    /* 
       配置系統時鍾到168MHz
       - 切換使用HSE。
       - 此函數會更新全局變量SystemCoreClock,並重新配置HAL_InitTick。
    */
    SystemClock_Config();

    /* 
       Event Recorder:
       - 可用於代碼執行時間測量,MDK5.25及其以上版本才支持,IAR不支持。
       - 默認不開啟,如果要使能此選項,務必看V6開發板用戶手冊第8章
    */    
#if Enable_EventRecorder == 1  
    /* 初始化EventRecorder並開啟 */
    EventRecorderInitialize(EventRecordAll, 1U);
    EventRecorderStart();
#endif
    
    bsp_InitKey();        /* 按鍵初始化,要放在滴答定時器之前,因為按鈕檢測是通過滴答定時器掃描 */
    bsp_InitTimer();      /* 初始化滴答定時器 */
    bsp_InitUart();    /* 初始化串口 */
    bsp_InitExtIO();   /* 初始化擴展IO */
    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 總結

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM