im从modbusTCP服务器提取数据,但当我收到负值时,它显示为一个大数字。
self.export = self.c.read_holding_registers(37113, 2)[1]
我知道这与它的签名或未签名有关,但我真的很难解决它
print("export: " + "{:02f}W".format(self.inverter.export))
print("exportBytes: " + "{:16b}W".format(self.inverter.export))
print("export: " + "{:02f}W".format(self.inverter.export))
print("export 1: " + "{:16b}W".format(1))
print("export-1: " + "{:16b}W".format(-1))
打印
export: 59142.000000kW
exportBytes: 1110011100000110kW
export: 59142.000000kW
export 1: 1kW
export-1: -1kW
有什么猜测吗?
接收到的字节被隐式转换为无符号整数。
要转换为带符号的int,我们
- 使用Int.to_bytes((获取字节和
- 使用int.from_bytes((获取签名int
varBytes = theInteger.to_bytes(2, 'big') # getting raw bytes
signedInt = int.from_bytes(varBytes , byteorder='big', signed = True) # getting signet int vale
作为无符号复制到int。";int";接收到的由python隐式转换为int。
Mads的解决方案我认为会奏效,但这可能更能说明正在发生的事情:
def int16_decode(uint16_val):
if uint16_val > 0x8000:
uint16_val -= 0x10000
return uint16_val
这就是有符号int在内存中的存储方式。int16与uint16类似,不同之处在于保留最高有效位作为符号位。所以,若你们读一个负的int16作为uint16,它将非常大,因为16的最高有效位是1。