2016-05-25 3 views
0

を接続QTにパラメータを与えることはできませんが、私はQtのプロジェクト(5.5)でシリアル通信でのバイトを読み込む実装Visual Studioで2013年 私のコードはここにある:が機能

main.cppに

int main(int argc, char *argv[]) 
{ 

    QApplication app(argc, argv); 
    //QCoreApplication coreApplication(argc, argv); 
    int argumentCount = QCoreApplication::arguments().size(); 
    QStringList argumentList = QCoreApplication::arguments(); 

    QTextStream standardOutput(stdout); 

    if (argumentCount == 1) { 
     standardOutput << QObject::tr("Usage: %1 <serialportname> [baudrate]").arg(argumentList.first()) << endl; 
     return 1; 
    } 

    QSerialPort serialPort; 
    QString serialPortName = argumentList.at(1); 
    serialPort.setPortName(serialPortName); 

    int serialPortBaudRate = (argumentCount > 2) ? argumentList.at(2).toInt() : QSerialPort::Baud9600; 
    serialPort.setBaudRate(serialPortBaudRate); 

    if (!serialPort.open(QIODevice::ReadOnly)) { 
     standardOutput << QObject::tr("Failed to open port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl; 
     return 1; 
    } 

    Camera cam2; 
    //cam2.showCamera(); 
    cam2.showCamera(); 
    cam2.showFullScreen(); 

    QByteArray abc; 
    SerialPortReader serialPortReader(&serialPort,abc); 

    //return coreApplication.exec(); 
    return app.exec(); 

}; 

serialportreader.cpp

#include "serialportreader.h" 

#include <QCoreApplication> 

QT_USE_NAMESPACE 

SerialPortReader::SerialPortReader(QSerialPort *serialPort, QByteArray abc, QObject *parent) 
: QObject(parent) 
, m_serialPort(serialPort) 
, m_standardOutput(stdout) 
{ 
    connect(m_serialPort, &QSerialPort::readyRead, this, &SerialPortReader::handleReadyRead);  
} 

SerialPortReader::~SerialPortReader() 
{ 

} 

void SerialPortReader::handleReadyRead() 
{ 
    m_readData.append(m_serialPort->readAll()); 
    if (!m_readData.isEmpty()) { 
     m_standardOutput << m_readData << endl; 
     m_readData.clear(); 
    } 

} 

このコードは正常に動作します。 m_readData配列の内容をabc配列に設定して、メインスコープのメッセージを評価できるようにしたいと思います。これを実装するために、abRead配列にhandleReadyRead関数をパラメータとして与えました。しかし、それはerror.Theコードはここにある与えます:

SerialPortReader::SerialPortReader(QSerialPort *serialPort, QByteArray abc, QObject *parent) 
: QObject(parent) 
, m_serialPort(serialPort) 
, m_standardOutput(stdout) 
{ 
    connect(m_serialPort, &QSerialPort::readyRead, this, &SerialPortReader::handleReadyRead(abc)); 
} 

SerialPortReader::~SerialPortReader() 
{ 

} 

void SerialPortReader::handleReadyRead(QByteArray abc) 
{ 
    m_readData.append(m_serialPort->readAll()); 
    if (!m_readData.isEmpty()) { 
     m_standardOutput << m_readData << endl; 
     m_readData.clear(); 
    } 
} 

エラー:

serialportreader.cpp(45): error C2102: '&' requires l-value 

がline45:

connect(m_serialPort, &QSerialPort::readyRead, this, &SerialPortReader::handleReadyRead(abc)); 

答えて

0

あなたがスロットにこの方法をローカル変数を渡すことはできませんしかし、あなたがしようとしていることはそれを必要としない。コンストラクタ内のメンバ変数にabcを格納し、それをスロットで使用するだけです。しかし、それを参照に変更する必要があります。それ以外の場合は、コンストラクタの呼び出しによって配列がコピーされるため、メイン関数の元の配列は影響を受けません。

この配列をSerialReaderのメンバー変数として実装し、ゲッター関数を提供することで、main関数(またはデータの消費者)がリーダーインスタンスからこのデータを引き出すことができます。

+0

私はあなたの2番目の提案を適用し、私の問題を解決しました。しかし、私はその通信でいくつかのメッセージを得るまで、serialportreaderを呼び出した後、main関数を待つことを望みます。なぜなら、私はそれらの操作の後にその配列が必要だからです。したがって、今私は同期の問題があります。 –

+0

Qtを使用しているので、明らかな方法は、読者にシグナルを出して、スロットを作成することです。 –