依赖文件
pymodbus==3.6.3
pyserial==3.5
import binascii
import math
import time
import serial
from pymodbus.client import ModbusSerialClient as ModbusClient
import struct
# # 设备串口配置
# port = '/dev/cu.usbserial-1130' # 根据实际情况修改为实际串口号
# baudrate = 9600
# parity = 'N'
# stopbits = 1
# bytesize = 8
# # 创建串口连接
# ser = serial.Serial(port, baudrate, parity=parity, stopbits=stopbits, bytesize=bytesize)
# # 创建Modbus客户端
# print("Modbus RTU Client Connected")
# client = ModbusClient(port=ser,baudrate=9600)
# print(client)
# # 假设从地址1开始写入固件数据,每个寄存器存储两个字节
# if client.connect():
# print("Modbus RTU Client Connected")
# else:
# print("Failed to connect to Modbus RTU Client")
# firmware_file_path = 'firmware.bin'
# with open(firmware_file_path, 'rb') as f:
# firmware_data = f.read()
# # 模拟将固件数据按每两个字节分组并写入Modbus寄存器
# register_address = 0x0001 # 起始寄存器地址
# for i in range(0, len(firmware_data), 2):
# if i + 1 < len(firmware_data): # 确保不超出范围
# register_value = struct.unpack('>H', firmware_data[i:i+2])[0] # 大端模式读取两个字节
# client.write_register(register_address, register_value)
# register_address += 1
# # 可能需要根据设备响应速度调整延时
# time.sleep(0.1)
# # 关闭Modbus客户端和串口连接
# client.close()
# ser.close()
# print("Firmware data sent via Modbus.")
# # 在这里添加向设备发送固件更新结束命令的逻辑,具体命令取决于设备实现
from pymodbus.client import ModbusSerialClient
from pymodbus.exceptions import ModbusException, ConnectionException
import logging
import hashlib
# 配置日志记录
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)
client = ModbusSerialClient(port='/dev/cu.usbserial-B001VTZP', baudrate=57600,
stopbits=1, bytesize=8, parity='N',slaveaddress=1) # 看文档,method='rtu'貌似没用
firmware_file_path = 'N00.bin'
def read_temperature_and_humidity(client):
try:
# 计算md5 数值是多少
# 计算分为多少包
# 发送查询modbus版本
# 发送OTA md5 文件
# 读取现在的版本信息
response = client.read_holding_registers(address=100, count=8, slave=1)
if not response.isError():
print("Register Values: ", response.registers)
else:
print