mavlink c 编码解码demo

28 篇文章 0 订阅
26 篇文章 2 订阅

#include "common/mavlink.h"
#include "common/mavlink_msg_local_position_ned.h"
#include "common/mavlink_msg_sys_status.h"
#define BUFFER_LENGTH                                                          \
  2041 // minimum buffer size that can be used with qnx (I don't know why)

int main(int argc, char *argv[]) {

  mavlink_system_t mavlink_system = {
      1, // System ID (1-255)
      1  // Component ID (a MAV_COMPONENT value)
  };
  char help[] = "--help";

  char target_ip[100];

  float position[6] = {};
 
  uint8_t buf[BUFFER_LENGTH];
  ssize_t recsize;
  // socklen_t fromlen = sizeof(gcAddr);
  int bytes_sent;
  mavlink_message_t msg2;

  // mavlink_message_t msg;
  mavlink_status_t status;

  uint16_t len;
  int i = 0;
  // int success = 0;
  unsigned int temp = 0;
  {

    /*Send Heartbeat */
    // mavlink_msg_heartbeat_pack(1, 200, &msg, MAV_TYPE_HELICOPTER,
    // MAV_AUTOPILOT_GENERIC, MAV_MODE_GUIDED_ARMED, 0, MAV_STATE_ACTIVE);
    // len = mavlink_msg_to_send_buffer(buf, &msg);

    // bytes_sent = sendto(sock, buf, len, 0, (struct sockaddr*)&gcAddr,
    // sizeof(struct sockaddr_in));

    // /* Send Status */

    // mavlink_msg_sys_status_pack(12, 234, &msg, 0, 0, 0, 500, 11000, -1, -1,
    // 0, 0, 0, 0, 0, 0);
    // len = mavlink_msg_to_send_buffer(buf, &msg);

    mavlink_msg_local_position_ned_pack(1, 200, &msg2, 123, 2, 33, 35, 43, 52,
                                        62);
    len = mavlink_msg_to_send_buffer(buf, &msg2);

    for (i = 0; i < len; i++)
      printf("%x ", buf[i]);
    printf("\n----\n");
    mavlink_message_t msg;
    for (i = 0; i < len; i++) {
      temp = buf[i];
      printf("%02x ", (unsigned char)temp);
      if (mavlink_parse_char(12, buf[i], &msg, &status)) {
        // Packet received
        printf("\nReceived --packet: SYS: %d, COMP: %d, LEN: %d, MSG ID: %d\n",
               msg.sysid, msg.compid, msg.len, msg.msgid);
        if (msg.msgid == 32) {
          mavlink_local_position_ned_t local_position_ned;
          mavlink_msg_local_position_ned_decode(&msg, &local_position_ned);
          printf("ned x %f, y%f, z%f\nned vx %f, vy%f, vz%f\n",
                 local_position_ned.x, local_position_ned.y,
                 local_position_ned.z, local_position_ned.vx,
                 local_position_ned.vy, local_position_ned.vz);
        }
      }
    }

  }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!以下是一个使用Qt和Mavlink的无人机地面站的简单示例代码: ```cpp #include <QCoreApplication> #include <QSerialPort> #include <QSerialPortInfo> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 查找可用的串口 QList<QSerialPortInfo> portInfoList = QSerialPortInfo::availablePorts(); QSerialPort serialPort; foreach (const QSerialPortInfo &portInfo, portInfoList) { if(portInfo.description().contains("PX4")){ serialPort.setPort(portInfo); break; } } // 配置串口参数 serialPort.setBaudRate(QSerialPort::Baud57600); serialPort.setDataBits(QSerialPort::Data8); serialPort.setParity(QSerialPort::NoParity); serialPort.setStopBits(QSerialPort::OneStop); serialPort.setFlowControl(QSerialPort::NoFlowControl); // 打开串口 if (!serialPort.open(QIODevice::ReadWrite)) { qDebug() << "Failed to open serial port."; return 1; } // 进行Mavlink通信 while (true) { QByteArray data = serialPort.readAll(); // 处理接收到的数据 // 发送数据 quint8 buffer[MAVLINK_MAX_PACKET_LEN]; mavlink_message_t message; mavlink_msg_heartbeat_pack(1, 200, &message, MAV_TYPE_QUADROTOR, MAV_AUTOPILOT_GENERIC, 0, 0, 0); uint16_t len = mavlink_msg_to_send_buffer(buffer, &message); quint64 bytesWritten = serialPort.write(reinterpret_cast<const char*>(buffer), len); if (bytesWritten == -1) { qDebug() << "Failed to write to serial port."; break; } serialPort.waitForBytesWritten(1000); } // 关闭串口 serialPort.close(); return a.exec(); } ``` 这是一个基本的示例,可以读取和发送Mavlink消息。你需要根据你的实际情况进行适当的修改和扩展。请确保安装了Qt开发环境和相应的串口库。 希望对你有帮助!如果你有更多问题,可以继续问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值