42 lines
1.6 KiB
Python
42 lines
1.6 KiB
Python
|
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()
|