2016-09-08 12 views
1

私はその時点まで行くでしょう。 arduinoはADCポートから値を読み取り、シリアルポート(0〜255の値)で値を送信します。私はバイト型ベクトルでそれらを保存します。 Arduinoに特定の信号を送信した後、ベクトルに保存されたデータをQt appに送信し始めます。 Arduinoが800の値を送信し、アプリがそれよりも少ない値を受け取ることを除いて、すべてが機能しています。シリアルボーレートを9600に設定すると、220の値が得られます。代わりに、ボーレートを115200に設定した場合、私は20個の値しか得られません。この問題を解決する手助けをしてくれますか?私はこのプロジェクト(リアルタイムのリニアCCD)で良いtrasmision速度が必要なので、私は115200のボーレートを使用したいと思います。私は以下のいくつかのコードを残しておきます:私のQtアプリはarduinoによって送信されたすべてのデータを受信しません

Arduinoのコード:

void sendData(void) 
{ 
    int x; 

    for (x = 0; x < 800; ++x) 
    { 
     Serial.print(buffer[x]); 
    } 
} 

これは値を送信する機能です。私は十分な情報だと思いますので、私はそれを要約しました。より多くのコードが必要な場合は、私にお知らせください。

Qtのシリアルポートの設定コード:

...

// QDialog windows private variables and constants 
QSerialPort serial; 
QSerialPortInfo serialInfo; 
QList<QSerialPortInfo> listaPuertos; 
bool estadoPuerto; 
bool dataAvailable; 

const QSerialPort::BaudRate BAUDRATE = QSerialPort::Baud9600; 
const QSerialPort::DataBits DATABITS = QSerialPort::Data8; 
const QSerialPort::Parity PARITY = QSerialPort::NoParity; 
const QSerialPort::StopBits STOPBITS = QSerialPort::OneStop; 
const QSerialPort::FlowControl FLOWCONTROL = QSerialPort::NoFlowControl; 

const int pixels = 800; 
QVector<double> data; 
unsigned int dataIndex; 
QByteArray values; 
double maximo; 

...

// Signal and slot connection. 
QObject::connect(&serial, SIGNAL(readyRead()), this,SLOT(fillDataBuffer())); 

...

// Method called when there's data available to read at the serial port. 

void Ventana::fillDataBuffer() 
{ 
    dataIndex++; 
    data.append(QString::fromStdString(serial.readAll().toStdString()).toDouble()); 
    if(data.at(dataIndex-1) > maximo) maximo = data.at(dataIndex-1); 

    /* The following qDebug is the one I use to test the recieved values, 
    * where I check that values. */ 

    qDebug() << data.at(dataIndex-1); 
} 

おかげで、申し訳ありません、それはない場合とても明確で、疲れていました。 Y:P

+0

コードはどのようにしてアナログ/デジタル変換器からデータを読み込みますか?おそらくそれはあなたが思っているように速く読むことができません.... – wallyk

+0

私はADCからすべての値を読んで、ベクトルに保存し、ベクトルトラフのシリアルポートを送信します。それは独立しているので、adcを読むことについては問題ではありません。 –

答えて

0

[OK]を...私はここ2 probelmsを参照してください。

  1. のArduino側:あなたは、小数点形式でデータを送信する(そうx = 100が3つの文字として送信されます - 1、0とあなたのデータの間に区切り記号がないので、受信者が値100を受け取ったことをどのように知るかは、1,00の3つの値ではありませんか? ArduinoからADCデータを送信する方法の詳細については、私の答えhereをご覧ください。
  2. QT側readyRead()信号がトリガーされる瞬間の保証はありません。それは最初のサンプルが到着した直後かもしれませんが、シリアルポートバッファの中にサンプルのカップルがすでに存在する場合には上げられます。この場合、fillDataBuffer()メソッドは、2つのバッファ読取りの間に4つのサンプルが到着したため、123,0340および2の4つの別々のストリングの代わりに12303402というストリングを処理する可能性があります。ボーレイトが大きければ大きいほど、読みの間にサンプルが多く届きます。なぜなら、より大きなボーレートでより少ない値を観測するからです。

解決策は、データの区切り文字をいくつか追加し、その区切り文字列のバッファに文字列を分割することです。あなたが最大のデータスループットを持ってしたくない場合は、あなただけの

Serial.print(buffer[x]); 
Serial.print('\n'); 

を行うことができ、その後、\n文字の上に入ってくる文字列を分割しました。

0

ありがとうございました!私はarduinoプログラムについてあなたが言ったことをして、それを解決しても、私はまだ全データ量を得ていませんでした。だから問題はQtにあった。あなたが完全に説明すると、シリアルバッファは値をあまりにも累積していたので、スロット関数 "fillDataBuffer()"は到着するデータを処理するには遅すぎました。私はその機能を簡素化:

void Ventana::fillDataBuffer() 
{ 
    dataIndex++; 
    buffer.append(serial.readAll()); 
} 

QByteArrayバッファ内のすべての値を保存した後、私は別にデータを処理します。

ありがとうございました。あなたの答えは本当に役に立ちました。

関連する問題