2016-09-08 13 views
1

바로 그 지점으로갑니다. 내 arduino는 ADC 포트에서 값을 읽고 직렬 포트 (0에서 255 사이의 값)를 통해 값을 보냅니다. 바이트 형식 벡터로 저장합니다. Arduino에 특정 신호를 보내면 벡터에 저장된 데이터를 Qt 앱에 보내기 시작합니다. arduino가 800 개의 값을 보내야하고 앱이 그보다 적은 값을 받는다는 것만 제외하면 모든 것이 작동합니다. 직렬 보오율을 9600으로 설정하면 220 값을 얻습니다. 대신 보오율을 115200으로 설정하면 20 개의 값만 얻습니다. 이 문제를 해결하도록 도와 줄 수 있습니까? 이 프로젝트 (실시간 선형 CCD)에서 좋은 전송 속도가 필요하기 때문에 나는 115200 전송 속도를 사용하고 싶습니다.내 Qt 앱이 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

좋아요 ... 내가 여기에 두 probelms를 참조하십시오

  1. 아두 이노 측면 : 10 진수 형태로 데이터를 전송 (그래서 x = 100 3 개 문자로 전송됩니다 - 1, 0 0 사이에 구분 기호가 없으므로 수신자가 값 100을 수신 한 것을 알게되는 방법은 1, 00이 아닙니다. Arduino에서 ADC 데이터를 보내는 방법에 대한 자세한 설명은 내 대답 here을 참조하십시오.
  2. QT면 : readyRead() 신호가 트리거되는 순간에는 보장 할 수 없습니다. 첫 번째 샘플이 도착한 직후 일지 모르지만, 직렬 포트 버퍼 안에 이미 몇 개의 샘플이있는 경우 제기 될 수 있습니다. 이 경우 fillDataBuffer() 메서드는 네 개의 별도 문자열 인 123, 0, 3402 대신 12303402 문자열을 처리 할 수 ​​있습니다. 두 버퍼 읽기 사이에 네 개의 샘플이 도착했기 때문입니다. 보 속도가 클수록 더 많은 샘플이 판독 사이에 도착하므로 더 큰 보오율로 더 적은 값을 관찰하게됩니다.

해결 방법은 두 가지 구분 바이트를 데이터에 추가하고 해당 구분 바이트의 버퍼에서 문자열을 분할하는 것입니다. 당신은 최대 데이터 처리량을하지 않으려면, 당신은 단지

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

을 할 수있는 다음, \n 문자에 들어오는 문자열을 분할합니다.

0

대단히 감사합니다. 나는 당신이 내 arduino 프로그램에 대해 말한 것과 그 문제를 해결 한 후에도 여전히 전체 데이터 량을 얻지 못했습니다.그래서 문제는 Qt에있었습니다. 어떻게 완벽하게 설명, 직렬 버퍼가 너무 빨리, 그래서 슬롯 기능 "fillDataBuffer()"너무 느린 도착 데이터를 처리하는 값을 축적했다.

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

QByteArray 버퍼의 모든 값을 저장 한 후, I는 별도로 데이터를 처리 : I는 해당 기능을 단순화.

다시 한 번 감사합니다. 당신의 대답은 정말 도움이되었습니다.