从串行读取并分别保存值

Reading from serial & saving values separately

本文关键字:保存 读取      更新时间:2023-10-16

使用 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
}

问题在于,"读者"有时先读取"tempSensor",然后再读取"LDRSensor",有时反之亦然。我可以将"QSerialPort"设置为始终先接收温度传感器,然后再接收LDRSensor,以便我可以将它们分别保存在不同的阵列中吗?

我会让它变得非常简单。您可以尝试在发送端执行以下操作:

Serial.print('T');        //start of the temperature message
Serial.print(tempSensor); //temp value
Serial.print('n');       //end of line
Serial.print('L');        //start of the LDR message
Serial.print(LDRSensor);  //LDR value
Serial.print('n');       //end of line
delay(1000);

在接收方:

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);
}

但我绝对建议您不要在一个周期中阅读,而是使用信号。

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

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

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

如果你真的想让事情变得简单,你可以放弃第一个和最后一个字节。消息大小可能始终为 5 个字节,并且考虑到它的规律性和低干扰可能性,校验和实际上并不是必需的。

然后,您所要做的就是在消息到达时解释消息,您的程序将知道到达了哪种数据以及如何处理它。如果您仅依靠时间,则始终面临不同步的风险。