使用arduino在QT上进行SerialCommunication解析失败

问题描述 投票:0回答:1

我正在开发一个带有增量编码器模块的arduino uno板,用于检测编码器生成的每个脉冲之间的移动方向和经过的时间,通过串行连接进行通信,并用逗号分隔两个值:一个处理方向的计数器int和一个time int,用于处理脉冲之间经过的时间

#include <SoftwareSerial.h>


unsigned long time;
unsigned long previousTime;
unsigned long elapsedTime;
int contador;
double aceleracion;


int ANTERIORclk;
int VALORclk;
int VALORdt;

//Locación de los pines
int clk=7;
int dt=4;



void setup() {
  pinMode(clk, INPUT);
  pinMode(dt, INPUT);
  ANTERIORclk=digitalRead(clk);
  previousTime= 0;
  contador = 0;

  Serial.begin(9600);
}

void loop() {

  time = millis();
  elapsedTime = time;

  VALORclk=digitalRead(clk);

  //Algoritmo de detección de movimiento
  if(VALORclk!=ANTERIORclk){

    //Si hay movimiento se realizan calculos
    VALORdt=digitalRead(dt);
    elapsedTime -= previousTime;

    if(VALORdt!=VALORclk){
    contador++; 

    }else {
      if (contador>0){
      contador--;
      }
    }

    //Imprimir resultados
    printResults();

    //Se actualizan las lecturas
    ANTERIORclk=VALORclk;  
    previousTime= time;
    delayMicroseconds(.01);
  }//Fin de if y de algoritmo de detección de movimiento
}

  void printResults(){

    Serial.print(contador);
    Serial.print(",\n");
    Serial.print(elapsedTime);
    Serial.print(",\n\n");

  }

然后在qt中跟随QT的一个QSerialPort教程我在这里有一个QtWidgets项目:https://github.com/PaulMaxAvalosAguilar/Encoder像往常一样有一个MainWindow和串行连接它依赖于Connection / SerialConnectionn类,它在其构造函数中连接到readyRead信号到下一个功能:

void SerialConnection::receiveDeviceInfo()
{
    QStringList bufferSplit;

    //serial is of type QSerialPort 
    QByteArray data  = serial->readAll();
    QString parsedDATA;
    double counter = 0;
    double time = 0;

   //serialbuffer is of type QString
    serialbuffer += QString::fromStdString(data.toStdString());
    bufferSplit = serialbuffer.split(",");

    if(!(bufferSplit.length()<3))
    {
        serialbuffer="";

        parsedDATA= bufferSplit.at(0);
        counter = parsedDATA.toDouble();
        parsedDATA= bufferSplit.at(1);
        time = parsedDATA.toDouble();
        qDebug()<<counter<<" -- "<<time<<" "<<bufferSplit.at(2);
    }
}

正如您所看到的那样,函数打算用逗号分隔值,这样我就可以将它分配给两个变量,这些变量稍后可以在GUI上显示....然而,问题是它一切正常,可以打印值但通常当我快速移动编码器时,某些数据无法正确显示,例如:

QApplication: invalid style override passed, ignoring it.
New static SerialConnection Object created
connect() method called
Serial port Opened.... "ttyACM0"
1 -- 342 "\n\n"
2 -- 294 "\n\n"
3 -- 149 ""
4 -- 132 "\n\n"
5 -- 84 "\n\n"
6 -- 78 "\n\n"
7 -- 125 "\n\n"
6 -- 139 "\n\n"
7 -- 1945 "\n\n"
8 -- 89 "\n\n"
9 -- 43 ""
10 -- 32 "\n\n"
11 -- 25 "\n\n"
12 -- 17 "\n"
13 -- 15 "\n\n"
14 -- 990 ""
15 -- 6 "\n\n1"
6 -- 7 "\n\n1"
7 -- 5 "\n\n1"
8 -- 7 "\n\n1"
9 -- 4 "\n\n2"
0 -- 4 "\n\n2"
1 -- 3 "\n\n2"
2 -- 2 "\n\n"
23 -- 2 "\n\n"
24 -- 4 "\n\n"
25 -- 6 "\n\n"
26 -- 7 "\n\n"
27 -- 6 "\n\n"
28 -- 7 "\n\n"
29 -- 4 "\n\n"
30 -- 5 "\n"
31 -- 2 "\n"
30 -- 3 "\n"
31 -- 9 "\n"
30 -- 7 "\n"
31 -- 487 "\n\n"
32 -- 16 "\n\n"
33 -- 13 "\n\n"
34 -- 12 "\n\n3"
5 -- 5 "\n\n3"
4 -- 1 "\n\n3"
5 -- 0 "\n\n3"
6 -- 1 "\n\n"
35 -- 0 "\n\n"
36 -- 1 "\n\n"
37 -- 2 "\n\n"
38 -- 1 "\n\n"
37 -- 0 "\n\n"
38 -- 7 "\n\n"
39 -- 10 "\n"
40 -- 8 ""
41 -- 8 ""
42 -- 456 "\n"
43 -- 7 "\n"
44 -- 4 "\n"
45 -- 4 ""
46 -- 3 ""
47 -- 2 ""
48 -- 2 ""
49 -- 2 ""
50 -- 2 ""
51 -- 2 ""
52 -- 2 ""
53 -- 3 "\n\n5"
4 -- 3 "\n\n5"
5 -- 7 "\n\n5"
6 -- 9 "\n\n5"
7 -- 8 "\n\n5"
8 -- 9 "\n\n5"
9 -- 12 "\n\n"
60 -- 3330 ""
Serial Connection Deleted

您可以看到每当我将编码器“移动太快”时,一些数字会传递到列表中的[2]元素,因此下一个计数器显示不正确,因为它的最后一个数字移动到列表的[2]元素中。

奇怪的是,当使用QT QPlainTextEdit示例时,这种情况永远不会发生,无论移动编码器的速度如何,总是显示一切正常。

希望有人能帮助我

c++ qt arduino
1个回答
1
投票

问题出现在串口缓冲区中,因此在调用最后一个函数时不会释放缓冲区 - Serial.print(“,\ n \ n”); - 但是当它已满时,使用readyRead()释放部分消息,并将一些数字移动到下一个缓冲区。 处理此问题的最简单方法是使用一个函数调用打印整个消息 -

Serial.print(String(QString(contador) + ",\n " + String(elapsedTime) + ",\n\n"));

或者将readRead上的数据收集到某个QByteArray类memeber中,因此它在全局范围内可用,后者重组它。这是我刚刚描述的实现 - https://github.com/IndeemaSoftware/IoT-temperature-with-Predix-and-Qt(根目录中的处理程序类) 希望你觉得我的答案很有用

© www.soinside.com 2019 - 2024. All rights reserved.