2016-08-23 3 views
1

私は現在NodeMCUファームウェアのためにLUAで室内空気質センサー(CO2および粒子状物質)のドライバを書いています。uart.on( "データ"、... withougを発射ない " rを n" は(0x0Dを0x0Aを)

センサはUARTピンGPIO13/15を介して接続されています。測定コマンドを発行すると、ESPはuart.alt(1)を切り替え、uart.on( "data"、9、...)関数を登録します9つのバイトが受信された後、焼成のために。私はネイティブと代替UARTピンに接続された2つのch340でこれをテストしている。私は手動でデータを入力しての\ r \ n(0 D 0A)を追加した場合の値の 読みで結構です。

私の使用しているセンサーは、返信の最後に\ r \ nを持っていません - h 9バイトを受け取った後にUARTバッファを読み出すコードを変更することはできますか?

function MHZ19:measure(callback) 
-- timeout and restore UART 
tmr.alarm(self.timer, self.timeout*1000, 0, 
function() 
    uart.alt(0) 
    uart.setup(0, 115200, 8, uart.PARITY_NONE, uart.STOPBITS_1, 1) 
    uart.on('data') 
    print("Timed out. Restored UART.") 
    callback(nil) 
end) 

uart.on('data', 9, 
    function(data) 
     -- unregister uart.on callback 
     uart.on('data') 
     tmr.stop(self.timer) 
     uart.alt(0) 
     uart.setup(0, 115200, 8, uart.PARITY_NONE, uart.STOPBITS_1, 1) 
     -- First two bytes are control bytes 0xFF && 0x86 
     local a,b = string.byte(data,1,2) 
     if (a==tonumber('FF',16)) and (b==tonumber('86',16)) then 
      local high,low = string.byte(data,3,4) 
      local co2value = high * 256 + low 
      callback(co2value) 
     else 
      callback(nil) 
     end 
    end) 

    uart.alt(self.altUart) 
    uart.setup(0, 9600, 8, uart.PARITY_NONE, uart.STOPBITS_1, 0) 

    -- Send request sequence to get value (refer to datasheet) 
    -- send: FF 01 86 00 00 00 00 00 79 
    -- receive: FF 86 02 E8 42 04 2B 1C 03 
    uart.write(0, 0xff, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79) 

答えて

1

uart.on()コマンドは、オプションのパラメータ[run_input]を受け付けるNodeMCU Documentation 1として。 このパラメータを1に設定すると、インタープリタは '\ r'または '\ n'を待ってコマンドを実行します。 このパラメータを0に設定し、受信するバイト数を設定すると、指定されたバイト数の取得時にコールバック関数が呼び出されます。

これは私の問題を解決しました。

+0

こんにちは、使用例を教えてください。ありがとう – Vlad

+0

こんにちはVlad、確かに - 上記の機能は、UARTを介してCO2センサーにコマンドを書き込んだ後、センサーからの応答を待つために使用されます。 uart.on(この場合は '...'の後の '0'、 'uart.on(' data '、9、function(data)print(data)end、0) ' – ameeuw

+0

私はそれがすぐに機能の前にモジュールの導入、すなわち 'ローカルMHZ19 = {タイマー= 1、タイムアウト= 1、altUart = 0}'でなければならないのですか?使用法は 'MHZ19 = require(" MHZ19 ")?ですか、どのnodemcu devあなたはtr/rxにアタッチしましたか?ありがとう! – Vlad

関連する問題