rs-485-emulator/test.py

42 lines
1.6 KiB
Python
Raw Permalink Normal View History

2024-10-23 10:33:21 +07:00
import serial
import struct
# Подключение к виртуальному порту (например, /dev/pts/6)
ser = serial.Serial('/dev/pts/6', 9600, timeout=1)
# Пример запроса Modbus (функция 0x04, чтение регистра 0x0001)
request = bytes([1, 4, 0x00, 0x01, 0x00, 0x01, 0x31, 0xCA])
# Отправка запроса
ser.write(request)
# Чтение ответа (Минимум 7 байт: 1 байт адрес, 1 байт код функции, 1 байт количество данных, 4 байта данных, 2 байта CRC)
response = ser.read(9) # Ожидаем 9 байт (учитывая длину данных)
if len(response) >= 9:
print(f'Response (hex): {response.hex()}')
# Распарсим ответ
slave_address = response[0] # Адрес устройства
function_code = response[1] # Код функции
byte_count = response[2] # Количество байт данных
# Получаем 4 байта данных (float в IEEE 754)
data_bytes = response[3:3+4]
crc_received = struct.unpack('<H', response[7:9])[0] # CRC16 (2 байта)
# Конвертируем данные из формата IEEE 754 в float
distance_value = struct.unpack('>f', data_bytes)[0]
# Вывод распарсенной информации
print(f"Slave Address: {slave_address}")
print(f"Function Code: {function_code}")
print(f"Byte Count: {byte_count}")
print(f"Distance Value (meters): {distance_value:.2f}")
print(f"CRC Received: {hex(crc_received)}")
else:
print("Incomplete response received")
ser.close()