2016-04-13 19 views
0

QSerialPortを使用して、デバイスから送信されたデータを読み取る必要があります。デバイスは毎回4000データバイトのフレームを送信します。私は次の単純なコードで試してみますQSerialPortは512バイト以上のデータを読み取ることができますか?

QSerialPort *serialPort; 
char receivedData[4000]; 
int numRead = 0; 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 

    /* Initialize serial port*/ 
    serialPort = new QSerialPort(this); 
    QString portName = "COM6"; 
    qint32 baudRate = 460800; 
    serialPort->setPortName(portName); 
    serialPort->setBaudRate(baudRate); 
    serialPort->setDataBits(QSerialPort::Data8); 
    serialPort->setParity(QSerialPort::NoParity); 
    serialPort->setStopBits(QSerialPort::OneStop); 
    serialPort->setFlowControl(QSerialPort::NoFlowControl); 
    serialPort->setReadBufferSize(4000); 
    if (!serialPort->open(QIODevice::ReadOnly)) { 
     qDebug() << "Cannot open comport"; 
    } 
    connect(serialPort, SIGNAL(readyRead()), this, SLOT(serialReceived())); 
} 

void MainWindow::serialReceived() 
{ 
    numRead = serialPort->read(receivedData, 4000); 
    serialPort->flush(); 
} 

問題は、常に512バイトしか読み込まれないことを示しています。 4000バイトのデータフレーム全体をどのように読み取ることができますか? (私はこの4000バイトのフレームを読むためにMatlabを使用していますが、正常に動作しています)

+1

[回答](http://stackoverflow.com/a/29151336/2257050)を参照してください。あなたは、あなたが期待している特定のサイズが満たされるまで、データを読む独自のバッファを作成しなければなりません。 [QSerialPort :: bytesAvailable'](http://doc.qt.io/qt-5/qserialport.html#bytesAvailable)メソッドを使用して、使用可能なバイト数を確認することもできます。 – thuga

+0

こんにちは、私は 'QSerialPort :: bytesAvailable'をチェックするためにループを使い、それは常に512バイトを示します。 – bienle

+0

チェックの間にデータを読んでいますか? – thuga

答えて

1

すべてのデータを必ずしも1つのチャンクで受信する必要はありません。 待機しているバイト数(またはタイムアウト)があるまで、リスニングを継続する必要があります。

void MainWindow::serialReceived() 
{ 
    receivedData.append(serialPort->readAll()); 
    if(receivedData.size() >= 4000) { 
     // we're full 
    } 
} 
1

それは使用してデータを発する以外あなたは、一般的に(あなたがそれをすべて取得確保するために)、ループ内のデータを読み出す必要があり、ここでは、これはあなたのserialReceived()関数と同じですサンプルコードのスニペットです聴いている人は誰でも...

void QSerialPortReader::handleReadyRead() 
{ 
    QByteArray newData; 

    // Get the data 
    while (mp_serialPort->bytesAvailable()) 
    { 
     newData.append(mp_serialPort->readAll()); 
    } 
    emit rxDataReady(newData); 
} 

編集

からemit rxDataReady(newData);私は任意の最大サイズのチェックを行いませんが...しかし、あなたがそれを必要とする場合には、追加するのは簡単である(つまりはただの読み取りを使用(...、spaceAvail)の代わりにreadAその後、スペースを減らします。

+0

こんにちは、私は次のコードを試してみましたが、それは読み込まれている60bytesになりました。なぜ私は理解できないのですか?
'ボイドメインウィンドウ:: serialReceived()
{
一方(serialPort-> bytesAvailableプロパティ())
{
readData.append(serialPort-> READALL());
}
}
bienle

+1

利用可能なバイト数が60バイトを超えていますか? (おそらくデバッグ行を追加する)。また、readReadyは一度以上呼び出されていますか?もう1つのことを確認してください。問題であれば100%ではありませんが、同じスレッドですべてを実行しているようです。 connect()関数(オプションの5番目のパラメータ)で 'Qt :: QueuedConnection'を使う方が安全かもしれません。私のコードでは、最初のreadReadyが完了する前に2番目のreadReadyが来たらどうなるのか分かりません。 –

関連する問題