2016-09-08 85 views
1

我會馬上進入正題。我的arduino從adc端口讀取值並通過串口發送(值從0到255)。我將它們保存在一個字節類型的向量中。在向arduino發送特定信號之後,它開始向Qt應用程序發送保存在向量中的數據。除了arduino應該發送800個值並且應用程序接收的值比這個值更小之外,一切都在工作。如果我將串行波特率設置爲9600,則可以獲得220個值。相反,如果我將波特率設置爲115200,則只能獲得20個值。你們能幫我解決這個問題嗎?我想使用115200波特率,因爲在這個項目中我需要一個很好的跟蹤速度(實時線性CCD)。我將在下面留下一些代碼:我的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); 
} 

感謝和抱歉,如果它不如此清楚,這一直是一個令人精疲力盡的da Ÿ:P

+0

代碼如何讀取模數轉換器的數據?也許它不能像你想象的那樣快速讀取它...... – wallyk

+0

我讀取de ADC的所有值,將它們保存在一個向量中,然後通過串口傳輸向量。閱讀adc應該不是問題,因爲它是獨立的。 –

回答

0

好吧...我看到這裏有兩個probelms:

  1. Arduino的側:你在一個十進制形式發送數據(所以x = 100將發送3個字符 - 1,0, 0.您的數據之間沒有分隔符,因此您的接收器將如何知道它收到的值不是三個值100的值100?有關如何從Arduino發送ADC數據的進一步說明,請參閱我的回答here
  2. QT端readyRead()信號將被觸發的時刻不能保證。它可能在第一個採樣到達之後立即發生,但是在串行端口緩衝區內已經有幾個採樣之後它可能會上升。如果發生這種情況,您的方法fillDataBuffer()可能會處理字符串12303402而不是四個單獨的字符串123,0,3402,因爲在兩個緩衝區讀取之間有四個樣本到達。波特率越大,讀取之間的樣本就越多,這就是爲什麼用更大的波特率觀察到更少的值。

解決您的兩個問題的方法是爲您的數據添加一些分隔字節,然後將字符串分隔到該分隔字節的緩衝區中。如果你不希望有最大的數據吞吐量,你可以做

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

,然後,在\n性格分裂傳入字符串。

0

非常感謝!我做了你對我的arduino程序的評論,解決之後,我仍然沒有得到全部數據。所以問題出在Qt中。如何完美地解釋,串行緩衝區正在累積太快的值,所以插槽函數「fillDataBuffer()」太慢而無法處理到達的數據。我簡化了該功能:

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

將所有值保存在QByteArray緩衝區後,我分別處理數據。

再次感謝的人。你的回答非常有幫助。

相關問題