使用带有qt c ++的mavlink协议从串口读取

时间:2015-02-17 12:04:02

标签: c++ multithreading qt serial-port arduino

我试图从ardupilot上读取使用mavlink协议发送数据。如果你访问这个网站:

http://qgroundcontrol.org/mavlink/start

你可以找到mavlink协议如何工作以及我正在尝试做什么。在站点的底部,您可以看到标题的字节排列。 我写了一些代码并且它正常工作但运行一段时间后出现运行时错误。据我所知,这个错误是关于内存分配的,但我无法找到非法分配内存的地方。

这是我的读者线程代码:

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

我正在使用qt5 whit ubuntu 14.04 我应该提一下,我正在用115200波特读数据,它应该用线程管理。如果没有从中读取它将锁定我的ui。

1 个答案:

答案 0 :(得分:1)

你真的需要所有那些msleeps ...以波特率读取我认为你的串口输入缓冲区会很快溢出。可能值得花些时间看看它。

作为一种完全不同的方法,为什么不使用MAVlink generator生成可以使用的库。通过这种方式,它可以帮助您免除解析消息和检查错误以及所有错误的麻烦......