Spec-Zone.ru › Qt 5.9

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API