/ / ler da porta serial usando o protocolo mavlink com qt c + + - c + +, multithreading, qt, porta serial, arduino

ler da porta serial usando o protocolo mavlink com qt c + + - c + +, multithreading, qt, porta serial, arduino

Eu estou tentando ler de ardupilot que usando o protocolo mavlink para enviar dados. Se você visitar este site:

http://qgroundcontrol.org/mavlink/start

você pode encontrar como o protocolo mavlink funciona e o queEu estou tentando fazer. Na parte inferior do site você pode ver o arranjo de bytes do cabeçalho. Eu escrevi algum código e ele funciona corretamente, mas depois de correr por um tempo, erro de execução aparece, até onde eu sei, esses erros são sobre alocações de memória, mas eu não consigo localizar onde eu aloco a memória ilegalmente.

Aqui está o meu código de thread do leitor:

QByteArray header;
quint8 ID;
QByteArray payload;
QSerialPort *serial;

void mThread::run()
{//1
while(serial->isOpen())
{//2
if(serial->bytesAvailable() >= 200)
{//3

this->msleep(1);
header = serial->read(1);
if(header.contains(254))
{//4
this->msleep(5);
header.append(serial->read(5));
if((header[3] == 1) && (header[4] == 1))
{//5
ID = header[5];
msleep(12);
payload = serial->read(header[1]);
emit updated(payload , ID);
payload.clear();
header.clear();
}//5
else
{//6
header.clear();
}//6
}//4
else
{//7
header.clear();
}//7
}//3
}//2
}//1

Eu estou usando o qt5 com o ubuntu 14.04 e devo mencionar que eu estou lendo dados com 115200baud e ele deve gerenciar com thread. Se não ler a partir dele vai bloquear o meu ui.

Respostas:

0 para resposta № 1

Você realmente precisa de todos aqueles msleeps ... Lendo a essa taxa de transmissão eu acho que seu buffer de entrada de porta serial iria transbordar muito rapidamente. Pode valer a pena dar uma olhada nisso.

Como uma abordagem totalmente diferente, por que não usar o Gerador MAVlink para gerar uma biblioteca que você poderia usar. Dessa forma, você evita o problema de analisar as mensagens e verificá-las com erro e tudo o que ...