Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

回调报错: System.NullReferenceException: 未将对象引用设置到对象的实例。 在 llcom.LuaEnv.LuaRunEnv.runTigger() #165

Closed
2 tasks done
psuxaog opened this issue May 14, 2024 · 13 comments
Labels
bug Something isn't working 请求帮助 Extra attention is needed

Comments

@psuxaog
Copy link

psuxaog commented May 14, 2024

描述一下这个bug / Describe the bug

我在以9600波特率接收非字符串数据”FD 0F 00 00 00 00 00 00 25 FB 00 10 00 00 00 00 06 30 FE“时会时不时报出以下错误
[20:34:08:9734]回调报错:
System.NullReferenceException: 未将对象引用设置到对象的实例。
在 llcom.LuaEnv.LuaRunEnv.runTigger()
以下是我的LUA代码,当只有uartReceive=function(data) end时也有该问题

uartReceive = function (data)  
	
    --log.info("收到的数据转成HEX是:",data:toHex()) --打印接收的数据的HEX字符串到lua环境  
    local sum = 0    
    for i = 3, 17 do    
        sum = sum + data:byte(i)  
    end    
    sum = sum & 0xFF - 1
    --log.info(string.format("sum:%d, checksum:%d",sum,data:byte(17)))
    if sum == data:byte(18) then    
    	local current,motorVoltage,speed,batVoltage,chargVoltage,chargCurrent,duty  
    	current = data:byte(3)*256+data:byte(4)  
    	motorVoltage = data:byte(5)*256+data:byte(6)  
    	speed = data:byte(7)*256+data:byte(8)  
    	batVoltage = data:byte(9)*256+data:byte(10)  
    	chargVoltage=data:byte(11)*256+data:byte(12)  
    	chargCurrent=data:byte(13)*256+data:byte(14)  
    	errCode=data:byte(17)
    	duty=data:byte(15)  
        -- 打印所有的变量  
        log.info(string.format("电流:%d mA, 电机电压:%d mV, 速度:%d RPM, 电池电压:%d mV, 充电电压:%d mV, 充电电流:%d mA, 占空比:%d, 错误码:%d", current, motorVoltage, speed, batVoltage, chargVoltage, chargCurrent, duty,errCode))    
        --log.info("aa")
    end    
end  

复现步骤 / To Reproduce

接收我描述的二进制数据

预期的行为 / Expected behavior

应该能被正确解析

截图 / Screenshots

image

日志 / Logs

[20:37:37:4981][I]-[电流:366 mA, 电机电压:5514 mV, 速度:0 RPM, 电池电压:8806 mV, 充电电压:40 mV, 充电电流:24 mA, 占空比:61, 错误码:0]
[20:37:37:7984][I]-[电流:396 mA, 电机电压:5532 mV, 速度:0 RPM, 电池电压:8709 mV, 充电电压:40 mV, 充电电流:0 mA, 占空比:62, 错误码:0]
[20:37:37:8983]回调报错:
System.NullReferenceException: 未将对象引用设置到对象的实例。
在 llcom.LuaEnv.LuaRunEnv.runTigger()
[20:37:37:9982][I]-[电流:335 mA, 电机电压:5477 mV, 速度:0 RPM, 电池电压:9279 mV, 充电电压:32 mV, 充电电流:0 mA, 占空比:57, 错误码:0]
[20:37:38:3981][I]-[电流:396 mA, 电机电压:5502 mV, 速度:0 RPM, 电池电压:9583 mV, 充电电压:40 mV, 充电电流:0 mA, 占空比:56, 错误码:0]
[20:37:38:6981][I]-[电流:396 mA, 电机电压:5520 mV, 速度:0 RPM, 电池电压:9605 mV, 充电电压:40 mV, 充电电流:24 mA, 占空比:56, 错误码:0]
[20:37:38:7990][I]-[电流:366 mA, 电机电压:5520 mV, 速度:0 RPM, 电池电压:9620 mV, 充电电压:40 mV, 充电电流:0 mA, 占空比:55, 错误码:0]
[20:37:38:8977][I]-[电流:396 mA, 电机电压:5520 mV, 速度:0 RPM, 电池电压:9605 mV, 充电电压:40 mV, 充电电流:0 mA, 占空比:56, 错误码:0]
[20:37:38:9976][I]-[电流:396 mA, 电机电压:5532 mV, 速度:0 RPM, 电池电压:9612 mV, 充电电压:40 mV, 充电电流:0 mA, 占空比:55, 错误码:0]
[20:37:39:2976][I]-[电流:335 mA, 电机电压:5416 mV, 速度:0 RPM, 电池电压:9612 mV, 充电电压:40 mV, 充电电流:0 mA, 占空比:56, 错误码:0]
[20:37:39:3964][I]-[电流:0 mA, 电机电压:4050 mV, 速度:0 RPM, 电池电压:9634 mV, 充电电压:32 mV, 充电电流:0 mA, 占空比:0, 错误码:0]
[20:37:39:4954]回调报错:
System.NullReferenceException: 未将对象引用设置到对象的实例。
在 llcom.LuaEnv.LuaRunEnv.runTigger()

系统 / System

Win10企业版

软件版本 / Version

1.1.3.3

验证

  • 检查该问题是否已被提过 / Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
  • 提供了最小可复现工程或详细的复现步骤,确保开发者可以复现 / The provided reproduction is a minimal reproducible example of the bug.
@S4FR
Copy link

S4FR commented May 24, 2024

遇到了相同的问题。我好像不少脚本都会遇到,就是时间一长就会有,我有一个查询的很快的脚本,就会遇到的非常频繁。

报错如下:

[15:29:32:3125][I]-[sys] core loaded!
[15:29:33:8118]回调报错:
System.NullReferenceException: 未将对象引用设置到对象的实例。
在 llcom.LuaEnv.LuaRunEnv.runTigger()
[15:29:40:7615]回调报错:
System.NullReferenceException: 未将对象引用设置到对象的实例。
在 llcom.LuaEnv.LuaRunEnv.runTigger()
[15:29:43:5231]回调报错:
System.NullReferenceException: 未将对象引用设置到对象的实例。
在 llcom.LuaEnv.LuaRunEnv.runTigger()
[15:29:58:1494]回调报错:
System.NullReferenceException: 未将对象引用设置到对象的实例。
在 llcom.LuaEnv.LuaRunEnv.runTigger()
[15:30:01:7588]回调报错:
System.NullReferenceException: 未将对象引用设置到对象的实例。
在 llcom.LuaEnv.LuaRunEnv.runTigger()
[15:30:02:9473]回调报错:
System.NullReferenceException: 未将对象引用设置到对象的实例。
在 llcom.LuaEnv.LuaRunEnv.runTigger()
[15:30:13:9054]回调报错:
System.NullReferenceException: 未将对象引用设置到对象的实例。
在 llcom.LuaEnv.LuaRunEnv.runTigger()
[15:30:22:5202]回调报错:
System.NullReferenceException: 未将对象引用设置到对象的实例。
在 llcom.LuaEnv.LuaRunEnv.runTigger()

我的LUA脚本如下:

local captureArray = {
    "\x60\x40", -- 帧头,例如55和A7
}

-- 注册串口接收函数
apiSetCb("uart", function (data)
    sys.publish("UART", data) -- 发布消息
end)

-- 将字符串转换为十六进制表示
local function toHex(str)
    return (str:gsub('.', function (c)
        return string.format('%02X ', string.byte(c))
    end))
end

-- 获取当前时间戳
local function getTime()
    return os.date("%Y-%m-%d %H:%M:%S")
end

-- 新建任务,等待接收到消息再继续运行
sys.taskInit(function()
    while true do
        -- 等待消息,超时1000ms
        local _, data = sys.waitUntil("UART", 1000)
        if data then
            local timestamp = getTime()
            local hexData = toHex(data)

            -- 遍历捕捉数组
            for _, captureStr in ipairs(captureArray) do
                -- 在接收到的数据中查找完全匹配的字符串
                local matchPos = data:find(captureStr, 1, true)
                if matchPos then
                    local capturedData = data:sub(matchPos, matchPos + #captureStr - 1)
                    print("Timestamp:", timestamp)
                    print("Matched data (hex):", toHex(capturedData))
                    print("Matched at position:", matchPos)
                    print("Complete frame (hex):", hexData)
                end
            end
        else
            -- 超时处理
           -- print("No data received within 1000ms")
        end
    end
end)

@S4FR
Copy link

S4FR commented May 27, 2024

遇到了相同的问题。我好像不少脚本都会遇到,就是时间一长就会有,我有一个查询的很快的脚本,就会遇到的非常频繁。

报错如下:

[15:29:32:3125][I]-[sys] core loaded! [15:29:33:8118]回调报错: System.NullReferenceException: 未将对象引用设置到对象的实例。 在 llcom.LuaEnv.LuaRunEnv.runTigger() [15:29:40:7615]回调报错: System.NullReferenceException: 未将对象引用设置到对象的实例。 在 llcom.LuaEnv.LuaRunEnv.runTigger() [15:29:43:5231]回调报错: System.NullReferenceException: 未将对象引用设置到对象的实例。 在 llcom.LuaEnv.LuaRunEnv.runTigger() [15:29:58:1494]回调报错: System.NullReferenceException: 未将对象引用设置到对象的实例。 在 llcom.LuaEnv.LuaRunEnv.runTigger() [15:30:01:7588]回调报错: System.NullReferenceException: 未将对象引用设置到对象的实例。 在 llcom.LuaEnv.LuaRunEnv.runTigger() [15:30:02:9473]回调报错: System.NullReferenceException: 未将对象引用设置到对象的实例。 在 llcom.LuaEnv.LuaRunEnv.runTigger() [15:30:13:9054]回调报错: System.NullReferenceException: 未将对象引用设置到对象的实例。 在 llcom.LuaEnv.LuaRunEnv.runTigger() [15:30:22:5202]回调报错: System.NullReferenceException: 未将对象引用设置到对象的实例。 在 llcom.LuaEnv.LuaRunEnv.runTigger()

我的LUA脚本如下:

local captureArray = { "\x60\x40", -- 帧头,例如55和A7 }

-- 注册串口接收函数 apiSetCb("uart", function (data) sys.publish("UART", data) -- 发布消息 end)

-- 将字符串转换为十六进制表示 local function toHex(str) return (str:gsub('.', function (c) return string.format('%02X ', string.byte(c)) end)) end

-- 获取当前时间戳 local function getTime() return os.date("%Y-%m-%d %H:%M:%S") end

-- 新建任务,等待接收到消息再继续运行 sys.taskInit(function() while true do -- 等待消息,超时1000ms local _, data = sys.waitUntil("UART", 1000) if data then local timestamp = getTime() local hexData = toHex(data)

        -- 遍历捕捉数组
        for _, captureStr in ipairs(captureArray) do
            -- 在接收到的数据中查找完全匹配的字符串
            local matchPos = data:find(captureStr, 1, true)
            if matchPos then
                local capturedData = data:sub(matchPos, matchPos + #captureStr - 1)
                print("Timestamp:", timestamp)
                print("Matched data (hex):", toHex(capturedData))
                print("Matched at position:", matchPos)
                print("Complete frame (hex):", hexData)
            end
        end
    else
        -- 超时处理
       -- print("No data received within 1000ms")
    end
end

end)

遇到了相同的问题。我好像不少脚本都会遇到,就是时间一长就会有,我有一个查询的很快的脚本,就会遇到的非常频繁。

报错如下:

[15:29:32:3125][I]-[sys] core loaded! [15:29:33:8118]回调报错: System.NullReferenceException: 未将对象引用设置到对象的实例。 在 llcom.LuaEnv.LuaRunEnv.runTigger() [15:29:40:7615]回调报错: System.NullReferenceException: 未将对象引用设置到对象的实例。 在 llcom.LuaEnv.LuaRunEnv.runTigger() [15:29:43:5231]回调报错: System.NullReferenceException: 未将对象引用设置到对象的实例。 在 llcom.LuaEnv.LuaRunEnv.runTigger() [15:29:58:1494]回调报错: System.NullReferenceException: 未将对象引用设置到对象的实例。 在 llcom.LuaEnv.LuaRunEnv.runTigger() [15:30:01:7588]回调报错: System.NullReferenceException: 未将对象引用设置到对象的实例。 在 llcom.LuaEnv.LuaRunEnv.runTigger() [15:30:02:9473]回调报错: System.NullReferenceException: 未将对象引用设置到对象的实例。 在 llcom.LuaEnv.LuaRunEnv.runTigger() [15:30:13:9054]回调报错: System.NullReferenceException: 未将对象引用设置到对象的实例。 在 llcom.LuaEnv.LuaRunEnv.runTigger() [15:30:22:5202]回调报错: System.NullReferenceException: 未将对象引用设置到对象的实例。 在 llcom.LuaEnv.LuaRunEnv.runTigger()

我的LUA脚本如下:

local captureArray = { "\x60\x40", -- 帧头,例如55和A7 }

-- 注册串口接收函数 apiSetCb("uart", function (data) sys.publish("UART", data) -- 发布消息 end)

-- 将字符串转换为十六进制表示 local function toHex(str) return (str:gsub('.', function (c) return string.format('%02X ', string.byte(c)) end)) end

-- 获取当前时间戳 local function getTime() return os.date("%Y-%m-%d %H:%M:%S") end

-- 新建任务,等待接收到消息再继续运行 sys.taskInit(function() while true do -- 等待消息,超时1000ms local _, data = sys.waitUntil("UART", 1000) if data then local timestamp = getTime() local hexData = toHex(data)

        -- 遍历捕捉数组
        for _, captureStr in ipairs(captureArray) do
            -- 在接收到的数据中查找完全匹配的字符串
            local matchPos = data:find(captureStr, 1, true)
            if matchPos then
                local capturedData = data:sub(matchPos, matchPos + #captureStr - 1)
                print("Timestamp:", timestamp)
                print("Matched data (hex):", toHex(capturedData))
                print("Matched at position:", matchPos)
                print("Complete frame (hex):", hexData)
            end
        end
    else
        -- 超时处理
       -- print("No data received within 1000ms")
    end
end

end)

版本也是1.1.3.3

@S4FR
Copy link

S4FR commented May 31, 2024

可能是多线程竞争问题。只勾选一个处理器的话就不会报错了。
image
image

@chenxuuu
Copy link
Owner

chenxuuu commented Jun 1, 2024

xlua的bug,暂时没法修,很难搞

限制在某个特定cpu核心执行的话,感觉会影响程序性能?

@chenxuuu
Copy link
Owner

chenxuuu commented Jun 2, 2024

虽然不知道原因,但是可以试试看,看看我小改的这份还会不会出现这种问题?
llcom.zip

@chenxuuu chenxuuu added the bug Something isn't working label Jun 2, 2024
@S4FR
Copy link

S4FR commented Jun 4, 2024

可以去xlua那边提个issue🤣

@chenxuuu
Copy link
Owner

chenxuuu commented Jun 4, 2024 via email

@S4FR
Copy link

S4FR commented Jun 5, 2024

感谢大大抽空帮助!新编译的程序还是会出现这个bug,但是貌似频率变低了?没有仔细测试出现的概率。
复现的关键在于串口接收,
我测的时候如果串口从来不收东西是暂时没观察到这个问题出现的。有数据回送时候,比如把串口工具的TX接到RX上发啥收啥,就会容易复现这个问题。另外,限制CPU单个核心运行其实也会报这个错,但是概率会大大降低,我挂了一天出了几次,如果全部核心运行可能会十几秒出一次。

@chenxuuu
Copy link
Owner

chenxuuu commented Jun 5, 2024

还是等2.0版本吧,llcom-next会换用nlua,xlua这个问题已经很久了

@chenxuuu
Copy link
Owner

这bug快两年了,一直没有找到原因,基本只能把锅给到xlua了
但是单独写个demo又不能复现,反正就是很神奇

@chenxuuu chenxuuu added the 请求帮助 Extra attention is needed label Jun 13, 2024
@chenxuuu
Copy link
Owner

llcom.zip

试试这个还会出现报错吗

@chenxuuu
Copy link
Owner

llcom.zip
然后这是另一个方案

目前我这里复现不了,各位可以帮忙测试下,看看这两个版本的效果是什么样的

chenxuuu added a commit that referenced this issue Jun 25, 2024
@chenxuuu
Copy link
Owner

llcom.zip

我觉得这样改应该就不会有问题了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working 请求帮助 Extra attention is needed
Projects
None yet
Development

No branches or pull requests

3 participants