记录一个luat使用全局变量的坑,全局变量指针被局部重置

这是全局变量被定义的位置
main.lua

--自定义的全局变量
UartRecvQueue = {}

这是全局变量被使用的位置
uart.lua

--串口接收数据帧并把数据帧插入到接收队列中
uart.on(UART_ID, "receive", function(uid, length)
    recvStr = recvStr .. uart.read(uid, length)
    if string.sub(recvStr, #recvStr, #recvStr) == string.char(0x0D) then
        table.insert(UartRecvQueue, recvStr)
        recvStr = ""
        sys.timerStart(sys.publish, 20, "UART_RECV_OK")--设置接收超时
    else
        log.info("错误帧")--并未被删除,等待与下一次进来的帧连接起来,再去检验停止符
    end
end)

tcp.lua

--取走串口接收的数据帧并清空串口接收队列
sys.subscribe("UART_RECV_OK", function()
    local str = table.concat(UartRecvQueue)
    UartRecvQueue = {}
    table.insert(tcpBagStrTable, str)
    sys.publish("TCP_RECV_OK")
--log.info("uart", #str)
end)

以上代码,只有在程序每次开机运行时第一次才能正确从串口接收队列取得数据,之后取得的结果都是空,然而经检测发现每次串口都是有数据读进来的,在uart.lua中输出UartRecvQueue的值都是正常的,只有在tcp.lua中UartRecvQueue的值是空的。

经过思考,我认为原因在于tcp.lua中的UartRecvQueue = {}这条代码把tcp.lua中的全局变量UartRecvQueue指针重置了,相当于在tcp.lua中又重新定义了一个UartRecvQueue全局变量,tcp.lua中的代码只使用在自己文件里定义的UartRecvQueue,而uart.lua仍然使用main.lua中定义的UartRecvQueue,所以导致了之前的现象。

要解决这个问题,修改清空UartRecvQueue的实现代码就可以了

sys.subscribe("UART_RECV_OK", function()
    local str = table.concat(UartRecvQueue)
    while #UartRecvQueue > 0 do
        table.remove(UartRecvQueue)
    end
    table.insert(tcpBagStrTable, str)
    sys.publish("TCP_RECV_OK")
--log.info("uart", #str)
end)

版权声明:本文为qq_30658583原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。