使用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以便我可以将它们分别保存在不同的数组中?
答案 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)
我说你的主要问题是你没有在发送数据时澄清数据。我建议你将数据包装成一个带有标题和校验和的消息(虽然说实话,校验和并不是必需的)。
我建议发送(按此顺序):
如果你真的想保持简单,你可以放弃第一个和最后一个字节。消息大小可能总是5个字节,并且考虑到它的规律性和干扰的可能性很小,校验和不是必需的。
然后,您所要做的就是在消息到达时解释消息,您的程序将知道已到达的数据类型以及如何处理它。如果仅依靠计时,则总是存在不同步的风险。