TCP/IP连接称重秤数据对比报错“数字与字符串比较”求助
问题解决:Lua中字符串与数字对比错误修复
问题根源
你遇到的「Attempt to compare Number with String」错误,本质是**Actual_Weight变量的类型被意外篡改**:
- 初始时你将它设为数字
0,但后续循环中用字符串拼接操作..把提取的重量字符拼接到它上面,导致它变成了字符串类型 - 后续用这个字符串和数字
280做大小对比,Lua会直接抛出类型不匹配的错误
修复方案
1. 修正变量初始化与字符串提取
把Actual_Weight初始化为空字符串,避免拼接时的类型冲突;提取完重量字符串后,用tonumber()转换为数字类型:
修改后的global.lua代码:
Pre_Data = '' Post_Data = '' Weight = '' -- 改为字符串,避免和后续拼接冲突 Data_Char = 0 Actual_Weight = '' -- 初始化为空字符串 WEIGHT_WEIGHT_WEIGHT = 0 function Get_Weight() resultOpen1,socket1 = TCPCreate(false, '192.168.1.10', 1001) if resultOpen1 == 0 then print("Create TCP Client Success!") else print("Create TCP Client failed, code:", resultOpen1) end resultOpen1 = TCPStart(socket1, 0) if resultOpen1 == 0 then print("Connect TCP Server Success!") else print("Connect TCP Server failed, code:", resultOpen1) end print(resultOpen1) resultWrite1 = TCPWrite(socket1, '%01R$$') resultRead1,Pre_Data = TCPRead(socket1, 0, 'string') Pre_Data = Pre_Data.buf resultRead1,Post_Data = TCPRead(socket1, 0, 'string') Post_Data = Post_Data.buf Weight = Pre_Data..Post_Data print(Weight) -- 简化字符串提取:直接截取第7到第11位,无需循环拼接 Actual_Weight = string.sub(Weight, 7, 11) -- 转换为数字类型 Actual_Weight = tonumber(Actual_Weight) print(Actual_Weight) -- 释放TCP连接资源,避免泄漏 TCPStop(socket1) TCPClose(socket1) end
2. 确保对比逻辑的类型一致性
后续的对比代码无需修改,现在WEIGHT_WEIGHT_WEIGHT会是数字类型,和280对比不会报错:
Get_Weight() WEIGHT_WEIGHT_WEIGHT = Actual_Weight Sync() if WEIGHT_WEIGHT_WEIGHT > 280 then MovJ(P1) else MovJ(P2) end
额外优化建议
- 字符串提取直接用
string.sub(Weight,7,11)完成,无需循环拼接,代码更简洁高效 - 每次TCP请求完成后,调用
TCPStop和TCPClose释放连接资源,避免长期运行后出现连接耗尽问题 - 可增加类型检查逻辑,比如判断
tonumber(Actual_Weight)是否为nil,避免提取到无效字符时导致后续逻辑出错
内容的提问来源于stack exchange,提问作者Sniper
相关产品推荐
相关产品推荐

