我正在开发一个带增量编码器模块的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示例时,这种情况永远不会发生,无论移动编码器的速度如何,总是显示一切正常。
希望有人能帮助我
答案 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类)
希望你找到我的答案有用