「Qtの基礎 - SPI通信」の版間の差分

ナビゲーションに移動 検索に移動
268行目: 268行目:
<br><br>
<br><br>


== SPI通信の受信 ==
== SPI通信の送信 ==
以下の例では、非同期処理を使用して、SPI通信でデータを送信している。<br>
以下の例では、非同期処理を使用して、SPI通信でデータを送信している。<br>
<br>
<br>
274行目: 274行目:
  // SpiWriter.hファイル
  // SpiWriter.hファイル
   
   
#include <QObject>
#include <QFile>
#include <QFuture>
#include <QtConcurrent>
#include <sys/ioctl.h>
#include <linux/spi/spidev.h>
#include <fcntl.h>
#include <unistd.h>
class SpiWriter : public QObject
{
    Q_OBJECT
public:
    explicit SpiWriter(const QString& devicePath, QObject* parent = nullptr) : QObject(parent), m_devicePath(devicePath)
    {}
    void writeData(const QByteArray& data)
    {
      QFuture<void> future = QtConcurrent::run([this, data]() {
          QFile spiDevice(m_devicePath);
          if (!spiDevice.open(QIODevice::WriteOnly)) {
            emit errorOccurred("SPIデバイスのオープンに失敗: " + spiDevice.errorString());
            return;
          }
          int fd = spiDevice.handle();
          uint8_t mode  = SPI_MODE_0;
          uint8_t bits  = 8;
          uint32_t speed = 500000;
          if (ioctl(fd, SPI_IOC_WR_MODE, &mode) < 0 ||
            ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits) < 0 ||
            ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) < 0) {
            emit errorOccurred("SPIの設定に失敗");
            spiDevice.close();
            return;
          }
          ssize_t ret = write(fd, data.constData(), data.size());
          if (ret < 0) {
            emit errorOccurred("SPIの書き込みに失敗");
          }
          else {
            emit dataWritten(ret);
          }
          spiDevice.close();
      });
    }
signals:
    void dataWritten(int bytes);
    void errorOccurred(const QString& error);
};
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
336行目: 281行目:
  #include <QCoreApplication>
  #include <QCoreApplication>
  #include <QTimer>
  #include <QTimer>
  #include "SpiWriter.h"
  #include "SpiDevice.h"
   
   
  int main(int argc, char *argv[])
  int main(int argc, char *argv[])
343行目: 288行目:
   
   
     SpiWriter writer("/dev/spidev0.0");
     SpiWriter writer("/dev/spidev0.0");
    SpiDevice::Config config;
    config.mode        = SpiDevice::Mode::Mode0;
    config.lsbFirst    = true;
    config.threeWire  = true;
    config.loopback    = false;
    config.noCs        = true;
    config.ready      = false;
    config.csChange    = false;
    config.bitsPerWord = 8;
    config.speed      = 1000000;
   
   
     QObject::connect(&writer, &SpiWriter::dataWritten, [](int bytes) {
     QObject::connect(&writer, &SpiWriter::dataWritten, [](int bytes) {
351行目: 307行目:
       qDebug() << "エラーが発生: " << error;
       qDebug() << "エラーが発生: " << error;
     });
     });
 
     QTimer::singleShot(5000, [&writer]() {
     QTimer::singleShot(5000, [&writer]() {
       writer.writeData(QByteArray::fromHex("0102030405"));
       writer.writeData(QByteArray::fromHex("0102030405"));

案内メニュー