使用QSerialPort从Arduino打印到Qt的通信问题

时间:2015-04-03 18:58:46

标签: qt arduino microcontroller

我在通过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);

2 个答案:

答案 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;
}