无法通过Python通过485读取Modbus寄存器

3

传感器采用Modbus协议,通过R485接口。我想发送请求x00并读取其返回值。x00代表读取温度。

传感器期望的十六进制格式为:x00。

import serial           # import the module
ComPort = serial.Serial('COM4') # open COM4

ComPort.baudrate = 9600 # set Baud rate to 9600
ComPort.bytesize = 8    # Number of data bits = 8
ComPort.parity   = 'N'  # No parity
ComPort.stopbits = 1    # Number of Stop bits = 1


ComPort.write.encode(hex(00))
ComPort.read()
print(ComPort.read())

ComPort.close()         # Close the Com port

这是我的错误:

line 13, in <module>
    ComPort.write.encode(hex(00))

AttributeError: 'function' object has no attribute 'encode'


2
.read() 接受一个整数作为参数。https://pyserial.readthedocs.io/en/latest/pyserial_api.html#serial.Serial.read - tehCheat
1
你的代码一点意义都没有。如果你的传感器确实支持Modbus,那么发送这个全是零的字节流也没有任何意义。首先,确定你的传感器是否支持Modbus或专有串行协议。如果是Modbus,那么你可以尝试使用pyModbus,这应该会让你的生活变得更容易。当然,你也可以像你正在尝试的那样将Modbus帧作为原始串行数据发送,但首先,你需要组合正确的Modbus请求。你可以尝试类似于这个的东西。 - Marcos G.
你漏掉了 write 调用的右括号。这就是语法错误。对其余部分不做评论。 - Gene
首先,你应该执行 ComPort.write(b'\x00),参见这里。其次,你需要使用ComPort = serial.Serial('COM4', timeout=5)来增加默认超时时间或在写入和读取之间引入短暂的延迟time.sleep(),以便设备有一些时间来处理和发送其响应。我再说一遍:如果你的设备期望Modbus,那么发送单个字节是行不通的。 - Marcos G.
1
请不要在修复问题时更新问题并提出不同的问题,最终导致问题没有错误。SO的目的不是为您提供免费的调试,而是记录开发人员过去遇到的问题,以便将来遇到相同问题的读者可以找到解决方案。因此,当您找到解决方案时,请保留问题并将解决方案作为答案发布在该问题下(除非已经有该解决方案的答案,在这种情况下您无需做任何事情)。 - zvone
显示剩余4条评论
1个回答

1
我做错的事情是没有遵循Modbus协议。Modbus要求所有段都如此显示。
command = (b'\x01\x03\x00\x00\x00\x02\xC4\x0B')
#command = x01 address x03 function code x0000 starting address x0001
#data length xC40B is CRC(check code)

一个友好的链接到一个CRC计算器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接