MicroPython:Библиотеки/pyb/Класс CAN: различия между версиями
Myagkij (обсуждение | вклад) Нет описания правки |
Myagkij (обсуждение | вклад) Нет описания правки |
||
Строка 35: | Строка 35: | ||
* [[MicroPython:Библиотеки/pyb/Класс CAN/CAN.setfilter()|CAN.setfilter(bank, mode, fifo, params, *, rtr)]] | * [[MicroPython:Библиотеки/pyb/Класс CAN/CAN.setfilter()|CAN.setfilter(bank, mode, fifo, params, *, rtr)]] | ||
* [[MicroPython:Библиотеки/pyb/Класс CAN/CAN.clearfilter()|CAN.clearfilter(bank)]] | * [[MicroPython:Библиотеки/pyb/Класс CAN/CAN.clearfilter()|CAN.clearfilter(bank)]] | ||
* [[MicroPython:Библиотеки/pyb/Класс CAN/ | * [[MicroPython:Библиотеки/pyb/Класс CAN/CAN.any()|CAN.any(fifo)]] | ||
* [[MicroPython:Библиотеки/pyb/Класс CAN/ | * [[MicroPython:Библиотеки/pyb/Класс CAN/CAN.recv()|CAN.recv(fifo, list=None, *, timeout=5000)]] | ||
* [[MicroPython:Библиотеки/pyb/Класс CAN/ | * [[MicroPython:Библиотеки/pyb/Класс CAN/ | ||
* [[MicroPython:Библиотеки/pyb/Класс CAN/ | * [[MicroPython:Библиотеки/pyb/Класс CAN/ | ||
Строка 46: | Строка 46: | ||
* [[MicroPython:Библиотеки/pyb/Класс CAN/ | * [[MicroPython:Библиотеки/pyb/Класс CAN/ | ||
* CAN.any(fifo) – возвращает True, если в FIFO есть сообщение для считывания. В противном случае возвращает False. | * CAN.any(fifo) – возвращает True, если в FIFO есть сообщение для считывания. В противном случае возвращает False. | ||
* CAN.recv(fifo, list=None, *, timeout=5000) – принимает данные на шине: | * CAN.recv(fifo, list=None, *, timeout=5000) – принимает данные на шине: |
Версия от 21:55, 4 октября 2020
Класс CAN – коммуникационная шина CAN[1]
В классе CAN реализован коммуникационный протокол CAN. На физическом уровне он состоит из 2 линий: RX и TX. Для подключения PyBoard к шине CAN нужно использовать CAN-трансивер – чтобы преобразовать сигналы CAN-логики от PyBoard в правильные уровни напряжения на шине.
Пример использования (работает, даже если ничего не подключено):
from pyb import CAN
can = CAN(1, CAN.LOOPBACK)
# задаем фильтр для получения сообщений с id 123, 124, 125 и 126:
can.setfilter(0, CAN.LIST16, 0, (123, 124, 125, 126))
can.send('message!', 123) # отправляем сообщение с ID 123
can.recv(0) # получаем сообщение на FIFO 0
Конструкторы
Методы класса
Методы
- CAN.init(mode, extframe=False, prescaler=100, *, sjw=1, bs1=6, bs2=8, auto_restart=False)
- CAN.deinit()
- CAN.restart()
- CAN.state()
- CAN.info([list])
- CAN.setfilter(bank, mode, fifo, params, *, rtr)
- CAN.clearfilter(bank)
- CAN.any(fifo)
- CAN.recv(fifo, list=None, *, timeout=5000)
- [[MicroPython:Библиотеки/pyb/Класс CAN/
- [[MicroPython:Библиотеки/pyb/Класс CAN/
- [[MicroPython:Библиотеки/pyb/Класс CAN/
- [[MicroPython:Библиотеки/pyb/Класс CAN/
- [[MicroPython:Библиотеки/pyb/Класс CAN/
- [[MicroPython:Библиотеки/pyb/Класс CAN/
- [[MicroPython:Библиотеки/pyb/Класс CAN/
- [[MicroPython:Библиотеки/pyb/Класс CAN/
- CAN.any(fifo) – возвращает True, если в FIFO есть сообщение для считывания. В противном случае возвращает False.
- CAN.recv(fifo, list=None, *, timeout=5000) – принимает данные на шине:
- fifo – это целое число, обозначающее то, какой FIFO будет принимать данные.
- list – это опциональный списковый объект, который будет использоваться в качестве возвращаемого значения.
- timeout – таймаут в миллисекундах для ожидания приема данных.
Возвращаемое значение – это кортеж с 4 элементами:
- ID сообщения.
- Булево значение, сообщающее о том, является ли сообщение RTR-сообщением.
- Значение FMI («filter match index», т.е. «индекс совпадения фильтра»).
- Массив, содержащий данные.
Если в list задано None, система выделит память под новый кортеж и новый объект bytes – для хранения данных (в виде четвертого элемента этого кортежа). Если в list будет задано не None, то это должен быть списковый объект, содержащий как минимум 4 элемента. Четвертым элементом должен быть объект memoryview, который создается либо из массива байтов, либо из массива типа «B» или «b», и этот массив должен быть достаточно велик, чтобы вместить как минимум 8 байтов. Затем этот списковый объект будет наполнен первыми тремя возвращенными значениями из списка выше, а размер объекта memoryview будет изменен в соответствии с размером присланных данных и заполнен этими данными. При последующих вызовах этого метода этот же список и объект memoryview можно будет использовать повторно, что позволяет получать данные без использования кучи. Например:
buf = bytearray(8)
lst = [0, 0, 0, memoryview(buf)]
# При следующем вызове память в куче выделена не будет.
can.recv(0, lst)
- CAN.send(data, id, *, timeout=0, rtr=False) – отправляет сообщение на шину:
- data – данные, которые нужно отправить (целое число или буферный объект).
- id – ID отправляемого сообщения.
- timeout – таймаут в миллисекундах для ожидания отправки данных.
- rtr – это булево значение, задающее, будет ли это сообщение отправлено как запрос на удаленную передачу данных. Если задать здесь True, будет использован только размер данных data (чтобы заполнить поле DLC фрейма). Сами байты из data использованы не будут.
Если задать в timeout значение «0», сообщение будет помещено в один из трех аппаратных буферов, а метод вернет значение немедленно. Если все три буфера уже используются, будет возбуждено исключение. Если значение в timeout будет ненулевым, метод будет ждать, пока сообщение не будет отправлено. Если сообщение не будет отправлено в пределах заданного времени, будет возбуждено исключение. Возвращаемое значение: None.
- CAN.rxcallback(fifo, fun) – регистрирует функцию, которая будет вызвана при приеме сообщения в пустой FIFO.
- fifo – FIFO, получающий сообщение.
- fun – функция, которая будет вызвана, когда FIFO перестанет быть пустым.
Функция обратного вызова принимает два аргумента. Первый – это сам объект CAN, а второй – это целое число, информирующее о причине запуска функции обратного вызова:
- «0» – сообщение принято в пустой FIFO.
- «1» – FIFO заполнен.
- «2» – сообщение было потеряно из-за полного FIFO.
Пример использования CAN.rxcallback(fifo, fun):
def cb0(bus, reason):
print('cb0')
if reason == 0:
print('в режиме ожидания')
if reason == 1:
print('полный')
if reason == 2:
print('переполнение')
can = CAN(1, CAN.LOOPBACK)
can.rxcallback(0, cb0)
Константы
- CAN.NORMAL, CAN.LOOPBACK, CAN.SILENT, CAN.SILENT_LOOPBACK – режимы работы CAN-шины, используемые в init().
- CAN.STOPPED, CAN.ERROR_ACTIVE, CAN.ERROR_WARNING, CAN.ERROR_PASSIVE, CAN.BUS_OFF – режимы работы CAN-контроллера, возвращаемые функцией state().
- CAN.LIST16, CAN.MASK16, CAN.LIST32, CAN.MASK32 – режимы работы фильтра, используемые в setfilter().
<syntaxhighlight lang="python" enclose="div">