Qt CAN-шина
Сеть контроля области (CAN) — это стандарт шины для транспортных средств, предназначенный для обеспечения возможности обмена данными между микроконтроллерами и устройствами в приложениях без участия хост-компьютера.
Обзор
Это протокол, основанный на сообщениях, первоначально разработанный для многоканальной электрической проводки в автомобилях, но также используемый и в других контекстах.
API CAN-шины предоставляет общий API для доступа к устройствам CAN:
- QCanBus предоставляет API для создания QCanBusDevice из выбранного плагина.
- QCanBusDevice предоставляет API для прямого доступа к устройству CAN.
- QCanBusFrame определяет кадр CAN, который можно записать и считать из QCanBusDevice.
Плагины CAN-шины
Несколько поставщиков предоставляют устройства CAN с различными API для доступа. Модуль QtSerialBus поддерживает следующие наборы плагинов CAN-шины:
| Поставщик | Плагин (ключ) | Краткое описание |
|---|---|---|
| CAN через сокеты Linux |
SocketCAN (socketcan) |
Плагин CAN-шины, использующий сокеты Linux и открытые драйверы. |
| SYS TEC electronic |
SystecCAN (systeccan) |
Бекенд CAN-шины, использующий адаптеры CAN SYS TEC. |
| PEAK-System |
PeakCAN (peakcan) |
Плагин CAN-шины, использующий адаптеры PEAK CAN. |
| MHS Elektronik |
TinyCAN (tinycan) |
Плагин CAN-шины, использующий адаптеры CAN MHS. |
| Vector Informatik |
VectorCAN (vectorcan) |
Плагин CAN-шины, использующий адаптеры Vector CAN. |
Реализация пользовательского плагина CAN
Если предоставленные Qt плагины не подходят для требуемой целевой платформы, можно реализовать пользовательский плагин CAN-шины. Реализация следует стандартному способу реализации плагинов Qt. Пользовательский плагин должен быть развернут в $QTDIR/plugins/canbus.
Каждый плагин должен определить ключ, используемый для загрузки плагина. Это делается с помощью небольшого файла json. Например, плагин socketcan использует следующий plugin.json.
{
"Key": "socketcan"
} Этот ключ должен быть передан в QCanBus::createDevice() вместе с именем интерфейса адаптера CAN-шины. QCanBus загружает и инициализирует плагин, используя интерфейс QCanBusFactoryV2, который каждый плагин должен реализовывать в качестве центральной точки входа. Интерфейс действует как фабрика и предназначен только для возврата экземпляра QCanBusDevice. Указанное выше имя интерфейса передается через метод фабрики QCanBusFactory::createDevice(). Следующая реализация фабрики для плагина socketcan:
class SocketCanBusPlugin : public QObject, public QCanBusFactoryV2
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QCanBusFactory" FILE "plugin.json")
Q_INTERFACES(QCanBusFactoryV2)
public:
QList<QCanBusDeviceInfo> availableDevices(QString *errorMessage) const override
{
Q_UNUSED(errorMessage);
return SocketCanBackend::interfaces();
}
QCanBusDevice *createDevice(const QString &interfaceName, QString *errorMessage) const override
{
Q_UNUSED(errorMessage);
auto device = new SocketCanBackend(interfaceName);
return device;
}
}; Следующий шаг — предоставить реализацию QCanBusDevice. Как минимум, необходимо реализовать следующие чистые виртуальные функции:
- QCanBusDevice::open()
- QCanBusDevice::close()
- QCanBusDevice::writeFrame()
- QCanBusDevice::interpretErrorFrame()
Методы open() и close() используются совместно с QCanBusDevice::connectDevice() и QCanBusDevice::disconnectDevice() соответственно. Подробности реализации см. в документации функции.
QCanBusDevice::writeFrame() отвечает за проверки на корректность, такие как проверка валидности QCanBusFrame и того, что устройство по-прежнему подключено. При прохождении проверок он записывает кадр в CAN-шину. При успехе он излучает сигнал QCanBusDevice::framesWritten; в противном случае вызывается QCanBusDevice::setError() с соответствующим сообщением об ошибке. Эта функция также может использоваться для реализации асинхронной операции записи. Ответственность разработчика плагина — излучать соответствующие сигналы в соответствующее время.
Наконец, QCanBusDevice::interpretErrorFrame предоставляет удобный способ перевода содержимого кадра ошибки CAN-шины в удобочитаемую строку ошибки.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.9/qtcanbus-backends.html