閑言碎語
這回來了解一下nodeMCU的串口模塊。串口應(yīng)該是我們用的最多的一個模塊了输莺,lua腳本都是通過串口傳到mcu上面的戚哎。這部分的內(nèi)容很少,只有4個函數(shù)嫂用。文檔中提到了默認(rèn)的波特率是115200型凳,且在上電的前2分鐘內(nèi)啟動了自動波特率功能。
模塊函數(shù)
僅有4個函數(shù)嘱函,都很簡單甘畅。
序號 | 函數(shù)名 | 參數(shù) | 返回值 |
---|---|---|---|
1 | uart.alt() | on | nil |
2 | uart.on() | method, [number/end_char], [function], [run_input] | nil |
3 | uart.setup() | id, baud, databits, parity, stopbits, echo | number |
4 | uart.write() | id, data1 [, data2, ...] | nil |
- .alt可以重映射串口pin。傳入1將pin映射到13往弓、15疏唾。
- .on用來設(shè)置串口接收回調(diào)函數(shù)。第一個參數(shù)現(xiàn)在只能傳入"data"函似。參數(shù)2可以傳入數(shù)字或者僅有單個字符的字符串槐脏,例如傳入6就收到6個字符串就產(chǎn)生回調(diào),不能大于255撇寞;傳入"s"就接收到s的時候就產(chǎn)生回調(diào)或者收完255個字符顿天。參數(shù)3是回調(diào)函數(shù),取消回調(diào)就只傳入"data"參數(shù)蔑担。參數(shù)4牌废,是否執(zhí)行l(wèi)ua解析,如果傳入0將不解析執(zhí)行啤握。
- .setup配置串口鸟缕。id只能傳入0。后面的分別是波特率(300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 74880, 115200, 230400, 256000, 460800, 921600, 1843200, 3686400)排抬、數(shù)據(jù)位(5, 6, 7, 8)懂从、校驗(uart.PARITY_NONE, uart.PARITY_ODD, uart.PARITY_EVEN)、停止位(uart.STOPBITS_1, uart.STOPBITS_1_5, uart.STOPBITS_2)蹲蒲。echo表示回顯莫绣,0不回顯。
- .write是寫函數(shù)悠鞍。id只能傳入0。
綜合小例子
串口模塊比較簡單,直接來看看例子咖祭。把波特率設(shè)置38400 8-N-1 不帶回顯掩宜。回調(diào)不執(zhí)行l(wèi)ua代碼解析么翰。這里使用1號pin來設(shè)別是否切換串口設(shè)置牺汤。
gpio.mode(1, gpio.INPUT, gpio.PULLUP)
gpio.mode(0, gpio.OUTPUT)
tmr.alarm(0, 10000, tmr.ALARM_SINGLE, function()
gpio.write(0, gpio.LOW)
if(gpio.read(1) == 0) then
print("38400 8-n-1")
uart.setup(0, 38400, 8, uart.PARITY_NONE, uart.STOPBITS_1, 0)
uart.on("data", 8, function(data)
uart.write(0, "rec: ", data)
end, 0)
else
print("115200 8-n-1")
uart.setup(0, 115200, 8, uart.PARITY_NONE, uart.STOPBITS_1, 1)
uart.on("data")
end
end)
這個例子有個問題,得滿8個字符才會產(chǎn)生回調(diào)浩嫌。其實檐迟,可以不用設(shè)置數(shù)量或者采用ascii格式傳輸,然后用"\n"來觸發(fā)回調(diào)码耐。下面是一個不設(shè)置數(shù)量的例子追迟,直接透傳數(shù)據(jù)。
gpio.mode(1, gpio.INPUT, gpio.PULLUP)
cnt = 0
tmr.alarm(0, 10000, tmr.ALARM_SINGLE, function()
if(gpio.read(1) == 0) then
uart.setup(0, 38400, 8, uart.PARITY_NONE, uart.STOPBITS_1, 0)
print("38400 8-n-1")
uart.on("data", function(data)
cnt = cnt + 1
tmr.stop(1)
tmr.interval(1, 1)
tmr.start(1)
uart.write(0, data)
end, 0)
else
uart.setup(0, 115200, 8, uart.PARITY_NONE, uart.STOPBITS_1, 1)
print("115200 8-n-1")
uart.on("data")
end
end)
tmr.register(1, 1, tmr.ALARM_SEMI, function()
print("\n")
print(cnt)
print("\n")
end)
這里加多個定時器來打印回調(diào)次數(shù)計數(shù)值骚腥,可以看到并不是每個字符都產(chǎn)生回調(diào)敦间。所以,不必太擔(dān)心頻繁回調(diào)產(chǎn)生的性能問題束铭。如果廓块,我們把WiFi也加進來,那就可以變成WiFi轉(zhuǎn)串口的透傳模塊了契沫。如果想知道串口接收到多少字節(jié),可以使用#data或者用string.len(data)
uart.on("data", function(data) print(#data) end, 0)
uart.on("data", function(data) print(string.len(data)) end, 0)
一點問題
以下這段代碼和上面的例子基本沒什么區(qū)別带猴,不過會讓nodeMCU重啟。如果你把它保存為init.lua懈万,然后傳送到MCU拴清。那么,你會看到MCU反復(fù)重啟钞速。所以贷掖,建議在init.lua中加個延時。
??我也沒搞懂這個代碼會讓機器重啟渴语,bug在哪兒呢苹威?
gpio.mode(1, gpio.INPUT, gpio.PULLUP)
gpio.mode(0, gpio.OUTPUT)
function echoUart(data)
uart.write(0, "rec: ", data)
end
tmr.alarm(0, 10000, tmr.ALARM_SINGLE, function()
gpio.write(0, gpio.LOW)
if(gpio.read(1) == 0) then
print("38400 8-n-1")
uart.setup(0, 38400, 8, uart.PARITY_NONE, uart.STOPBITS_1, 0)
uart.on("data", 8, echoUart(data), 0)
else
print("115200 8-n-1")
uart.setup(0, 115200, 8, uart.PARITY_NONE, uart.STOPBITS_1, 1)
uart.on("data")
end
end)
簡書評論不能貼圖, 如有需要可以到我的GitHub上提issues