簡體   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