完整版教程下載地址: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通信實現
實驗目的:
- 學習matlab的串口數據通信。
實驗內容:
- K1鍵 : 列舉AP,就是WIFI熱點;
- K2鍵 : 加入AP,就是加入WIFI熱點;
- K3鍵 : 9600波特率切換到115200,並設置為Station模式;
- 搖桿上鍵 : AT+CIFSR獲取本地IP地址;
- 搖桿下鍵 : AT+CIPSTATUS獲得IP連接狀態;
- 搖桿左鍵 : AT+CIPSTART建立TCP服務器;
- 搖桿右鍵 : 進入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通信實現
實驗目的:
- 學習matlab的串口數據通信。
實驗內容:
- K1鍵 : 列舉AP,就是WIFI熱點;
- K2鍵 : 加入AP,就是加入WIFI熱點;
- K3鍵 : 9600波特率切換到115200,並設置為Station模式;
- 搖桿上鍵 : AT+CIFSR獲取本地IP地址;
- 搖桿下鍵 : AT+CIPSTATUS獲得IP連接狀態;
- 搖桿左鍵 : AT+CIPSTART建立TCP服務器;
- 搖桿右鍵 : 進入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 總結
本章講解的例程非常實用,建議大家熟練掌握。