5段审、nodeMCU學(xué)習(xí)筆記--uart(附透傳例子)

閑言碎語

這回來了解一下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
  1. .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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市驾凶,隨后出現(xiàn)的幾起案子牙甫,更是在濱河造成了極大的恐慌,老刑警劉巖调违,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窟哺,死亡現(xiàn)場離奇詭異,居然都是意外死亡技肩,警方通過查閱死者的電腦和手機且轨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人旋奢,你說我怎么就攤上這事泳挥。” “怎么了至朗?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵屉符,是天一觀的道長。 經(jīng)常有香客問我锹引,道長矗钟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任嫌变,我火速辦了婚禮吨艇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘初澎。我一直安慰自己秸应,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布碑宴。 她就那樣靜靜地躺著软啼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪延柠。 梳的紋絲不亂的頭發(fā)上祸挪,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音贞间,去河邊找鬼贿条。 笑死,一個胖子當(dāng)著我的面吹牛增热,可吹牛的內(nèi)容都是我干的整以。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼峻仇,長吁一口氣:“原來是場噩夢啊……” “哼公黑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起摄咆,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤凡蚜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后吭从,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體朝蜘,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年涩金,在試婚紗的時候發(fā)現(xiàn)自己被綠了谱醇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片暇仲。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖枣抱,靈堂內(nèi)的尸體忽然破棺而出熔吗,到底是詐尸還是另有隱情,我是刑警寧澤佳晶,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站讼载,受9級特大地震影響轿秧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜咨堤,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一菇篡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧一喘,春花似錦驱还、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至萎战,卻和暖如春咐容,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蚂维。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工戳粒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人虫啥。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓蔚约,卻偏偏與公主長得像,于是被迫代替她去往敵國和親涂籽。 傳聞我的和親對象是個殘疾皇子苹祟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容