Я работаю над сценарием Python, который настраивает связь между несколькими электронными блоками управления (ECU1 и ECU2) с использованием библиотеки python-can. Скрипт предназначен для чтения сообщений из файла BLF, их фильтрации на основе определенных идентификаторов и обработки с использованием отдельных потоков для каждого ЭБУ. Однако сценарий не завершается должным образом и, похоже, зависает после печати сообщений «main_ECU выполнено», «фильтрация выполнена», «Поток ECU1 завершен».
поток выполнения сценария< /strong>:
[*]main_ecu fucntion — читает сообщение и отправляет его на виртуальную шину.
[*]функция ecu_filter - фильтровать сообщения на основе идентификатора и останавливаться при получении идентификатора 'oxDE0Q
[*]'main' функция - создать виртуальную шину, использовать потоки, как показано ниже
def main():
bus = can.interface.Bus(interface='virtual', channel='0', bitrate=500000,receive_own_messages=True)
can_id_filter_ecu1 = [0xKEREE, 0xWJKL0, oxDE0Q]
can_id_filter_ecu_2 = [0xIOBF, oxDE0Q]
main_ECU(bus, "input.blf")
#two seperate threads for ecu 1 and ecu 2
ecu_thread_1 = threading.Thread(target=ecu_filter,args= (bus,can_id_filter_ecu1,"File_1_msg.asc",))
ecu_thread_2 = threading.Thread(target=ecu_filter, args=(bus,can_id_filter_ecu_2,"File_2_msg.asc",))
ecu_thread_1.start()
ecu_thread_2.start()
ecu_thread_1.join()
print("ECU1 Thread has finished.")
ecu_thread_2.join()
print("ECU2 Thread has finished.")
bus.shutdown()
обновить[/b]
теперь скрипт запускается и возникает ошибка значения: ValueError: байт должен находиться в диапазоне (0 , 256) для строки (добавленной ниже), включенной в функцию ecu_filter
response_msg = can.Message(arbitration_id=msg_id,data= bytearray([count]), is_extended_id=False)
Фрагмент функции фильтра ЭБУ приведен ниже:
def ecu_filter(bus, filter_ids, asc_file):
stop_break = False
log_ecu = can.ASCWriter(asc_file)
msg_count = {}
while not stop_break:
mesg = bus.recv(1)
print(mesg) # Debugging output
if mesg is not None and mesg.arbitration_id in filter_ids:
log_ecu.log_event(mesg)
if mesg.arbitration_id == oxDE0Q:
stop_break = True
elif mesg.arbitration_id in msg_count:
msg_count[mesg.arbitration_id] += 1
else:
msg_count[mesg.arbitration_id] = 1
for msg_id, count in msg_count.items():
response_msg = can.Message(arbitration_id=msg_id, data=bytearray([count]), is_extended_id=False)
bus.send(response_msg)
log_ecu.stop()
Подробнее здесь: https://stackoverflow.com/questions/786 ... -terminate
Скрипт Python с многопоточностью и связью по шине CAN не прерывается ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Скрипт Python для доступа к служебной шине Azure с управляемым удостоверением
Anonymous » » в форуме Python - 0 Ответы
- 9 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Скрипт Python для доступа к служебной шине Azure с управляемым удостоверением
Anonymous » » в форуме Python - 0 Ответы
- 18 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Скрипт Python для доступа к служебной шине Azure с управляемым удостоверением
Anonymous » » в форуме Python - 0 Ответы
- 13 Просмотры
-
Последнее сообщение Anonymous
-