2016-05-25 15 views
0

I implementiert Bytes an einer seriellen Kommunikation in einem Qt-Projekt (5.5) in Visual Studio 2013 Mein Code zu lesen ist hier:Kann nicht um einen Parameter QT Geben Funktion verbinden

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(); 
    } 

} 

Dieser Code funktioniert erfolgreich. Ich möchte den Inhalt von m_readData-Array auf abc-Array festlegen, damit ich die Nachricht im Hauptbereich auswerten kann. Um dies zu implementieren, gab ich abc-Array zu handleReadyRead-Funktion als Parameter. Aber es gibt ein Fehler haben.Kamera Code ist hier:

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(); 
    } 
} 

Fehler:

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

line45:

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

Antwort

0

Sie nicht die lokale Variable auf den Schlitz auf diese Weise passieren kann , aber was du versuchst zu tun, erfordert es nicht einmal. Sie könnten einfach abc in einer Membervariable im Konstruktor speichern und im Slot verwenden. ABER: Sie müssen es in eine Referenz ändern, sonst kopiert der Aufruf des Konstruktors das Array, so dass das Original in Ihrer Hauptfunktion nicht betroffen ist.

Sie könnten auch implementieren gerade dieses Array als Mitglied Variable Ihrer SerialReader und eine Getter-Funktion zur Verfügung stellen, so dass die main Funktion (oder wer auch immer die Verbraucher der Daten) von dem Leser Instanz dieser Daten nur ziehen kann.

+0

Ich habe Ihren zweiten Vorschlag angewendet und es hat mein Problem behoben. Ich möchte jedoch die Hauptfunktion nach dem Aufruf von serialportreader warten, bis eine Nachricht bei dieser Kommunikation empfangen wurde. Ich brauche das Array nach diesen Operationen. Somit habe ich jetzt ein Synchronisierungsproblem. –

+0

Da Sie Qt verwenden, wäre es naheliegend, ein Signal im Lesegerät zu senden und einen Slot zu erstellen, in dem Sie Ihre Daten verarbeiten –