从串行读取并分别保存值
Reading from serial & saving values separately
使用 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 个字节,并且考虑到它的规律性和低干扰可能性,校验和实际上并不是必需的。
然后,您所要做的就是在消息到达时解释消息,您的程序将知道到达了哪种数据以及如何处理它。如果您仅依靠时间,则始终面临不同步的风险。
相关文章:
- 将内部带有矢量的结构保存/读取到二进制文件中
- 将结构向量保存到文件中,并从C++文件中读取结构向量
- 可视化C++从文件中保存/读取多个变量
- 从文本文件读取并保存到列表
- C++读取大文件并将其保存到字符串中,然后删除特定的随机单词
- 无法从Java读取C++中保存的Opencv Mat映像
- 如何将QGraphicsItem QList保存到文件中,然后读取它?Qt c++
- 从 JSON 读取和保存数据
- 如何从文件中读取 100x24 矩阵并将其作为浮点矩阵保存在内存中?
- 我们可以从 TXT 文件中读取数据并使用 C 和 C++ 将其保存到 SQL 数据库吗?
- C++两次从文件保存对象读取多重继承
- 无法读取保存的 TensorFlow 模型(无法查找标头条目)
- 如何使用 STL C++读取文件和保存连字符
- 在给定路径中读取保存的EVTX文件
- 从串行读取并分别保存值
- C++VTK从多个文件中读取和保存数据
- 从二进制文件中保存的 4 字节双精度读取 8 字节双精度
- C :如何从二进制文件中读取特定数量的字节并将其保存到UINT16_T
- 将结构保存在二进制文件中,仅在C 中读取值
- 如何在文件中保存/读取数据数组 (C++)