73 lines
3 KiB
Python
73 lines
3 KiB
Python
import can
|
|
import time
|
|
|
|
def send_write_read_requests():
|
|
try:
|
|
bus = can.interface.Bus(channel='can0', bustype='socketcan')
|
|
|
|
# Конфигурация сообщений (ЗАПОЛНИТЕ ВАШИ ЗНАЧЕНИЯ)
|
|
write_msg = {
|
|
'arbitration_id': 0x01, # CAN ID для записи
|
|
'data': [0x27, 0xA0, 0xFF, 0x00], # Данные для записи (4 байта)
|
|
'description': "Установка id устройства"
|
|
}
|
|
|
|
read_msg = {
|
|
'arbitration_id': 0x01, # CAN ID для чтения
|
|
'data': [0xFF,0x99], # Адрес новый + команда запроса данных
|
|
'description': "Запрос id устройства",
|
|
'response_id': 0xFF, # Ожидаемый ID ответа
|
|
'timeout': 1.0 # Таймаут ожидания ответа (сек)
|
|
}
|
|
|
|
# 1. Отправка команды записи
|
|
print("Отправка команды записи...")
|
|
msg = can.Message(
|
|
arbitration_id=write_msg['arbitration_id'],
|
|
data=write_msg['data'],
|
|
is_extended_id=False
|
|
)
|
|
bus.send(msg)
|
|
print(f"Запись: ID={hex(msg.arbitration_id)}, Данные={list(msg.data)}")
|
|
|
|
# Ждем обработки команды устройством
|
|
time.sleep(2.0)
|
|
|
|
# 2. Отправка запроса чтения и ожидание ответа
|
|
print("\nОтправка запроса чтения...")
|
|
msg = can.Message(
|
|
arbitration_id=read_msg['arbitration_id'],
|
|
data=read_msg['data'],
|
|
is_extended_id=False
|
|
)
|
|
bus.send(msg)
|
|
print(f"Чтение: ID={hex(msg.arbitration_id)}, Команда={list(msg.data)}")
|
|
|
|
# Ожидаем ответа
|
|
start_time = time.time()
|
|
response_received = False
|
|
|
|
print("\nОжидание ответа...")
|
|
while (time.time() - start_time) < read_msg['timeout']:
|
|
response = bus.recv(timeout=0.1)
|
|
|
|
if response and response.arbitration_id == read_msg['response_id']:
|
|
print(f"\nПолучен ответ: ID={hex(response.arbitration_id)}")
|
|
print(f"Данные: {list(response.data)}")
|
|
print(f"Длина: {response.dlc} байт")
|
|
response_received = True
|
|
break
|
|
|
|
if not response_received:
|
|
print("\nОшибка: ответ не получен в течение заданного времени")
|
|
|
|
except KeyboardInterrupt:
|
|
print("\nПрерывание пользователем")
|
|
except Exception as e:
|
|
print(f"Ошибка: {str(e)}")
|
|
finally:
|
|
bus.shutdown()
|
|
print("\nCAN соединение закрыто")
|
|
|
|
if __name__ == '__main__':
|
|
send_write_read_requests()
|