2016-05-25 6 views
0

J'ai mis en lecture octets à une communication série dans un projet Qt (5.5) dans Visual Studio 2013. Mon code est ici:ne peut pas donner un paramètre QT fonction de connexion

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

} 

Ce code fonctionne correctement. Je voudrais définir le contenu du tableau m_readData à abc array afin que je puisse évaluer le message dans la portée principale. Afin d'implémenter ceci, j'ai donné un tableau à la fonction handleReadyRead en paramètre. Cependant, il donne un code d'erreur.Appareil est ici:

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

Erreur:

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

line45:

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

Répondre

0

Vous ne pouvez pas passer la variable locale à la fente de cette façon , mais ce que vous essayez de faire ne l'exige même pas. Vous pouvez simplement stocker abc dans une variable membre du constructeur et l'utiliser dans l'emplacement. MAIS: vous devez le remplacer par une référence, sinon l'appel au constructeur copie le tableau, de sorte que l'original de votre fonction principale n'est pas affecté.

Vous pouvez également mettre en œuvre tout ce tableau comme une variable membre de votre SerialReader, et fournir une fonction de lecture, de sorte que la fonction main (ou celui qui est le consommateur des données) peuvent simplement tirer ces données de l'instance du lecteur.

+0

J'ai appliqué votre deuxième suggestion et cela a résolu mon problème. Cependant, je voudrais attendre la fonction principale après avoir appelé serialportreader jusqu'à l'obtention d'un message à cette communication. Parce que, j'ai besoin de ce tableau après ces opérations. Ainsi, j'ai un problème de synchronisation maintenant. –

+0

Comme vous utilisez Qt, la façon évidente serait d'émettre un signal dans le lecteur et de créer un slot si vous faites votre traitement –