Qtの基礎 - I2C通信

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
2024年9月17日 (火) 15:59時点におけるWiki (トーク | 投稿記録)による版 (ページの作成:「== 概要 == <br><br> == I2C通信で受信 == 以下の例では、非同期処理を使用して、I2C通信を行っている。<br> 適切なI2Cデバイス名 (例: /dev/i2c-1) とスレーブアドレスを指定する必要があることに注意する。<br> <br> <syntaxhighlight lang="c++"> // I2CReader.h #include <QObject> #include <QI2CDevice> #include <QFuture> #include <QtConcurrent> #include <QDebug> class I2CReader : public QObject {…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

概要



I2C通信で受信

以下の例では、非同期処理を使用して、I2C通信を行っている。
適切なI2Cデバイス名 (例: /dev/i2c-1) とスレーブアドレスを指定する必要があることに注意する。

 // I2CReader.h
 
 #include <QObject>
 #include <QI2CDevice>
 #include <QFuture>
 #include <QtConcurrent>
 #include <QDebug>
 
 class I2CReader : public QObject
 {
    Q_OBJECT
 
 private:
    QI2CDevice *m_device;
 
 public:
    explicit I2CReader(const QString &deviceName, QObject *parent = nullptr) : QObject(parent), m_device(new QI2CDevice(this))
    {
       if (!m_device->open(deviceName)) {
          emit errorOccurred("デバイスのオープンに失敗: " + m_device->errorString());
       }
    }
 
    ~I2CReader()
    {
       if (m_device->isOpen()) {
          m_device->close();
       }
    }
 
    QFuture<QByteArray> readDataAsync(int address, int size)
    {
       return QtConcurrent::run([this, address, size]() {
          if (!m_device->isOpen()) {
             emit errorOccurred("デバイスが開かれていない");
             return QByteArray();
          }
 
          m_device->setSlaveAddress(address);
          QByteArray data(size, 0);
 
          if (m_device->read(data.data(), size) != size) {
             emit errorOccurred("データの読み込みに失敗: " + m_device->errorString());
             return QByteArray();
          }
 
          emit dataReceived(data);
 
          return data;
       });
    }
 
 signals:
    void dataReceived(const QByteArray &data);
    void errorOccurred(const QString &error);
 };
 
 // エラーハンドリングと使用例
 class I2CReaderManager : public QObject
 {
    Q_OBJECT
 
 private:
    I2CReader *m_reader;
 
 public:
    explicit I2CReaderManager(QObject *parent = nullptr) : QObject(parent)
    {
       m_reader = new I2CReader("/dev/i2c-1", this);
       connect(m_reader, &I2CReader::errorOccurred, this, &I2CReaderManager::handleError);
       connect(m_reader, &I2CReader::dataReceived, this, &I2CReaderManager::handleData);
    }
 
    void readData(int address, int size)
    {
       QFuture<QByteArray> future = m_reader->readDataAsync(address, size);
       future.then([this](const QByteArray &data) {
          if (data.isEmpty()) {
             qDebug() << "受信に失敗";
          }
          else {
             qDebug() << "受信に成功:" << data.toHex();
          }
       });
    }
 
 private slots:
    void handleError(const QString &error)
    {
       qDebug() << "エラーが発生: " << error;
 
       // エラーに応じて適切な処理を行う
    }
 
    void handleData(const QByteArray &data)
    {
       qDebug() << "データを受信しました:" << data.toHex();
 
       // 受信したデータを処理する
    }
 };