| 2行目: | 2行目: | ||
<br><br> | <br><br> | ||
== | == I2C通信の受信 == | ||
以下の例では、非同期処理を使用して、I2C通信の受信を行っている。<br> | |||
適切なI2Cデバイス名 (例: /dev/i2c-1) とスレーブアドレスを指定する必要があることに注意する。<br> | 適切なI2Cデバイス名 (例: /dev/i2c-1) とスレーブアドレスを指定する必要があることに注意する。<br> | ||
<br> | <br> | ||
| 111行目: | 111行目: | ||
<br> | <br> | ||
上記のクラスを使用して、I2C通信でデータを受信する。<br> | 上記のクラスを使用して、I2C通信でデータを受信する。<br> | ||
<br> | |||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
#include "I2CReader.h" | #include "I2CReader.h" | ||
| 122行目: | 123行目: | ||
// I2C通信で受信 | // I2C通信で受信 | ||
readerManager.readData(0x50, 10); | readerManager.readData(0x50, 10); | ||
return a.exec(); | |||
} | |||
</syntaxhighlight> | |||
<br><br> | |||
== I2C通信の送信 == | |||
以下の例では、非同期処理を使用して、I2C通信の送信を行っている。<br> | |||
<br> | |||
適切なI2Cデバイス名 (例: /dev/i2c-1) とスレーブアドレスを指定する必要があることに注意する。<br> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
// I2CWriter.hファイル | |||
#include <QObject> | |||
#include <QI2CDevice> | |||
#include <QFuture> | |||
#include <QtConcurrent> | |||
#include <QDebug> | |||
class I2CWriter : public QObject | |||
{ | |||
Q_OBJECT | |||
private: | |||
QI2CDevice *m_device; | |||
public: | |||
explicit I2CWriter(const QString &deviceName, QObject *parent = nullptr) : QObject(parent), m_device(new QI2CDevice(this)) | |||
{ | |||
if (!m_device->open(deviceName)) { | |||
emit errorOccurred("デバイスのオープンに失敗: " + m_device->errorString()); | |||
} | |||
} | |||
~I2CWriter() | |||
{ | |||
if (m_device->isOpen()) { | |||
m_device->close(); | |||
} | |||
} | |||
QFuture<bool> writeDataAsync(int address, const QByteArray &data) | |||
{ | |||
return QtConcurrent::run([this, address, data]() { | |||
if (!m_device->isOpen()) { | |||
emit errorOccurred("デバイスが開かれていない"); | |||
return false; | |||
} | |||
m_device->setSlaveAddress(address); | |||
if (m_device->write(data.constData(), data.size()) != data.size()) { | |||
emit errorOccurred("データの書き込みに失敗: " + m_device->errorString()); | |||
return false; | |||
} | |||
emit writeCompleted(true); | |||
return true; | |||
}); | |||
} | |||
signals: | |||
void writeCompleted(bool success); | |||
void errorOccurred(const QString &error); | |||
}; | |||
// エラーハンドリングと使用例 | |||
class I2CWriterManager : public QObject | |||
{ | |||
Q_OBJECT | |||
private: | |||
I2CWriter *m_writer; | |||
public: | |||
explicit I2CWriterManager(QObject *parent = nullptr) : QObject(parent) | |||
{ | |||
m_writer = new I2CWriter("/dev/i2c-1", this); | |||
connect(m_writer, &I2CWriter::errorOccurred, this, &I2CWriterManager::handleError); | |||
connect(m_writer, &I2CWriter::writeCompleted, this, &I2CWriterManager::handleWriteCompleted); | |||
} | |||
void writeData(int address, const QByteArray &data) | |||
{ | |||
QFuture<bool> future = m_writer->writeDataAsync(address, data); | |||
future.then([this](bool success) { | |||
if (success) { | |||
qDebug() << "書き込み成功"; | |||
} | |||
else { | |||
qDebug() << "書き込みに失敗"; | |||
} | |||
}); | |||
} | |||
private slots: | |||
void handleError(const QString &error) | |||
{ | |||
qDebug() << "エラーが発生: " << error; | |||
// エラーに応じて適切な処理を行う | |||
} | |||
void handleWriteCompleted(bool success) | |||
{ | |||
qDebug() << "書き込み完了: " << (success ? "成功" : "失敗"); | |||
// 書き込み完了後の処理を行う | |||
} | |||
}; | |||
</syntaxhighlight> | |||
<br> | |||
上記のクラスを使用して、I2C通信でデータを送信する。<br> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
#include "I2CWriter.h" | |||
int main(int argc, char *argv[]) | |||
{ | |||
QCoreApplication a(argc, argv); | |||
I2CWriterManager writerManager; | |||
// 書き込み操作 | |||
QByteArray dataToWrite = QByteArray::fromHex("0102030405"); | |||
writerManager.writeData(0x50, dataToWrite); | |||
return a.exec(); | return a.exec(); | ||