📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

42行目: 42行目:
   
   
  #include <QObject>
  #include <QObject>
  #include <QI2CDevice>
  #include <QFile>
  #include <QFuture>
  #include <QFuture>
  #include <QtConcurrent>
  #include <QtConcurrent>
  #include <QDebug>
  #include <QDebug>
#include <sys/ioctl.h>
#include <linux/i2c-dev.h>
#include <fcntl.h>
#include <unistd.h>
   
   
  class I2CReader : public QObject
  class I2CReader : public QObject
52行目: 56行目:
   
   
  private:
  private:
     QI2CDevice *m_device;
     QFile *m_device;
    bool  m_streamingActive = false;
   
   
  public:
  public:
     explicit I2CReader(const QString &deviceName, QObject *parent = nullptr) : QObject(parent), m_device(new QI2CDevice(this))
     explicit I2CReader(const QString &deviceName, QObject *parent = nullptr) : QObject(parent), m_device(new QFile(deviceName, this))
     {
     {
       if (!m_device->open(deviceName)) {
       if (!m_device->open(QIODevice::ReadWrite)) {
           emit errorOccurred("デバイスのオープンに失敗: " + m_device->errorString());
           emit errorOccurred("デバイスのオープンに失敗: " + m_device->errorString());
       }
       }
77行目: 82行目:
           }
           }
   
   
           m_device->setSlaveAddress(address);
           // スレーブアドレスの設定
          if (ioctl(m_device->handle(), I2C_SLAVE, address) < 0) {
            emit errorOccurred("スレーブアドレスの設定に失敗");
            return QByteArray();
          }
           QByteArray data(size, 0);
           QByteArray data(size, 0);
           if (m_device->read(data.data(), size) != size) {
           if (m_device->read(data.data(), size) != size) {
             emit errorOccurred("データの読み込みに失敗: " + m_device->errorString());
             emit errorOccurred("データの読み込みに失敗: " + m_device->errorString());
91行目: 100行目:
     }
     }
   
   
signals:
     void startStreaming(int address, int size, int interval)
     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);
       m_streamingActive = true;
       connect(m_reader, &I2CReader::errorOccurred, this, &I2CReaderManager::handleError);
       QtConcurrent::run([this, address, size, interval]() {
      connect(m_reader, &I2CReader::dataReceived, this, &I2CReaderManager::handleData);
          while (m_streamingActive) {
    }
            QByteArray data = readDataAsync(address, size).result();
            if (!data.isEmpty()) {
    void readData(int address, int size)
                emit dataStreamed(data);
    {
            }
      QFuture<QByteArray> future = m_reader->readDataAsync(address, size);
             QThread::msleep(interval);
      future.then([this](const QByteArray &data) {
          if (data.isEmpty()) {
            qDebug() << "受信に失敗";
          }
          else {
             qDebug() << "受信に成功:" << data.toHex();
           }
           }
       });
       });
     }
     }
   
   
private slots:
     void stopStreaming()
     void handleError(const QString &error)
     {
     {
       qDebug() << "エラーが発生: " << error;
       m_streamingActive = false;
      // エラーに応じて適切な処理を行う
     }
     }
   
   
     void handleData(const QByteArray &data)
signals:
     {
     void dataReceived(const QByteArray &data);
      qDebug() << "データを受信しました:" << data.toHex();
     void dataStreamed(const QByteArray &data);
     void errorOccurred(const QString &error);
      // 受信したデータを処理する
     }
  };
  };
  </syntaxhighlight>
  </syntaxhighlight>
145行目: 129行目:
<br>
<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
#include <QCoreApplication>
  #include "I2CReader.h"
  #include "I2CReader.h"
   
   
151行目: 136行目:
     QCoreApplication a(argc, argv);
     QCoreApplication a(argc, argv);
   
   
     I2CReaderManager readerManager;
     I2CReader reader("/dev/i2c-1");
    // 非同期処理で受信する場合
    QFuture<QByteArray> readFuture = reader.readDataAsync(0x50, 10);
    readFuture.then([](const QByteArray &data) {
      qDebug() << "読み込んだデータ:" << data.toHex();
    });
    // ストリーミング受信する場合
    reader.startStreaming(0x50, 10, 1000);  // 1秒間隔で10[byte]読み込み
    // エラーハンドリングの例
    QObject::connect(&reader, &I2CReader::errorOccurred, [](const QString &error) {
      qDebug() << "読み込みエラー:" << error;
    });
   
   
     // I2C通信で受信
     // 10秒後にストリーミングを停止
     readerManager.readData(0x50, 10);
     QTimer::singleShot(10000, &reader, &I2CReader::stopStreaming);
   
   
     return a.exec();
     return a.exec();