1. 程式人生 > >nrf51822微控制器驅動ESP8266模組中遇到的問題總結

nrf51822微控制器驅動ESP8266模組中遇到的問題總結

作者:李大闖    2017/08/26 18:01

在實際工作中,原本是使用nrf51822作為核心mcu,但是由於大批量資料傳輸的需要,所以外掛了一個ESP8266的模組,用於批量資料傳輸。本篇文章總結了在使用nrf51822微控制器驅動ESP8266模組時遇到的一些問題及解決方法,在此記錄備忘。

2016.5.5 ESP8266模組工作於STA模式還是AP模式? 看一下AP模式和STA模式的定義和區別 AP模式: Access Point,提供無線接入服務,允許其它無線裝置接入,提供資料訪問,一般的無線路由/網橋工作在該模式下。AP和AP之間允許相互連線
Sta模式:Station, 類似於無線終端,sta本身並不接受無線的接入,它可以連線到AP, 一般無線網絡卡即工作在該模式。

根據以上的意思,應該讓模組工作在AP模式,這樣的話手機就可以連線到模組的wifi進而建立連線並傳輸資料。 手機和模組之間使用TCP連線還是UDP連線? 一下TCP連線和UDP連線的定義和區別 1.TCP基於連線,UDP基於無連線;
2.對系統資源的要求(TCP較多,UDP少);
3.UDP程式結構較簡單;
4.流模式與資料報模式 ;
5.TCP保證資料正確性,UDP可能丟包,TCP保證資料順序,UDP不保證。
考慮到資料傳輸準確性和可靠性的問題,使用TCP傳輸 ESP8266和手機建立TCP連線並通訊的過程(這裡主要針對透傳)
逐條傳送以下指令: AT+CWMODE=3         //設定ESP8266模組處於AP兼Station模式。這時可以用手機搜尋到8266模組的wifi,連線上之後開啟手機上安裝的有人網路助手

                                    //建立TCP伺服器。手機被分配的ip地址為192.168.4.2,選擇埠號為8899 AT+CIPMUX=0            //使用單連線。透傳模式下只能使用單連線。但是模組處於伺服器模式時,必須使用多連線,所以說當模組設定為伺服器時,不能使用透                                                                                                                                                
                                    //傳。也即是說,如果要使用透傳,則ESP8266必須扮演客戶端的角色。 AT+CIPSTART="TCP","192.168.4.2",8899         //建立TCP連線,伺服器的ip地址為192.168.4.2,埠號為8899 AT+CIPMODE=1         //設定啟用透傳模式 AT+CIPSEND               //進入透傳。該指令後將進入透傳模式,此後ESP8266將不能識別串列埠AT指令,所有串串列埠串接到的字元都將將透傳到手機。 注:在傳送這些指令時,一定要在串列埠除錯軟體裡面選擇“傳送新行”,或者手動加一個回車。 另外,在實際的使用過程中發現,有些指令的設定結果在ESP8266模組掉電之後仍會儲存(AT+CWMODE=3和AT+CIPMUX=0),所以只在51822上電時發這兩條指令。而另外三條指令只在用到時才進行配置。 ESP8266的其它常用指令
AT                                            //測試指令,返回OK
AT+RST                                    //ESP8266模組復位 +++                                        //退出透傳狀態。注意該指令使用時後面不加回車。 AT+CIPCLOSE                        //關閉TCP連線 AT+CIPSTATUS                    //查詢當前TCP連線狀態。 //如果當前TCP處於連線狀態,則返回                                   AT+CIPSTATUS\r\r\nSTATUS:5\r\n+CIPSTATUS:0,"TCP","192.168.4.2",8899,11964,0\r\n\r\nOK\r\n   //當未建立TCP連線時,則返回    AT+CIPSTATUS\r\r\nSTATUS:5\r\n\r\nOK\r\n AT+CWLIF                                //列出當前接入該AP的裝置的ip地址 //當沒有手機連線時的回覆:
AT+CWLIF\r\r\n\r\nOK\r\n
//當手機連上時的回覆:
AT+CWLIF\r\r\n192.168.4.2,14:f6:5a:a1:47:32\r\n\r\nOK\r\n 實際使用過程中建立TCP連線指令AT+CIPSTART的使用技巧 AT+CIPSTART="TCP","192.168.4.2",8899 在實際使用過程中,需要手機端通過藍芽傳送手機端伺服器ip地址和埠號資訊給51822模組, 51822解析之後再把它加工成對8266模組的配置指令再發送建立tcp連線。
因為ip地址的長度可能不固定,比如說伺服器的ip地址可能是192.168.4.2,也可能是192.168.4.100,這樣的話對於實際轉化成配置指令帶來不便。實際測試發現,可以將ip地址轉化成固定的位數,即xxx.xxx.xxx.xxx,不夠的位置高位補0,如192.168.4.2可以寫成192.168.004.002。 同理,把埠號固定成5位,如8899可以寫成08899. 測試結果顯示AT+CIPSTART="TCP","192.168.004.002",08899和AT+CIPSTART="TCP","192.168.4.2",8899的效果是一樣的。
另一個就是關於發起TCP連線之後連線是否建立成功的判斷 傳送AT+CIPSTART="TCP","192.168.004.002",08899建立連線之後,會有三種返回資訊: 1.TCP連線建立成功 AT+CIPSTART="TCP","192.168.004.002",08899 CONNECT OK 對應邏輯分析儀採集到的字串為: AT+CIPSTART="TCP","192.168.004.002",08899\r\r\nCONNECT\r\n\r\nOK\r\n
2.TCP連線之前已經建立 AT+CIPSTART="TCP","192.168.004.002",08899 ALREADY CONNECTED ERROR 對應邏輯分析儀採集到的字串為: AT+CIPSTART="TCP","192.168.004.002",08899\r\r\nALREADY CONNECTED\r\n\r\nERROR\r\n
3.TCP連線建立失敗 AT+CIPSTART="TCP","192.168.4.2",8899 ERROR CLOSED 對應邏輯分析儀採集到的字串為: AT+CIPSTART="TCP","192.168.004.002",08899\r\r\n\r\nERROR\r\nCLOSED\r\n
實際測試發現,如果之前TCP連線已經建立,也就是第2種情況,那字串的返回是連續的,而且是非常快的;但是另外兩種情況,都是會先返回AT+CIPSTART="TCP","192.168.004.002",08899嘗試去連線,嘗試過後會返回連結成功或連線失敗,但是很重要的一點是,嘗試連結的時間是不固定的,可能很快(如10ms)連線成功並返回,也可能很長時間(大於100ms)才連結成功並返回。所以如果使用串列埠接收中斷來接收返回字串並判斷是否連線成功是非常困難的。我最後的做法是,不判斷該條指令的返回字串,如果要使用透傳功能,就在使用之前傳送建立TCP連線的指令(不管當前TCP連線是否建立),然後過一段時間(如200ms)再使用查詢語句去查詢當前TCP連線是否建立。 實際使用過程中查詢TCP連線狀態指AT+CIPSTATUS的使用方法 在使用AT+CIPSTATUS指令查詢當前TCP連線狀態時,會有兩種返回字串: //如果當前TCP處於連線狀態,則返回       AT+CIPSTATUS\r\r\nSTATUS:5\r\n+CIPSTATUS:0,"TCP","192.168.4.2",8899,11964,0\r\n\r\nOK\r\n   //當未建立TCP連線時,則返回    AT+CIPSTATUS\r\r\nSTATUS:5\r\n\r\nOK\r\n 在實際使用過程中,對返回字串的接收和處理方法是這樣的: 先判斷是否接收到了AT+前導碼,如果接收到了,就開啟超時定時器,超時定時器每中斷一次,會將一個變數計數值加1,而在串列埠接收中斷函式裡面後面每接收到一個位元組都會將該計數值清0,如果在規定的時間內該計數值沒有清0,在超時定時器的中斷函式裡檢測到計數值大於規定值,則認為本次接收已經完成,超時定時器關閉,觸發資料包處理函式。 緊接著就是處理這個資料包,根據CIPSTATUS來判斷是不是該指令的返回值,再根據後面的\r或+來判斷當前的連線狀態。 如何知道一個操作過程從開始到結束所用的精確時間? 初始化一個引腳為低電平,當操作開始的時候將該引腳拉高,當結束的時候再拉低,在操作的時候用邏輯分析儀監控這個引腳,看高電平持續的時間就可以知道這個操作過程持續了多長時間了 下面是在除錯過程中遇到的一些現象及分析和解決方法 現象:使用Mini usb給藍芽開發板供電,使用鋰電池給8266模組供電,兩者共地,在51822通過串列埠傳送配置指令給8266模組時經常會出現藍芽斷線、51822晶片重啟等情況 除錯和分析:除錯發現,當使用同一個電源(如外部穩壓電源3.3V)給8266模組和51822開發板供電時,使用51822傳送串列埠配置指令,會很少出現藍芽斷線或重啟的情況。
現象:用外部穩壓電源3.3V接51822開發板的一組VCC和GND,開發板不能工作(看不到廣播燈閃爍),而用Mini usb供電可以工作 除錯和分析:在除錯過程中發現,使用外部電源供電開發板不能工作,但當開發板上的RX引腳接上ESP8266模組的TX引腳時,開發板可以工作了。於是可以將這個問題看成跟之前發現的  51822初始化了串列埠但串列埠沒有接負載時不能正常工作  是同一個問題。 現象:用外部穩壓電源3.3V給51822供電,接了8266模組的串列埠,仍然不能工作 除錯和分析:多次嘗試發現,用3.3V給51822開發板和8266模組供電,51822開發板和8266模組串列埠連線,如果51822開發板不能工作,那用Mini usb重新給51822開發板下載一次程式,再拔掉Mini usb供電,51822開發板就可以工作了。
 ESP8266模組異常工作狀態的表現 在8266模組的使用過程中,會出現上電沒能正常工作的情況,有時也會出現在工作過程中突然不能正常工作的情況。當8266模組工作異常時,通過其模組的工作電流可以有一個大致的判斷,在其正常工作時,供電電流是0.07A,當大於這個值(如0.15A,0.34A)或小於這個值(如0.05A)都不能正常工作,經常會伴隨晶片嚴重發熱的情況,且紅色工作狀態指示LED亮度也會有變暗。 現象:用51822串列埠連續發兩條AT配置指令(AT+CWMODE=3,AT+CIPMUX=0),兩條指令之間加20ms的延時,但是使用邏輯分析儀觀察發現,接收到的時序是  A  20ms延時   T+CWMODE=3AT+CIPMUX=0,即先接收到了第一個字串的第一個字元,延時過後,第一個字串的後面的部分跟第二個字串一起接收到
除錯和分析:嘗試了以下方法 1.增加延時時間至1000ms或2000ms。發現結果一樣。 2.把傳送操作由按鍵觸發改放到藍芽指令觸發。結果一樣 3.把ms延時函式(nrf_delay_ms)改用us延時函式(nrf_delay_us)替換。結果一樣 4.更改串列埠初始化函式uart_init()的位置,放在開啟廣播之後。結果一樣。 5.在傳送完一個字串之後,重新呼叫串列埠初始化函式,再發下一條字串。結果是,第一個字串發出第一個字元A後,系統重啟。 6.改傳送字串改成傳送十六進位制數。結果一樣 7.原本把傳送語句放在按鍵中斷處理函式和藍芽接收中斷裡,改把傳送語句放在主迴圈中。不會出現上述問題 8.使用裸機程式傳送字串。不會出現上述問題 9.在帶協議棧的程式中,直接操作暫存器進行串列埠初始化操作,直接操作暫存器完成傳送字串函式。不會出現上述問題。 10.用軟體定時器定時20ms,每次中斷髮送一個字串。不會出現上述問題。 問題的根源在於fifo的操作過程,但解決方法未找到。最終還是使用軟體定時器來解決上述問題。 現象:手機連上8266模組的熱點之後,開啟有人網路助手,開啟伺服器監聽,發現ip地址不是預期的192.168.4.2,而是192.168.1.xxx。
除錯及分析:這種現象是由於在手機連上8266模組的熱點之前就打開了有人網路助手,有人網路助手獲取了之前的wifi網路給手機分配的ip地址,並且即使手機切換了wifi網路(改成連線8266模組的熱點)後有人網路還是會保持之前獲取的ip地址。解決方法是,在連結上8266的wifi之後,關閉有人網路助手,並且結束它後臺的程序,重新開啟有人網路助手,再開啟監聽,發現有人網路助手已經獲取到手機當前的ip地址。