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

标签 c++ multithreading qt serial-port arduino

我正在尝试从 ardupilot 读取使用 mavlink 协议(protocol)发送数据。如果您访问此网站:

http://qgroundcontrol.org/mavlink/start

您可以找到 mavlink 协议(protocol)的工作原理以及我正在尝试做的事情。在站点的底部,您可以看到 header 的字节排列。 我写了一些代码,它工作正常,但运行一段时间后出现运行时错误。据我所知,此错误与内存分配有关,但我无法找到非法分配内存的位置。

这是我的阅读线程代码:

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 和 ubuntu 14.04 我应该提到我正在用 115200baud 读取数据,它应该用线程管理。如果不读取它会锁定我的用户界面。

最佳答案

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

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

关于c++ - 使用带有 qt c++ 的 mavlink 协议(protocol)从串口读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28561048/

相关文章:

python - 为什么方法 sys.exit()、exit()、raise SystemExit 不起作用?

multithreading - 在多个 qt 线程中使用单个 QSqlDatabase 连接

c++ - 在 QTableView 中用鼠标右键选择

c++ - 将可变数量的参数传递给类中的另一个方法

java - 在java中的不同类中的线程之间同步共享变量?

c++ - 带有 Bash 的 Qt 控制台

c++ - 在不锁定的情况下在线程之间复制 std::vector

qt - 如何使 QTableWidget 中的列只读?

c++ - 项目存档上的 Apple Mach-O 链接器错误

c++ - 如果用户使用 Rice 在 Ruby 中重新定义 initialize(),则避免 C++ 代码中的段错误