1. 程式人生 > >NODEMCU除錯心得2

NODEMCU除錯心得2

關於LUA

和智慧雲平臺相似,nodemcu就是esp12的核心板加一個USB轉串列埠模組,晶片貌似比普通的USB轉TTL模組上的靠譜,電路板上用了比較貴的鉭電容,穩定性估計不錯。

雖然號稱是LUA專用平臺,但是你刷好韌體,用其它的SDK開發一點問題都沒有。但是,LUA確實有它的優勢。下面就簡單介紹一下。

什麼是LUA

  • LUA是一群巴西人在93年設計出來的。lua在葡萄牙語中是月亮的意思,發音就很像LUNA,我理解應該是替月行道的意思。
  • Lua是很輕量的指令碼語言,只有1M。
  • 用C語言編寫,和C++,C可以相互呼叫。
  • 沒有自己的庫函式,因為都用別人現成的。
  • 穩定性,速度,功能都不錯。很多大型程式用來做嵌入式指令碼,比如魔獸世界,伯德之門,和。。。三國殺
  • 當然最重要的是免費

如果想了解lua的更多,可以

本人並不打算介紹具體語法,因為我也不懂,我們先程式設計再說。

Step1

  • 首先,我們從停止執行的中文官網上搞一段程式碼,就是左上角的那段,先把路由器給連上。

    print(wifi.sta.getip())
    --nil
    wifi.setmode(wifi.STATION)
    wifi.sta.config("SSID","password")
    wifi.sta.connect()
    tmr.alarm(1, 1000, 1, function()
         if wifi.sta.getip() == nil then
             print("Connecting...")
         else
             tmr.stop(1)
             print("Connected, IP is "..wifi.sta.getip())
         end
    end)
    
  • SSIDpassword要填自己路由器的名稱和密碼。下面逐段解釋:

  • wifi.sta.getip()是在station模式下獲取IP地址。
  • --是註釋符號,nil是零的意思,在沒有連線路由時,返回的IP地址是空的。
  • wifi.setmode(wifi.STATION)很好理解,一共有三種模式,這裡設定成station模式,可以連線路由器,其他兩種是APAP+station
  • wifi.sta.config("SSID","password"),就是設定路由器的密碼和賬號。
  • 然後連線wifi.sta.connect()
  • tmr.alarm()是一個定時器函式,一共有四個變數,分別是:
    • ID
      ,選擇片上定時器的ID,一共有7個0~6,這裡選擇了1
    • interval 定時時間(ms),這裡選擇了1000,就是1s
    • repeat 重複鬧鐘次數,這裡選擇1,在一次迴圈中只執行一次。
    • function do 到事件後執行的函式,就是後面的if...else...語句
  • if...then如果獲得的IP還是空的,說明還在連線中
  • else 如果返回值不為空,說明連上了
  • tmr.stop(1),停止定時器1,
  • 然後print()列印IP地址wifi.sta.getip(),..是字串的連線符,把兩個字串連成一體。
  • 結束if語句
  • 結束function

Step2

  • 開啟ESPlor,在右側視窗,點重新整理(在open和速率選擇之間),選9600,open
  • 右側串列埠視窗會顯示一堆無法接受正確資訊之類,不用搭理。
    Can’t autodetect firmware, because proper answer not received (may be unknown firmware).
    Please, reset module or continue.
  • step1中的程式碼,複製到右側視窗,然後save,儲存一個檔名connect.lua
  • 程式碼編譯自動上傳,右側串列埠視窗顯示如下資訊,表示連線上了。

    dofile(“connect.lua”);
    nil
    Connecting…
    Connecting…
    Connecting…
    Connecting…
    Connected, IP is 192.168.1.3

  • 注意不要忘記把ssid和passward改成自己路由器的。

wifi連上了,我們可以在電腦和nodemcu之間互發訊息,

Step3

  • 首先整理一下思路,用過AT指令的朋友們知道,在station模式下,建立TCP連線的步驟是:

    Server模式,AT+CIPMUX=1開啟多連結模式;AT+CIPSERVER=1,8080建立伺服器;開啟USR-TCP232-Test.exe設定為客戶端並連線;AT+CIPSTO=2880設定伺服器超時時間;AT+CIPSTATUS檢視當前連線確保連線上。AT+CIPSEND=0,10向客戶端傳送資料,長度為10

  • Lua和AT指令都是在esp8266的原生API的基礎上進行封裝,所以步驟大同小異,開啟官方lua韌體裡的nodemcu-firmware-master\lua_examples\tcp2uart.lua,把超時和埠改成2880和8080

    uart.setup(0,9600,8,0,1,0)
      sv=net.createServer(net.TCP, 2880)
      global_c = nil
      sv:listen(8080, function(c)
        if global_c~=nil then
            global_c:close()
        end
        global_c=c
        c:on("receive",function(sck,pl) uart.write(0,pl) end)
      end)
    
    uart.on("data",4, function(data)
        if global_c~=nil then
            global_c:send(data)
        end
    end, 0)
    
  • tcp2uart.lua也是一個server伺服器,通過uart輸入資料傳送客戶端,和AT指令是很相似的,逐段解釋程式:

    uart.setup()設定串列埠埠,變數的含義分別是:只支援一個串列埠(0),波特率(9600),奇偶校驗(無),停止位(1),回顯(0,關閉)

    net.createServer()建立伺服器,型別可以選擇net.TCPnet.UDP,超時設定為60ms

    global_c = nil是一個net.socket型別變數,賦值為空nil,用來監聽客戶端

    sv:listen()listennet.server子模組下的監聽函式,(AT指令自動執行監聽,不用設定),9999是埠號,function()是連線成功後的回撥函式,c是回撥引數,代表客戶埠

    • if...end 如果全域性變數gloabal_c不為空,則關閉closegloabal_c

    • global_c=c把回撥引數c賦值給全域性變數gloabal_c

    • on(event,function())net.socket子模組下的函式,返回值是nil(也是c的),如果envet事件發生,執行回撥函式function()

    • 這裡eventrecieve,接收資訊,function的第一個變數sck是socket的意思,就是伺服器連線的客戶端,p1是從客戶端接收到字串。

    • uart.write()function()的內容,0只支援一個串列埠,把接收到的p1字串寫入串列埠
    • end結束function(sck,p1)

    • end結束listen()中的function(c)

    uart.on()設定UART事件的回撥函式,第一個變數method只支援data,表示收到資料,4設定傳輸字元的長度,當收到第4個字串,就回調函式。

    • function()就是回撥函式,if...then...是函式內容
    • 如果gloabal_c不為空,就向客戶端傳送send資料data,也就是uart接收到的長度為4的字串。
    • 兩個end分別結束iffunction(data)

    幾點說明

    程式碼的功能分四塊,

    • 第一塊net.createServer()設定伺服器
    • 第二塊listen()實現監聽,如果已連線上,監聽成功,用if...thengloabal_c清零,然後把USR-TCP232-Test客戶端nec.socket型別的c賦給gloabal_c
    • 第三塊on()實現從USR-TCP232-Test客戶端接收資料,建立在監聽成功的基礎上
    • 第四塊uart.on()實現向USR-TCP232-Test客戶端傳送資料,只有監聽成功,gloabal_c被賦值後,才能向USR-TCP232-Test客戶端傳送資料

    關於net.socket子模組

    • gloabal_cc都是nec.socket類性子模組,代表USR-TCP232-Test客戶端的連線,
    • nec.sockt(step2中儲存的connect.lua檔案)塊包含on,clos,儲存並執行e,send等方法,gloabal_cc`都有呼叫
    • sv是由net.createServer()建立的net.server伺服器連線模組,包含listen,close,send等方法,使用上與 nec.socket模組類似。
    • nec.socket型別可以通過net.createConnection()建立,如果用nodemcu作為客戶端,使用該命令。

step4

  • ESPlore左側視窗中,將step3中的程式碼複製到step1中的程式碼之下(step2中儲存的connect.lua檔案),儲存並上傳執行
  • 右側串列埠視窗顯示連線成功,給出nodemcu的IP地址
  • 開啟USR-TCP232-Test.exe,右側視窗選擇client,伺服器地址輸入nodemcu的IP地址,埠輸入8080,點選連線
  • 通過ESPlore的串列埠介面可以和USR-TCP232-Test互發資訊,USR-TCP232-Test接收到的貌似是ASCII碼

寫到這裡,這一部分快結束了,如果你想嘗試用nodemcu作為TCP client,可以參考:

  • ESP8266新手入門除錯指導(補全)
  • nodemcu 的API說明,中文API說明英文API說明 以及官方lua韌體資料夾下的\nodemcu-firmware-master\docs\en,開啟這些.md檔案你可能需要github出品的atom,非常好用的編輯器。中文說明有些錯誤,以.md檔案為準
  • 官方lua韌體資料夾裡還有nodemcu的各個模組的示例nodemcu-firmware-master\lua_modulesnodemcu-firmware-master\lua_examples

關於LUA語言

  • 從lua的文風看,已經比較接近自然語言的感覺,這一點和python有點像,但是後者有成堆的庫檔案。語法結構比較簡潔。
  • LUA是非同步事件驅動,語言風格和現在很火的Node.js非常接近。比如本文程式碼中的PIlisten(),on()等API,回撥函式嵌入到API中,一旦’event’事件發生就給予執行。對於有大量併發型事件的網路應用,執行效率應會提高不少。

下一篇準備寫寫各種網路協議:http,udp,telnet等。

相關推薦

NODEMCU除錯心得2

關於LUA 和智慧雲平臺相似,nodemcu就是esp12的核心板加一個USB轉串列埠模組,晶片貌似比普通的USB轉TTL模組上的靠譜,電路板上用了比較貴的鉭電容,穩定性估計不錯。 雖然號稱是LUA專用平臺,但是你刷好韌體,用其它的SDK開發一點問題

NODEMCU除錯心得6

關於網路協議 HTTP 按照約定,這次要講非常exciting的內容,網路協議Networking protocols。 這部分並不好寫,內容很龐雜,會分成若干部分。 網路協議我們在前面已經提及,TCP/IP協議就是最重要的網路協議。在AT指令和lua韌體

NODEMCU除錯心得7

關於網路協議 HTTP 2 上一節,我們用nodemcu伺服器向客戶端傳送nodemcu的記憶體資訊。這一節反過來,我們介紹如何用客戶端控制nodemcu。 先介紹一個簡單的例子,用客戶端控制nodemcu的GPIO4,實現nodemcu的藍色LED遠端開關

NODEMCU除錯心得1

NODEMCU除錯心得 網上沒有nodemcu的中文資料,英文資料也比較零碎。結合自己的除錯過程,整理一個。 資料篇 github上的英文入門教程,一共三頁,強烈推薦。 有點混亂的官方

201671010106 2016-2017-2《Java程序設計》學習心得2

span 代碼 收獲 學習過程 課件 自己的 資源 pan java程序 通過對第三章的學習,漸漸的更加了解了java這門課程,這門課程跟我們之前的c語言有相同之處,也有他特有的地方,在本章的學習過程中,我覺得我的課前準備預習工作做的還是不太好,當第一節課

Java-JNA使用心得2

long 回調函數 {} length 內存 指針 instance 加班 java封裝 自5月初第一次嘗試使用Java封裝調用C的dll之後,已經先後經歷了3次小項目了。 上月末是最近的一次項目實際,任務來的急時間又少,還好在加班加點後還是完成了任務,並把第二次沒有實現的

學習心得2

問題 學習 很多 draw 體會 老師 應用 要花 差異 1.這節課你學到了什麽? 這節課,通過老師的指導,學會了建立數據庫,並試著輸入了一些數據! 2.有哪些心得體會? 我感到自己對軟件的熟悉程度不夠,加上打字速度慢,錄入數據需要花費的時間很長,所以我要好好改進這些方面的

<軟件工程導論>學習心得2

人性化 題目 心得 bsp 最新 部分 排隊 任務 人性 這周我們主要完成實驗內容,我們小組選定的題目是電影院售票系統,因為我們都覺得傳統電影院售票窗口效率太低,人們往往要浪費大量的時間在排隊上面,而且觀看座位都是人工安排,無法體現人性化選擇。為了讓人們更高效的買到票,更快

shell指令碼除錯心得

1 將指令碼產生的結果檔案和臨時檔案放入自己的資料夾下,不要放在原來的地方,好一起檢視 2 在除錯的時候,可以吧臨時檔案的刪除命令註釋掉,檢視臨時檔案具體的生成形式 3 在除錯的不明白的地方 用echo $var 4 用日誌txt,儲存echo的記錄和錯誤記錄 sh /xusywap.s

STM32F103C8t6和MCP2515CAN除錯心得

前言     由於STM32微控制器自帶CAN控制器,所以STM32和MCP2515 CAN控制器聯合使用的場景不多。正好一個特殊的需求使用了MCP2515和STM32,在這裡說一下硬體連結需要注意的地方。 1.硬體     主控晶片STM32F1

ADF4351原理圖PCB電路設計,使用經驗和建議 ——【電路模組使用心得2

照列先上原理圖和PCB(使用的AD軟體設計),原理圖上備註詳細說明,也建議大家養成這個好習慣,發現問題就及時記錄,因為很多時候當時明白,可是過段時間就忘記了~~~~ PCB也是採用的3D封裝,看著舒服,嘻嘻,絲印基本加好,方便除錯焊接,設計完之後一定要記得通過

js斷點除錯心得總結

js斷點除錯心得 1.斷點除錯是啥?難不難? 進入工作中,才知道了斷點除錯是多麼的重要,作為一名程式設計師,必須要學會熟練使用除錯工具,斷點除錯就是經常用到的,斷點除錯其實並不是多麼複雜的一件事,簡單的理解無外呼就是開啟瀏覽器,開啟sources找到js檔案,在行號上點一下罷了

對計算機網路學習的一點心得2之對心得1的辨證學習

對於上一篇博文“計算機網路學習的一點心得1”,我不知道有多少是對了,又錯了多少,也許整篇博文,除了OSI的各層名稱寫對了外,其餘的便全是錯的。 經過一段時間的專案中的對HTTP協議的使用,讓我對網路協議的分層有了一點點的感覺和理解 —— 在網路傳輸中,除了應用層的協議的資料格式有差別,應用層以下

STM32 低功耗 除錯心得

MCU在進入STOP模式的時候,GPIO的狀態都是保持在進入低功耗模式之前的狀態,在最小系統中,MCU的GPIO都是懸空的,所以設定為何種狀態都不會影響到功耗。但當連線到外設後,外設的電平狀態和所連線的GPIO不一致的時候,就會產生電流。也就是所謂的漏電流!   解決辦法:將GPIO的對應GPI

除錯心得

主要記錄對做基於stm32F103自平衡小車除錯時候的一些深刻感悟(以後會繼續更新) 1.寫完MPU6050時,測資料資料顯示一次(或者一直為零)然後就不動了。 發現這個問題後,我先是除錯程式碼發現是dmp庫中的dmp_read_fifo(gyro, accel, quat, &se

Windbg程式除錯系列2-記憶體洩露問題

上篇文章給大家解釋了Windbg的基本命令和說明,這一篇給大家介紹記憶體洩露場景的問題分析。 文章大綱: 描述問題背景和現象 確定問題是否是記憶體洩露 梳理問題分析思路 動手分析解決 總結 1. 先說問題背景:生產環境IIS站點,執行一段時間後,w3wp程序記憶體會漲到2G,同時記憶體不

使用 nghttp2 除錯 HTTP/2 流量

提醒:本文最後更新於 689 天前,文中所描述的資訊可能已發生改變,請謹慎使用。 在本站之前的文章中,我介紹過兩種檢視 HTTP/2 流量的方法:1)在 Chrome 位址列輸入 chrome://net-internals/#http2,使用 Chrome 自帶的 HTTP/2 除錯工具;2)

使用 Wireshark 除錯 HTTP/2 流量

提醒:本文最後更新於 447 天前,文中所描述的資訊可能已發生改變,請謹慎使用。 我們知道,HTTP/2 引入了二進位制分幀層(Binary Framing),將每個請求和響應分割成為更小的幀,並對它們進行了二進位制編碼。與此同時,HTTP/2 沿用了之前 HTTP 版本中的絕大部分語義,上層應用基

DataTables 控制元件使用和心得 (2)

什麼是DataTables引數(Options) 上篇我們說了,DataTables控制元件的載入函式dataTable()一般都有一個物件引數,這個物件引數就是整個DataTables控制元件的引數(Options),通過定義這個引數中的各種屬性,來靈活控制DataTable的初始效果. 樣例程式碼如下:

AM437x AM335x gpio驅動除錯心得

#include <linux/init.h> #include <linux/module.h> #include <linux/leds.h> #include <linux/io.h> #include <linux/