2016-09-08 6 views
1

Я пойду прямо к делу. Мой arduino считывает значения из порта adc и отправляет их через последовательный порт (значения от 0 до 255). Я сохраняю их в виде байтового типа. После отправки определенного сигнала в arduino, он начинает отправлять в приложение Qt данные, сохраненные в векторе. Все работает, за исключением того, что arduino должен отправить 800 значений, и приложение получает меньше значений, чем это. Если я установил скорость последовательного бод до 9600, я получаю 220 значений. Если вместо этого я установил скорость передачи до 115200, я получаю только 20 значений. Можете ли вы, ребята, помочь мне исправить это? Я хотел бы использовать скорость 115200 бод, потому что мне нужен хороший трассировка скорости в этом проекте (линейная CCD в реальном времени). Я оставлю код ниже:My Qt app не получает все данные, отправленные 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); 
} 

Спасибо и извините, если это не так ясно, что это изнурительное у: P

+0

Как код считывает данные из аналого-цифрового преобразователя? Возможно, он не может читать его так быстро, как вы думаете .... – wallyk

+0

Я прочитал все значения из АЦП, сохранил их в векторе, а затем передал векторный последовательный порт. Не должно быть проблемы с чтением adc, поскольку он независим. –

ответ

0

Хорошо ... Я вижу два probelms здесь:

  1. Arduino сторона: вы отправляете свои данные в десятичной форме (так x = 100 будут посланы как 3-х символов - 1, 0 и 0. У вас нет разделителя между вашими данными, так как ваш получатель узнает, что он получил значение 100, а не три значения 1, 0 и 0? Пожалуйста, см. Мой ответ here для дальнейшего объяснения того, как отправлять данные АЦП из Arduino.
  2. Сторона QT: На данный момент нет гарантии, что сигнал будет вызываться readyRead(). Это может быть сразу после поступления первого образца, но оно может быть поднято после того, как в буфере последовательного порта уже есть несколько выборок. Если это произойдет, ваш метод fillDataBuffer() может обрабатывать строку 12303402 вместо четырех отдельных строк 123, 0, 340 и 2, потому что между двумя буферами считываются четыре образца. Чем больше скорость передачи данных, тем больше образцов будет поступать между чтениями, поэтому вы наблюдаете меньшие значения с большей скоростью передачи в бодах.

Решение обеих проблем заключается в том, чтобы добавить некоторый байт с разделителями для ваших данных и разделить строку в буфере на этом разделительном байте. Если вы не хотите, чтобы иметь максимальную скорость передачи данных, вы можете просто сделать

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

, а затем разделить входящую строку на \n характере.

0

спасибо! Я сделал то, что вы сказали о моей программе arduino, и, решив это, я все еще не получал весь объем данных.Таким образом, проблема была в Qt. Как вы прекрасно объяснили, последовательный буфер накапливал значения слишком быстро, поэтому функция слота «fillDataBuffer()» была слишком медленной для обработки поступающих данных. Я упростил эту функцию:

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

После сохранения всех значений в буфере QByteArray, я обрабатывать данные отдельно.

Еще раз спасибо. Ваш ответ был действительно полезен.

 Смежные вопросы

  • Нет связанных вопросов^_^