Работа с CAN FD через Python
Last updated
Last updated
В данном разделе мы рассмотрим пример кода программ для отправки и получения сообщения через CAN FD, написанных на языке программирования Python. Для работы с CAN у Python есть отдельная библиотека python-can, которая устанавливается с помощью pip3:
Импортируем три библиотеки:
Модуль struct умеет упаковывать данные из Python в байты и распаковывать их обратно, позволяя нам не задумываться о том как это делать. Он очень удобен в использовании, подробнее про struct и его методах можно прочитать в документации.
Далее создадим управляющую can-ом структуру, назовем ее can0 и сообщение, которое будем отправлять - число типа float, например 2.5 в байтах это 0х00002040:
По ссылке можно найти очень удобный конвертер, который легко переведет float в hex и обратно, самое главное не забыть поставить галочку рядом с Swap to use big-endian
Дальше в бесконечном цикле формируем массив байтов, используя функцию pack модуля struct, переводим его в тип сообщения, понятного для CAN и отправляем это сообщение. В качестве ID укажем 101, в hex это 0х065. По аналогии с программой, написанной на ардуино, в конце добавим задержку на все оставшееся время до 1 милисекунды.
Весь код программы, предназначенной отправлять сообщения:
Чтобы убедиться в корректной работе, в первом окне запустите программу (у нас она называется can_send.py)
В соседнем терминале воспользуйтесь утилитой candump, вы должны увидеть пакет из 4 байтов 00 00 20 40
Теперь напишем программу для получения сообщений. Подключаем все те же модули, создаем управлющую can-ом структуру. В бесконечном цикле получаем сообщение и если его ID = 101 (см. пример выше), распаковываем пакет и печатаем полученные данные.
Эту программу назовем can_recv и запустим ее в терминале. А в соседнем запустим программу, которая отправляет число 2.5, написанную ранее.
Как видим мы получили немного не то, что ожидали (а ожидали мы увидеть просто число 2.5). Дело в том, что результатом struct.unpack() является кортеж, даже если он содержит ровно один элемент. Об этом подробнее можно прочитать в документации. Давайте немного скорректируем наш код:
И теперь мы видим то число, которое и отправляем.
В данном разделе мы рассмотрели примеры программ для передачи и получения сообщений по CAN FD. Для обычного CAN в коде поменяется только одна строчка - создание управляющей can-ом структуры. Вместо
необходимо написать