2016-09-08 52 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缓冲区后,我分别处理数据。

再次感谢的人。你的回答非常有帮助。

相关问题