我的Qt应用程序没有收到arduino发送的所有数据

时间:2016-09-08 08:06:02

标签: arduino serial-port arduino-uno ccd

我会直截了当地说到这一点。我的arduino从adc端口读取值并通过串口发送它们(值从0到255)。我将它们保存在字节类型向量中。在向arduino发送特定信号后,它开始向Qt app发送保存在向量中的数据。一切正常,除了arduino应该发送800个值,应用程序接收的值少于此值。如果我将串行波特率设置为9600,我会得到220个值。相反,如果我将波特率设置为115200,我只得到20个值。你能帮助我解决这个问题吗?我想使用115200波特率,因为我需要在这个项目中获得良好的传输速度(实时线性CCD)。我将在下面留下一些代码:

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

2 个答案:

答案 0 :(得分:0)

好的......我在这里看到两个问题:

  1. Arduino方:您以十进制形式发送数据(因此x = 100将以3个字符发送 - 1,0和0.您的数据之间没有分隔符,所以你的接收者如何知道它收到的值100而不是三个值100?请参阅我的回答here以获取有关如何获得的进一步说明从Arduino发送ADC数据。
  2. QT方:当readyRead()信号被触发时,无法保证。它可能在第一个样本到达后立即生效,但在串口缓冲区内已有几个样本后可能会升高。如果发生这种情况,您的方法fillDataBuffer()可能会处理字符串12303402而不是四个单独的字符串12303402,因为两个缓冲区读取四个样本到达。波特率越大,读取之间的样本就会越多,这就是为什么用较大的波特率观察较少的值。
  3. 解决这两个问题的方法是为数据附加一些分隔字节,并在该分隔字节上将字符串拆分到缓冲区中。如果您不想拥有最大的数据吞吐量,则可以执行

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

    然后,将传入的字符串拆分为\n字符。

答案 1 :(得分:0)

非常感谢!我做了你对我的arduino程序所说的话,在解决之后,我仍然没有得到全部数据。所以问题出在Qt。你如何完美地解释,串行缓冲区累积的值太快,因此插槽函数“fillDataBuffer()”太慢而无法处理到达的数据。我简化了这个功能:

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

保存QByteArray缓冲区中的所有值后,我将单独处理数据。

再次感谢你。你的回答非常有用。