1

私はポイントに右に行きます。私のarduinoはadcポートから値を読み取り、シリアルポート(0から255までの値)を介して送信します。それらをバイト型のベクトルに保存します。特定のシグナルをarduinoに送信した後、ベクターに保存されたデータをQtアプリに送信し始めます。arduino が 800 の値を送信し、アプリがそれよりも少ない値を受け取ることを除いて、すべてが機能しています。シリアル ボー レートを 9600 に設定すると、220 の値が得られます。代わりに、ボー レートを 115200 に設定すると、20 個の値しか得られません。これを修正するのを手伝ってもらえますか?このプロジェクト (リアルタイム リニア CCD) では十分な転送速度が必要なので、115200 ボー レートを使用したいと考えています。以下にいくつかのコードを残します。

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

ありがとうございます。あまり明確でない場合は申し訳ありませんが、疲れ果てた一日でした:P

4

2 に答える 2

0

わかりました... ここに 2 つの問題があります。

  1. Arduino側:データを10進数形式で送信します(したがって、1、0、0のx = 1003文字として送信されます。データ間に区切り文字がないため、受信者は3つの値で100はなく値を受け取ったことをどのように知ることができますか?Arduino から ADC データを送信する方法の詳細については、こちらの回答を参照してください。100
  2. QT 側readyRead():信号がトリガーされる瞬間の保証はありません。最初のサンプルが到着した直後かもしれませんが、シリアル ポート バッファ内に既にいくつかのサンプルがある場合に発生する可能性があります。その場合、2 つのバッファ読み取りの間に 4 つのサンプルが到着するため、メソッドは、4 つの個別の文字列、、およびではなく、fillDataBuffer()文字列を処理する可能性があります。ボーレートが大きいほど、読み取り間に到着するサンプルが多くなるため、ボーレートが大きいほど値が少なくなります。1230340212303402

両方の問題の解決策は、データに区切りバイトを追加し、その区切りバイトでバッファー内の文字列を分割することです。最大のデータ スループットが必要ない場合は、次のようにします。

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

次に、着信文字列を文字で分割し\nます。

于 2016-09-08T10:19:30.717 に答える