我在通过QSerialPort从arduino到我的Qt应用程序进行通信时遇到问题。我有一个监听信号告诉我何时有数据可以从arduino中读取。我期望步进电机在达到限位开关之前所采取的步数值,因此只需要一个简单的整数,例如“2005”。当数据可供读取时,有时我会得到两个单独的读数,分别为“200”和“5”。显然,当我解析数据时,这会使事情变得混乱,因为它将它记录为两个数字,两者都比预期的数字小得多。
如果我没有安装Sleep或QTimer以便让数据从arduino中获得更多时间,我该如何解决这个问题呢?注意:我的程序不是多线程的。
示例Qt代码:
//Get the data from serial, and let MainWindow know it's ready to be collected.
QByteArray direct = arduino->readAll();
data = QString(direct);
emit dataReady();
return 0;
Arduino的:
int count = 2005;
Serial.print(count);
答案 0 :(得分:0)
您可以添加换行符以进行同步。
示例Qt代码:
//Get the data from serial, and let MainWindow know it's ready to be collected.
QByteArray direct = arduino->readLine();
data = QString(direct);
emit dataReady();
return 0;
Arduino的:
int count = 2005;
Serial.print(count);
Serial.println();
如果您要使用QSerialPort::readyRead
信号,则还需要使用QSerialPort::canReadLine
功能,请参阅this。
答案 1 :(得分:0)
感谢你的帮助Arpegius。 println()函数绝对是用于换行符分隔符的不错选择。在这个链接之后,我能够获得一个监听功能,将arduino发送的所有内容都作为单独的字符串发送。循环中的额外if语句处理传入字符串不包含换行符的任何情况(我是偏执狂:D)
我的代码适用于将来遇到同样问题的任何人。
int control::read()
{
QString characters;
//Get the data from serial, and let MainWindow know it's ready to be collected.
while(arduino->canReadLine())
{
//String for data to go.
bool parsedCorrectly = 0;
//characters = "";
//Loop until we find the newline delimiter.
do
{
//Get the line.
QByteArray direct = arduino->readLine();//Line();
//If we have found a new line character in any line, complete the parse.
if(QString(direct).contains('\n'))
{
if(QString(direct) != "\n")
{
characters += QString(direct);
characters.remove(QRegExp("[\\n\\t\\r]"));
parsedCorrectly = 1;
}
}
//If we don't find the newline straight away, add the string we got to the characters QString and keep going.
else
characters += QString(direct);
}while(!parsedCorrectly);
//Save characters to data and emit signal to collect it.
data = characters;
emit dataReady();
//Reset characters!
characters = "";
}
return 0;
}