uart.on("数据",......没有激发" \ r \ n"(0x0d 0x0a)

时间:2016-08-23 07:57:23

标签: lua esp8266 nodemcu

我目前正在编写用于NodeUU固件的室内空气质量传感器(二氧化碳和颗粒物质)的驱动程序。

传感器通过备用UART引脚GPIO13 / 15连接。在发出测量命令时,ESP切换uart.alt(1)并在接收到9个字​​节后注册uart.on(" data",9,...)函数进行触发。我用两个连接到本机和备用UART引脚的ch340进行了测试。 如果我手动输入数据并添加\ r \ n(0d 0a),则可以读取值。

但是我的传感器在回复结束时没有\ r \ n - 如何在收到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 个答案:

答案 0 :(得分:1)

根据NodeMCU Documentationuart.on()命令接受可选参数[run_input]。 如果此参数设置为1,则口译员将等待' \ r'或者' \ n'然后运行该命令。 将此参数设置为0并设置要接收的字节数,在检索指定的字节数时调用回调函数。

这解决了我的问题。