使用 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;

A​​rduino:

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