1

我会直奔主题。我的 arduino 从 adc 端口读取值并通过串行端口发送它们(值从 0 到 255)。我将它们保存在字节类型向量中。在向 arduino 发送特定信号后,它开始向 Qt 应用程序发送保存在向量中的数据。一切正常,除了 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

4

2 回答 2

0

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

  1. Arduino方面:您以十进制形式发送数据(因此x = 100将作为3个字符发送 - 1、0和0。您的数据之间没有分隔符,所以您的接收器如何知道它收到的值100不是三个值10并且0?请在此处查看我的答案,以进一步解释如何从 Arduino 发送 ADC 数据。
  2. QT 方面readyRead():无法保证触发信号的时刻。它可能在第一个样本到达后立即出现,但在串行端口缓冲区内已经有几个样本后可能会被提升。如果发生这种情况,您的方法fillDataBuffer()可能会处理 string12303402而不是四个单独的 strings 123、和0,因为在两个缓冲区读取之间有四个样本到达。波特率越大,读取之间到达的样本就越多,这就是为什么您观察到的值越少,波特率越大。3402

这两个问题的解决方案是为您的数据附加一些定界字节,并在该定界字节上拆分缓冲区中的字符串。如果您不想获得最大的数据吞吐量,您可以这样做

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

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

于 2016-09-08T10:19:30.717 回答
0

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

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

将所有值保存在 QByteArray 缓冲区中后,我分别处理数据。

再次感谢伙计。你的回答真的很有帮助。

于 2016-09-08T22:35:41.077 回答