使用 QSerialPort 从 Arduino 打印到 Qt 的通信问题
Communication issue printing from Arduino to Qt using QSerialPort
我在通过 QSerialPort 从 arduino 与我的 Qt 应用程序通信时遇到问题。我有一个监听信号,告诉我何时可以从 arduino 读取数据。我期望步进电机在到达限位开关之前所执行的步数的值,因此只有一个简单的整数,例如“2005”。当数据可供读取时,有时我会得到两个单独的读数,分别为“200”和“5”。显然,当我解析数据时,这会把事情搞砸,因为它将它记录为两个数字,都比预期的数字小得多。
如果不放入睡眠或 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);
可以加换行同步。
示例 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。
感谢您对 Arpegius 的帮助。 println() 函数绝对是用于换行符的不错选择。在 link 之后,我能够获得一个监听函数,该函数将 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;
}
我在通过 QSerialPort 从 arduino 与我的 Qt 应用程序通信时遇到问题。我有一个监听信号,告诉我何时可以从 arduino 读取数据。我期望步进电机在到达限位开关之前所执行的步数的值,因此只有一个简单的整数,例如“2005”。当数据可供读取时,有时我会得到两个单独的读数,分别为“200”和“5”。显然,当我解析数据时,这会把事情搞砸,因为它将它记录为两个数字,都比预期的数字小得多。
如果不放入睡眠或 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);
可以加换行同步。
示例 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。
感谢您对 Arpegius 的帮助。 println() 函数绝对是用于换行符的不错选择。在 link 之后,我能够获得一个监听函数,该函数将 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;
}