2016-05-12 10 views
0

私はRPMカウンタをQtで作成していますが、arduinoはRPM値を得るために冷却ファンを使用しています。 私はarduinoから値を読み取るためにシリアルポートを使用していますが、Qt GUIで印刷する値の最後のバイトを紛失することがありますが、arduinoシリアルモニタで同じ問題はありません。ここではQtのコードは次のとおりです。例えばQtシリアルポートが最後のバイトを失うことがある

void ArduinoRpm::serialReciver() 
{ 

    QString input_converter; 
    std::string to_file_string; 

    int sizeFromInput = 0; 
    char *dataBuffer; 

    //get the port size depending on bytes available to read 
    int bufferSize = serial->bytesAvailable(); 
    //int bufferSize = serial->bytesAvailable(); 

    //dataBuffer, get the data from serial port, bufferSize + 1 for the newline 
    dataBuffer = new char[bufferSize + 2]; 

    //flush the port before read 


    //This function reads a line of ASCII characters from the device, up to a maximum of 
    //maxSize - 1 bytes, stores the characters in dataBuffer, and returns the number of bytes 
    //read. if a line could not be read but no error ocurred, this function returns 0. if an 
    //error occurs, this function returns the length of what could read or -1 if nothing was read. 
    //bufferSize is the maxsize readline can read. 

    sizeFromInput = serial->readLine(dataBuffer, bufferSize); 

    //to_file_string, to write data in file 
    to_file_string = dataBuffer; 
    input_converter = QString::fromStdString(to_file_string); 


    if ((sizeFromInput >= 1) && (input_converter.toInt() <= 9999)) { 
     if(input_converter.toInt() > 10) { 
      ui->lcdNumber->display(input_converter); 
      rpmNeedle->setCurrentValue(input_converter.toInt()); 
      input_file << to_file_string << std::endl; 
     } 

    } 

    delete dataBuffer; 
    bufferSize = 0; 
    serial->flush(); 

} 

void ArduinoRpm::SerialInitializer() 
{ 
    serial = new QSerialPort(this); 
    serial->setPortName(serialPortValue); //COM-port your Arduino is connected to 
    serial->open(QIODevice::ReadWrite); 
    serial->setBaudRate(QSerialPort::Baud9600); //must be the same as your arduino-baudrate 
    serial->setDataBits(QSerialPort::Data8); 
    serial->setParity(QSerialPort::NoParity); 
    serial->setStopBits(QSerialPort::OneStop); 
    serial->setFlowControl(QSerialPort::NoFlowControl); 
} 

27 
1621 
1621 
1627 
1627 
1627 
1627 
1627 
1627 
1627 
1627 
1627 
1627 
1627 
1627 
1627 
1621 
1616 
1616 
1605 
1605 
1599 
1594 
1588 
158 
1583 
158 
1578 
1578 
1572 
1572 
1572 

..このため 任意の解決策をそれが4桁のすべての時間をお読みください、時にはそれは、最後の桁をlosts?

+0

あなたの 'serialReciver'関数はどこですか? – Mike

+0

私はこのステートメントをメインのコンストラクターconnect(serial、SIGNAL(readyRead())、this、SLOT(serialReciver()))に入れます。 – pureofpure

+0

*常に4桁の数字を表示する*、最初の行にはなぜ2桁しか含まれないのですか? – Mike

答えて

0

あなたの関数は次のようなものでなければなりません:再び桁の4つの文字改行その後、その後、数字の4つの文字改行:この答えは入力は常にこのようになることが保証されていることを前提と

void ArduinoRpm::serialReciver() 
{ 
    char dataBuffer[6]; 

    if(!serial->canReadLine()) //if there isn't a whole line available 
     return; //return from this call (wait for the next readyRead() signal) 
    serial->readLine(dataBuffer, 6) 

    /* do whatever you want with dataBuffer here */ 

    if(serial->bytesAvailable() > 0) //if there are still unread bytes 
     QMetaObject::invokeMethod(this, "serialReciver", Qt::QueuedConnection); //call function again as if readyRead() signal was emitted 
} 

PS 、など。 。したがって、このパターンに従わないと、未定義の動作が発生します。

P.私はあなたのタイプミスをserialReciverに修正しませんでした。

+0

あなたのソリューションの仕事はかなりうまくいますが、4桁の数字の場合、1000 rpm以下で数えれば800-700私も改行を受けました。 – pureofpure

+0

は答えを編集しました.4桁以下のすべての値に対して現在作業しているはずです。 。 。 – Mike

+0

@RoStelは、4桁以上の数字で動作するために 'dataBuffer'を大きくして' readLine'への呼び出しを編集します。 。 。 – Mike

関連する問題