uart.on("data", ... 无法在没有 "\r\n" (0x0d 0x0a) 的情况下触发

我目前正在为 NodeMCU 固件的 lua 中室内空气质量传感器(CO2 和颗粒物)编写驱动程序。

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

但是我的传感器没有在其回复的末尾使用\r\n - 我该如何更改代码以在接收到 9 个字节后读取 UART 缓冲区?

function MHZ19:measure(callback)
-- 超时并恢复 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("超时。恢复 UART。")
    callback(nil)
end)

uart.on('data', 9,
    function(data)
        -- 取消注册 uart.on 回调
        uart.on('data')
        tmr.stop(self.timer)
        uart.alt(0)
        uart.setup(0, 115200, 8, uart.PARITY_NONE, uart.STOPBITS_1, 1)
        -- 前两个字节是控制字节 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)

    -- 发送请求序列以获取值(请参阅数据表)
    -- 发送:FF 01 86 00 00 00 00 00 79
    -- 接收:FF 86 02 E8 42 04 2B 1C 03
    uart.write(0, 0xff, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79)

end

点赞
用户6593252
用户6593252

根据NodeMCU文档uart.on()命令接受可选参数[run_input]。 如果设置这个参数为1,则解释器将等待'\r'或'\n',然后运行命令。 将此参数设置为0,并设置要接收的字节数,即可在检索到指定数量的字节时调用回调函数。

这解决了我的问题。

2016-08-29 13:12:21