Qt Шина CAN
Сеть контроллеров области (CAN) — это стандарт шины для транспортных средств, предназначенный для обеспечения связи микроконтроллеров и устройств друг с другом в приложениях без использования хост-компьютера.
Обзор
Это протокол на основе сообщений, первоначально разработанный для многоканальной электрической проводки в автомобилях, но также используется во многих других контекстах.
API шины CAN предоставляет общий API для доступа к устройствам CAN:
- QCanBus предоставляет API для создания QCanBusDevice из выбранного плагина.
- QCanBusDeviceInfo предоставляет информацию о доступных устройствах CAN.
- QCanBusDevice предоставляет API для прямого доступа к устройству CAN.
- QCanBusFrame определяет кадр CAN, который можно записывать и считывать из QCanBusDevice.
Плагины шины CAN
Несколько поставщиков предоставляют устройства CAN с различными API для доступа. Модуль QtSerialBus поддерживает следующие наборы плагинов шины CAN:
| Поставщик | Плагин (ключ) | Краткое описание |
|---|---|---|
| CAN по сокетам Linux |
SocketCAN (socketcan) |
Плагин шины CAN, использующий сокеты Linux и открытые исходные драйверы. |
| CAN через SAE J2534 Pass-Thru |
PassThruCAN (passthrucan) |
Плагин шины CAN, использующий интерфейс SAE J2534 Pass-Thru. |
| 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 |
VirtualCAN (virtualcan) |
Плагин шины CAN, использующий виртуальное TCP/IP соединение. |
Реализация пользовательского плагина 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 QCanBusFactory
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QCanBusFactory" FILE "plugin.json")
Q_INTERFACES(QCanBusFactory)
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-6.2/qtcanbus-backends.html