2016-07-03 13 views
1

私はシリアルデバイスで作業しています。 QSerialPortは別のスレッドにあります。 スレッドは、このように作成されます。QSerialPort - 送信者からのデータ全体の払い戻し

QThread* serialthread = new QThread; 
Serial* serial = new Serial(); 
serial->moveToThread(serialthread); 

データはemitedされ、私のスレッドワーカーで、この信号を利用可能である

:これは、データが正しい場合は、データとチェックを読み込む機能が

void Serial::process() 
    { 
     serialport = new QSerialPort(); 
     connect(this->serialport,SIGNAL(readyRead()),this,SLOT(readyToRead())); 
    } 
    void Serial::readyToRead() 
    { 
     emit SIG_dataAvailable(this->read()); 
    } 

です - 私のシリアルデバイス上の2番目のバイトは私の問題は、信号QSerialPort :: readyReadがダ前emitedされていることである

QByteArray Serial::read() const 
{ 
    QByteArray receivedData; 
    int length; 
    receivedData = serialport->readAll(); 
    length = receivedData[1]; 
    if(length != receivedData.length() - 1) 
    { 
     qDebug() << "protocol error."; 
     return NULL; 
    } 
    return receivedData; 
} 

...パケットの残りの部分がどのように長いと言いますtaがバッファ内で完結していることを確認します。任意のアイデアはどのようにこの問題を解決するには?

答えて

3

ありがとうございました。は、一度にすべてのデータを取得することを保証しています。この問題はいくつかの点で解決できます。あなたのパッケージサイズは変更になる場合があります場合は

void foo::onSerialRead() 
{ 
    //! Is there whole datagram appears? 
    if (m_serial->bytesAvailable() < ::package_size) { 
     //! If not, waiting for other bytes 
     return; 
    } 

    //! Read fixed size datagram. 
    QByteArray package = m_serial->read(::package_size); 
    //! And notify about it. 
    emit packageReady(package); 
} 

2):あなたはこのような何かを行うことができますサイズパッケージを固定している場合は

1)。次に、あなたのパッケージに「ハザー」を含める必要があります。このヘッダーには、少なくとも「開始」バイトとデータサイズ(ケースの2番目のバイト)が含まれている必要があります。ヘッダーは固定サイズです。次に、このようなことをすることができます:

そして、あなたのQSerialを別のスレッドに入れても意味がありません。

UPD:あなたは私のGitHub https://github.com/YouDoItWrong/AltimeterTool(。それはRS-232を介して働いているunderwoterソナー、のための小さなテスト・ユーティリティです)

+0

でいくつかのより複雑な例を見ることができる私はdifferntスレッド内メートルQserialを置くので、私車のECUをリアルタイムで監視したい私はメインウィンドウのプロセスでそれを試しましたが、guiは非常に遅いです –

+1

私は、 "ブロック"(非同期)マナーでQSerialPortを使用しているため、フリーズしていると思います。そのため、http://code.qt.io/cgit/qt/qtserialport.git/tree/src/serialport/qserialport.cpp#n201がフリーズしています – YouDoItWrong

関連する問題