Проблема с настройкой прослушивателя Python-Can ⇐ Python
Проблема с настройкой прослушивателя Python-Can
Я относительно новичок в Python и пытаюсь создать новую программу для взаимодействия с CANbus. Я просматривал документацию и некоторые примеры Python-Can с использованием интерфейса SocketCAN и столкнулся с некоторыми проблемами.
Я подтвердил, что оборудование работает корректно. У меня есть отдельное устройство для передачи тестового шаблона на CANbus, и при использовании прослушивателя по умолчанию «can.Printer()» ожидаемые сообщения, передаваемые на CANbus, правильно печатаются в терминале.
Моим следующим шагом было создание новой функции-прослушивателя, которая в конечном итоге будет обрабатывать полученные сообщения от CANbus (функция msg_rx_routine в моем коде). При использовании кода, который у меня есть сейчас, обычно печатается первое полученное сообщение CAN, но затем возникает ошибка обратного вызова объекта «не типа», который невозможно вызвать.
Мое оборудование: -rPi CM4 + плата расширения ввода/вывода -Коммутационная платаMCP2515
Тестовый код:
импорт может время импорта импортировать ОС #--------определение вспомогательных функций """ ФУНКЦИЯ: процедура получения сообщений @ARG can_bus: передано, может возразить ВОЗВРАТ: нет """ защита msg_rx_routine (can_bus): rx_msg = can_bus.recv() печать (rx_msg) #--------Инициализация CANBUS os.system("sudo /sbin/ip link set can0 up type может иметь битрейт 500000") #вызовите интерфейс can0 со скоростью 500 кбит/с time.sleep(0.05) #краткая пауза CAN1 = can.interface.Bus(channel='can0', bustype='socketcan') #instance CAN object #TODO: настроить CAN-соединение (маски и т. д.) #CAN1_listener = can.Printer() #назначаем прослушиватель «принтера» по умолчанию для печати на терминале CAN1_listener = msg_rx_routine(CAN1) #назначаем функцию обработчика сообщений в качестве прослушивателя CAN1_notifier = can.Notifier(CAN1, [CAN1_listener]) #назначаем прослушиватель уведомителю защита основной(): пока правда: передать цикл #just dummy для ожидания команды прерывания если __name__ == "__main__": основной() Результирующая ошибка: Вывод ошибок консоли
Мне кажется, что я явно что-то не понимаю в основной концепции функциональности «прослушиватель/уведомитель» этой работы, и это меня поставило в тупик. То, как я (пытаюсь) понять это сейчас, будет похоже на то, как будет работать запрос IRQ в C-коде для микроконтроллера. Учитывая прерывание (уведомитель), оно вызовет некоторую связанную функцию (прослушиватель).
Как уже говорилось ранее, я пытаюсь достичь следующего: -дождитесь сообщения -при получении сообщения вызовите функцию -функция что-то делает с сообщением
Я вижу, что здесь есть похожее обсуждение, где кто-то делает то же самое. Я (думаю), что они передают функции «parse_data» только тип данных «can», верно? Мне любопытно, не ошибаюсь ли я в этом, поскольку передаю в свою функцию объект типа «шина» «CAN1». Однако для меня не имеет смысла передавать в функцию только общий тип «can», когда было бы разумнее сказать, на КАКОЙ шине вы ищете сообщение. Я не уверен, то ли я что-то неправильно понимаю, то ли во многих примерах, которые я нашел, используются неуникальные имена переменных.
Наконец, я вижу прослушиватель по умолчанию «BufferedReader», который помещает полученное сообщение в очередь. Я еще не пробовал это использовать, но мне интересно, нужно ли мне именно так справиться с тем, чего я пытаюсь достичь? Потенциальная проблема, с которой у меня возникает проблема с этой концепцией, заключается в том, чтобы убедиться, что я знаю, когда в буфере что-то есть, и затем обработать эту информацию.
Я относительно новичок в Python и пытаюсь создать новую программу для взаимодействия с CANbus. Я просматривал документацию и некоторые примеры Python-Can с использованием интерфейса SocketCAN и столкнулся с некоторыми проблемами.
Я подтвердил, что оборудование работает корректно. У меня есть отдельное устройство для передачи тестового шаблона на CANbus, и при использовании прослушивателя по умолчанию «can.Printer()» ожидаемые сообщения, передаваемые на CANbus, правильно печатаются в терминале.
Моим следующим шагом было создание новой функции-прослушивателя, которая в конечном итоге будет обрабатывать полученные сообщения от CANbus (функция msg_rx_routine в моем коде). При использовании кода, который у меня есть сейчас, обычно печатается первое полученное сообщение CAN, но затем возникает ошибка обратного вызова объекта «не типа», который невозможно вызвать.
Мое оборудование: -rPi CM4 + плата расширения ввода/вывода -Коммутационная платаMCP2515
Тестовый код:
импорт может время импорта импортировать ОС #--------определение вспомогательных функций """ ФУНКЦИЯ: процедура получения сообщений @ARG can_bus: передано, может возразить ВОЗВРАТ: нет """ защита msg_rx_routine (can_bus): rx_msg = can_bus.recv() печать (rx_msg) #--------Инициализация CANBUS os.system("sudo /sbin/ip link set can0 up type может иметь битрейт 500000") #вызовите интерфейс can0 со скоростью 500 кбит/с time.sleep(0.05) #краткая пауза CAN1 = can.interface.Bus(channel='can0', bustype='socketcan') #instance CAN object #TODO: настроить CAN-соединение (маски и т. д.) #CAN1_listener = can.Printer() #назначаем прослушиватель «принтера» по умолчанию для печати на терминале CAN1_listener = msg_rx_routine(CAN1) #назначаем функцию обработчика сообщений в качестве прослушивателя CAN1_notifier = can.Notifier(CAN1, [CAN1_listener]) #назначаем прослушиватель уведомителю защита основной(): пока правда: передать цикл #just dummy для ожидания команды прерывания если __name__ == "__main__": основной() Результирующая ошибка: Вывод ошибок консоли
Мне кажется, что я явно что-то не понимаю в основной концепции функциональности «прослушиватель/уведомитель» этой работы, и это меня поставило в тупик. То, как я (пытаюсь) понять это сейчас, будет похоже на то, как будет работать запрос IRQ в C-коде для микроконтроллера. Учитывая прерывание (уведомитель), оно вызовет некоторую связанную функцию (прослушиватель).
Как уже говорилось ранее, я пытаюсь достичь следующего: -дождитесь сообщения -при получении сообщения вызовите функцию -функция что-то делает с сообщением
Я вижу, что здесь есть похожее обсуждение, где кто-то делает то же самое. Я (думаю), что они передают функции «parse_data» только тип данных «can», верно? Мне любопытно, не ошибаюсь ли я в этом, поскольку передаю в свою функцию объект типа «шина» «CAN1». Однако для меня не имеет смысла передавать в функцию только общий тип «can», когда было бы разумнее сказать, на КАКОЙ шине вы ищете сообщение. Я не уверен, то ли я что-то неправильно понимаю, то ли во многих примерах, которые я нашел, используются неуникальные имена переменных.
Наконец, я вижу прослушиватель по умолчанию «BufferedReader», который помещает полученное сообщение в очередь. Я еще не пробовал это использовать, но мне интересно, нужно ли мне именно так справиться с тем, чего я пытаюсь достичь? Потенциальная проблема, с которой у меня возникает проблема с этой концепцией, заключается в том, чтобы убедиться, что я знаю, когда в буфере что-то есть, и затем обработать эту информацию.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение