使用arduino

时间:2017-12-11 02:50:36

标签: 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像往常一样它有一个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示例时,这种情况永远不会发生,无论移动编码器的速度如何,总是显示一切正常。

希望有人能帮助我

1 个答案:

答案 0 :(得分:1)

问题出现在串口缓冲区中,因此在调用最后一个函数时不释放缓冲区 - Serial.print(&#34;,\ n \ n&#34;); - 但是当它已满时,部分消息将通过readyRead()释放,并且一些数字将被移动到下一个缓冲区。

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

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



或者将readRead上的数据收集到某个QByteArray类memeber中,因此它可以在全局范围内使用,后者可以对其进行重组。这是我刚刚描述的实现 - https://github.com/IndeemaSoftware/IoT-temperature-with-Predix-and-Qt(根目录中的Handler类)

希望你找到我的答案有用