c++ - 使用 arduino 的 QT 上的 SerialCommunication 解析失败

标签 c++ qt arduino

我正在使用带有增量编码器模块的 arduino uno 开发板,我用它来检测运动方向和编码器生成的每个脉冲之间耗时,编码器通过串行连接进行通信并用逗号分隔两个值:一个计数器 int 处理方向和处理脉冲之间耗时的时间 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,它像往常一样有一个主窗口,对于串行连接,它依赖于 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 示例时,这永远不会发生,无论我移动编码器的速度有多快,它总是显示一切正常。

希望有人能帮助我

最佳答案

问题出在串行端口缓冲区中,因此当您调用最后一个函数时缓冲区不会被释放 - Serial.print(",\n\n"); - 但当它已满时,部分消息会随 readyRead() 一起释放,一些数字会移至下一个缓冲区。

处理这个问题的最简单方法是通过一个函数调用打印整个消息 -

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



或者将 readRead 上的数据收集到某个 QByteArray 类成员,以便它在类中全局可用,然后再对其进行重组。这是我刚才描述的实现 - https://github.com/IndeemaSoftware/IoT-temperature-with-Predix-and-Qt (根目录中的处理程序类)

希望你觉得我的回答有用

关于c++ - 使用 arduino 的 QT 上的 SerialCommunication 解析失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47745797/

相关文章:

c++ - 从字符串中提取多个子字符串

带有 clang 的 C++ 11 线程

c++ - OpenGL 深度无法按预期工作

c++ - Qt 中的智能指针

c++ - QButtonGroup setExclusive() 问题

c - 读取串口数据

c++ - 无法使用udp协议(protocol)从网络接收数据

arduino - OS X Arduino 1.6.8 CLI MainClassNameRequired

将莫尔斯字符串转换为字符数组

linux - 如何构建在 Linux 上动态链接的 qt 应用程序(非共享库)