阅读串口&单独保存值

时间:2017-04-05 10:20:04

标签: c++ qt

使用Arduino,我打印一个整数和一个浮动如下(我在循环中执行):

delay(500);
Serial.print(tempSensor);
delay(500);
Serial.print(LDRSensor);

另一方面,我使用Qt' QSerialPort'从串口读取,如下所示:

serial.setPortName("COM3");
serial.open(QIODevice::ReadWrite);
serial.setBaudRate(QSerialPort::Baud9600);
serial.setDataBits(QSerialPort::Data8);
serial.setParity(QSerialPort::NoParity);
serial.setStopBits(QSerialPort::OneStop);
serial.setFlowControl(QSerialPort::NoFlowControl);

while(!serial.isOpen()) serial.open(QIODevice::ReadWrite);

if (serial.isOpen() && serial.isWritable()){
QByteArray input, input1;

std::chrono::seconds interval(1);
for (int i = 0; i < 3; ++i){        \\Read from serial for 3 seconds
    serial.waitForBytesWritten(250);
    serial.waitForReadyRead(250);
    Sleep(490);
    input = serial.readAll();       \\First value
    }


    serial.waitForBytesWritten(250);
    serial.waitForReadyRead(250);
    Sleep(490);
    input1 = serial.readAll();      \\Second value
}

问题在于&#34;读者&#34;有时读取“临时传感器”&#39;首先,&#39; LDRSensor&#39;之后有时反之亦然。我可以设置QSerialPort&#39;总是首先接收tempSensor然后再接收LDRSensor以便我可以将它们分别保存在不同的数组中?

2 个答案:

答案 0 :(得分:2)

我会说得很简单。你可以尝试在发送方做这样的事情:

while (your condition)
{
    while (serial.canReadLine())
    {
        QString message = serial.readLine();
        message = message.trimmed();     //remove the end of line character
        QString strVal = message.mid(1); //remove the first character
        int value = strVal.toInt();      //convert to int

        if (message.startsWith("T"))
        {
            // Temp received
        }
        else if (message.startsWith("L"))
        {
            // LDR received
        }
    }
    Sleep(10);
}

在接收方:

{{1}}

但我肯定会建议你不要在一个循环中阅读,而是使用信号。

答案 1 :(得分:1)

我说你的主要问题是你没有在发送数据时澄清数据。我建议你将数据包装成一个带有标题和校验和的消息(虽然说实话,校验和并不是必需的)。

我建议发送(按此顺序):

  • 一个字节,用于指定消息的总大小(以字节为单位)
  • 一个字节,用于指定这是温度还是LDRSensor读数
  • 包含传感器值
  • 的int
  • 表示消息结束或校验和的字节。

如果你真的想保持简单,你可以放弃第一个和最后一个字节。消息大小可能总是5个字节,并且考虑到它的规律性和干扰的可能性很小,校验和不是必需的。

然后,您所要做的就是在消息到达时解释消息,您的程序将知道已到达的数据类型以及如何处理它。如果仅依靠计时,则总是存在不同步的风险。