agrobot_base/Python/oidlec/test.py

53 lines
1.5 KiB
Python

import serial
import struct
import time
def calcula_crc(data):
"""Calcula o CRC16-Modbus"""
crc = 0xFFFF
for byte in data:
crc ^= byte
for _ in range(8):
if crc & 0x0001:
crc = (crc >> 1) ^ 0xA001
else:
crc >>= 1
return struct.pack('<H', crc)
def enviar_comando(ser, endereco, funcao, endereco_reg, quantidade):
"""Envia um comando Modbus RTU e lê a resposta"""
comando = struct.pack('>BBHH', endereco, funcao, endereco_reg, quantidade)
comando += calcula_crc(comando)
ser.write(comando)
time.sleep(0.1) # Aguarda resposta
resposta = ser.read(7 + 2 * quantidade) # Espera pelo menos 7 bytes + dados
return resposta
# Configurar porta serial
porta_serial = "COM112" # Substitua pelo nome correto da porta (ex: COM3 no Windows ou /dev/ttyUSB0 no Linux)
baudrate = 115200
ser = serial.Serial(porta_serial, baudrate=baudrate, bytesize=8, parity='N', stopbits=1, timeout=1)
# Endereço do driver (geralmente 1)
endereco_dispositivo = 1
# Código de função Modbus RTU (0x03 = Ler registradores)
codigo_funcao = 0x03
# Registrador de velocidade do motor (exemplo: 0x0001)
endereco_registrador = 0x0001
# Quantidade de registradores a ler (exemplo: 2)
quantidade_registros = 2
# Enviar comando e exibir resposta
resposta = enviar_comando(ser, endereco_dispositivo, codigo_funcao, endereco_registrador, quantidade_registros)
if resposta:
print("Resposta Hex:", resposta.hex())
else:
print("Nenhuma resposta recebida.")
ser.close()