繁体   English   中英

使用带有Qt C ++的mavlink协议从串行端口读取

[英]read from serial port using mavlink protocol with qt c++

我正在尝试从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,我应该提到我正在使用115200baud读取数据,并且应该使用线程进行管理。 如果不读它会锁定我的用户界面。

您真的需要所有这些睡眠吗?以这种波特率阅读,我认为您的串行端口输入缓冲区会很快溢出。 可能值得花时间来看看它。

作为一种完全不同的方法,为什么不使用MAVlink生成器来生成可以使用的库。 这样,您可以避免解析消息,对消息进行错误检查以及所有其他麻烦。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM