当前位置: 首页 > news >正文

MAVLINK—C语言demoWindows版本

mavlink/examples/c/udp_example.c
在学习mavlink时准备学习一下官网的C语言example,发现是unix系统的,打算在Windows系统下尝试,于是将示例修改了一下。

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <Winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"wsock32.lib")
#include <sys/types.h>
#include <windows.h>
#include <stdlib.h>
#include <fcntl.h>
#include <time.h>
#include<ws2tcpip.h>
#include<iostream>
#include "include2/common/mavlink.h"
#include "include2/common/mavlink_msg_local_position_ned.h"
#include "include2/common/mavlink_msg_sys_status.h"
#include <wtypes.h>
#define ulong ULONG 
#define uint UINT 
#define CLIENT_IP		"127.0.0.1"
#define CLIENT_PORT		14550		// QGroundControl
#define SERVER_PORT		14551		// Vehicle
#define SYSTEM_ID		1
#define COMPONENT_ID	200
#define BUFFER_LENGTH	2041
#include <time.h>
#ifdef WIN32
#include <windows.h>
#else
#include <sys/time.h>
#endif
#ifdef WIN32
int gettimeofday(struct timeval *tp, void *tzp)
{time_t clock;struct tm tm;SYSTEMTIME wtm;GetLocalTime(&wtm);tm.tm_year   = wtm.wYear - 1900;tm.tm_mon   = wtm.wMonth - 1;tm.tm_mday   = wtm.wDay;tm.tm_hour   = wtm.wHour;tm.tm_min   = wtm.wMinute;tm.tm_sec   = wtm.wSecond;tm. tm_isdst  = -1;clock = mktime(&tm);tp->tv_sec = clock;tp->tv_usec = wtm.wMilliseconds * 1000;return (0);
}
#endifuint64_t microsSinceEpoch();
using namespace std;
int main(int argc, char* argv[])
{char help[] = "--help";char target_ip[100];float position[6] = {10.1, 23.7, 34.5, 3.2, 1.1, 3.3};int sock = 0;struct sockaddr_in gcAddr; struct sockaddr_in locAddr;uint8_t buf[BUFFER_LENGTH];ssize_t recsize;socklen_t fromlen = sizeof(gcAddr);int bytes_sent;mavlink_message_t msg;uint16_t len;int i = 0;// Check if --help flag was usedif((argc == 2) && (strcmp(argv[1], help) == 0)){printf("\n");printf("\tUsage:\n\n");printf("\t");printf("%s", argv[0]);printf(" <ip address of QGroundControl>\n");printf("\tDefault for localhost: udp-server 127.0.0.1\n\n");exit(EXIT_FAILURE);}// Change the target ip if parameter was givenif(argc == 2){strcpy(target_ip, argv[1]);}else{strcpy(target_ip, CLIENT_IP);}//初始化WSA  WORD sockVersion = MAKEWORD(2,2);  WSADATA wsaData;  if(WSAStartup(sockVersion, &wsaData)!=0)  {  return 0;  }  // Socket Initialif((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1){perror("[ERR] socket initial failed");exit(EXIT_FAILURE);}/* Attempt to make it non blocking */
/*#if (defined __QNX__) | (defined __QNXNTO__)if(fcntl(sock, F_SETFL, O_NONBLOCK | FASYNC) == -1)
#elseif(fcntl(sock, F_SETFL, O_NONBLOCK | O_ASYNC) == -1)
#endif{fprintf(stderr, "[ERR] setting nonblocking: %s\n", strerror(errno));closesocket(sock);exit(EXIT_FAILURE);}*/// Server Address configmemset(&locAddr, 0, sizeof(locAddr));locAddr.sin_family = AF_INET;			// AF_UNIX/AF_LOCAL/AF_INET/AF_INET6/PF_INETlocAddr.sin_addr.s_addr = INADDR_ANY;	// inet_addr("127.0.0.1")locAddr.sin_port = htons(SERVER_PORT);/* Bind the socket to Local Address:SERVER_PORT - necessary to receive packets from qgroundcontrol */ if(bind(sock, (struct sockaddr *)&locAddr, sizeof(struct sockaddr)) == -1){perror("[ERR] bind failed");closesocket(sock);exit(EXIT_FAILURE);} // Client Address configmemset(&gcAddr, 0, sizeof(gcAddr));gcAddr.sin_family = AF_INET;gcAddr.sin_addr.s_addr = inet_addr(target_ip);gcAddr.sin_port = htons(CLIENT_PORT);printf("Start sending/receiving MAVLink message to/from QGroundControl...\n");while(1) {//发消息/* Send Heartbeat HEARTBEAT */mavlink_msg_heartbeat_pack(SYSTEM_ID, COMPONENT_ID, &msg, MAV_TYPE_HELICOPTER, MAV_AUTOPILOT_PX4, MAV_MODE_STABILIZE_ARMED, 0, MAV_STATE_ACTIVE);len = mavlink_msg_to_send_buffer(buf, &msg);bytes_sent = sendto(sock, (const char*)buf, len, 0, (struct sockaddr*)&gcAddr, sizeof(struct sockaddr_in));/* Send Status SYS_STATUS */mavlink_msg_sys_status_pack(SYSTEM_ID, COMPONENT_ID, &msg, 0, 0, 0, 500, 11000, -1, 100, 0, 0, 0, 0, 0,0);len = mavlink_msg_to_send_buffer(buf, &msg);bytes_sent = sendto(sock, (const char*)buf, len, 0, (struct sockaddr*)&gcAddr, sizeof (struct sockaddr_in));/* Send Local Position LOCAL_POSITION_NED */mavlink_msg_local_position_ned_pack(SYSTEM_ID, COMPONENT_ID, &msg, microsSinceEpoch(), position[0], position[1], position[2], position[3], position[4], position[5]);len = mavlink_msg_to_send_buffer(buf, &msg);bytes_sent = sendto(sock, (const char*)buf, len, 0, (struct sockaddr*)&gcAddr, sizeof(struct sockaddr_in));/* Send attitude ATTITUDE */mavlink_msg_attitude_pack(SYSTEM_ID, COMPONENT_ID, &msg, microsSinceEpoch(), 1.2, 1.7, 3.14, 0.01, 0.02, 0.03);len = mavlink_msg_to_send_buffer(buf, &msg);bytes_sent = sendto(sock, (const char*)buf, len, 0, (struct sockaddr*)&gcAddr, sizeof(struct sockaddr_in));memset(buf, 0, BUFFER_LENGTH);// Receive Messagesrecsize = recvfrom(sock, (char *)buf, BUFFER_LENGTH, 0, (struct sockaddr *)&gcAddr, &fromlen);if(recsize > 0){mavlink_message_t msg;mavlink_status_t status;printf("Bytes Received: %d\nDatagram: ", (int)recsize);for(i = 0; i < recsize; i++){printf("%02x ", (unsigned char)buf[i]);if(mavlink_parse_char(MAVLINK_COMM_0, buf[i], &msg, &status) == MAVLINK_FRAMING_OK){// Packet receivedprintf("\nReceived packet: SYS:%d, COMP:%d, LEN:%d, MSG:%d, SEQ:%d, \n", msg.sysid, msg.compid, msg.len, msg.msgid, msg.seq);}}printf("\n");}memset(buf, 0, BUFFER_LENGTH);Sleep(1); // Sleep one second}WSACleanup(); 
}/* QNX timer version */
#if (defined __QNX__) | (defined __QNXNTO__)
uint64_t microsSinceEpoch()
{struct timespec time;uint64_t micros = 0;clock_gettime(CLOCK_REALTIME, &time);  micros = (uint64_t)time.tv_sec * 1000000 + time.tv_nsec/1000;return micros;
}
#else
uint64_t microsSinceEpoch()
{struct timeval tv;uint64_t micros = 0;gettimeofday(&tv, NULL);  micros =  ((uint64_t)tv.tv_sec) * 1000000 + tv.tv_usec;return micros;
}
#endif

运行的时候打开QGroundControl客户端,然后就可以收到消息

相关文章:

MAVLINK—C语言demoWindows版本

mavlink/examples/c/udp_example.c 在学习mavlink时准备学习一下官网的C语言example&#xff0c;发现是unix系统的&#xff0c;打算在Windows系统下尝试&#xff0c;于是将示例修改了一下。 #include <stdio.h> #include <errno.h> #include <string.h> #in…...

区块链实验室(15) - 编译FISCO BCOS的过程监测

首次编译开源项目&#xff0c;一般需要下载很多依赖包&#xff0c;尤其是从github、sourceforge等下载依赖包时&#xff0c;速度很慢&#xff0c;编译进度似乎没有一点反应&#xff0c;似乎陷入死循环&#xff0c;似乎陷入一个没有结果的等待。本文提供一种监测方法&#xff0c…...

java_IO其它架包使用

文章目录 apache-common包的使用 apache-common包的使用 IO技术开发中&#xff0c;代码量很大&#xff0c;而且代码的重复率较高&#xff0c;为此Apache软件基金会&#xff0c;开发了IO技术的工具类commonsIO&#xff0c;大大简化了IO开发。 Apahce软件基金会属于第三方&…...

一、7.协同式任务切换与抢占式任务切换

使用TSS来在任务切换时保护现场和恢复现场 内核任务&#xff1a;单纯由内核组成的任务&#xff0c;和其他用户程序组成其他任务 内核任务的创建 ;为内核任务创建任务控制块TCB mov ecx, 0x46 call sys_routine_seg_sel:allocate_memory call append_to_tcb_link ;将此TCB添加…...

JavaScript实践:用Canvas开发一个可配置的大转盘抽奖功能

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f3c6;本文已…...

yay无法更新问题解决

背景 更新yay后&#xff0c;yay安装软件捞出问题&#xff0c;查的github上的都不靠谱。因此需要把yay的版本固定下&#xff0c;正常的11版本是可用的 解决方案 sudo pacman -S --needed git base-devel git clone https://aur.archlinux.org/yay.git cd yay makepkg -si # 注…...

C语言 — 动态内存管理(动态内存函数)

前言 本期分为三篇介绍动态内存管理相关内容&#xff0c;关注博主了解更多 博主博客链接&#xff1a;https://blog.csdn.net/m0_74014525 本期介绍动态内存函数&#xff0c;函数如何使用、函数格式、在使用在所需要的注意点及C/C程序的内存开辟区域 系列文章 第一篇&#xff…...

Visual ChatGPT:Microsoft ChatGPT 和 VFM 相结合

推荐&#xff1a;使用 NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景 什么是Visual ChatGPT&#xff1f; Visual ChatGPT 是一个包含 Visual Foundation 模型 &#xff08;VFM&#xff09; 的系统&#xff0c;可帮助 ChatGPT 更好地理解、生成和编辑视觉信息。VFM 能够指…...

基于java理发店预约系统微信小程序设计与实现

摘要 多姿多彩的世界带来了美好的生活&#xff0c;行业的发展也是形形色色的离不开技术的发展。作为时代进步的发展方面&#xff0c;信息技术至始至终都是成就行业发展的重要秘密。不论何种行业&#xff0c;大到国家、企业&#xff0c;小到团体、个人都在多方位的结合信息化技术…...

【软件测试】大厂测工都是这样学习的,你get到了吗?

有不少的软件测试工程师站在“十字路口”迷茫、无助&#xff0c;找不到自己的方向。一切的迷茫都是因为想得太多而做的太少&#xff01;每位软件测试行业从业者都能意识到目前自己面临的窘境&#xff0c;但能及时作出改变&#xff0c;顺应时代变化的人还是太少。多数人明明“泰…...

如何使用ONLYOFFICE+ffmpeg来给视频文件打马赛克

如何使用ONLYOFFICEffmpeg来给视频文件打马赛克 我这里之前写过很多关于ONLYOFFICE使用、安装的系列图文&#xff0c;也写过很多关于ffmpeg使用的图文&#xff0c;那么这次继续&#xff0c;把这两个开源软件放在一起&#xff0c;能碰撞出什么火花般的功能来。 这就是给视频文…...

003-依赖注入、属性赋值源码分析

目录 引入作用代码分析InstantiationAwareBeanPostProcessor#postProcessProperties()AutowiredAnnotationBeanPostProcessor查找注入点元数据给注入点注入属性 引入 之前我们了解到BeanDefinition到Bean&#xff0c;经历了 实例化属性赋值初始化 3个步骤现在详细分析下属性赋…...

Elasticsearch 商业启示

上月的“红帽事件”&#xff0c;说明开源软件的“客服模式”行不通&#xff0c;那么&#xff0c;开源软件如何赚钱呢&#xff1f;既不能卖软件&#xff0c;又不能卖支持服务&#xff0c;该怎么办呢&#xff1f;我现在的看法是&#xff0c;只剩下一种模式是可行的&#xff0c;开…...

C++/Qt 读写文件

之前写过两篇跟文件操作相关的博客&#xff0c;有兴趣也可以看一下&#xff1a; C语言读写文件 Qt关于文件路径的处理 先讲一些关于基础文本文件和二进制文件的读写操作&#xff0c;后续将会整理C/Qt关于ini、xml、json、xlsx相关文件的读写操作。 C 相比于C语言使用FILE文…...

linux服务器之-nethogs命令

文章目录 NetHogs 工具安装安装依赖包安装epel源安装Nethogs 使用 NetHogs 工具 NetHogs是一个小型的net top工具&#xff0c;不像大多数工具那样拖慢每个协议或者是每个子网的速度而是依照进程进行带宽分组。 安装 安装依赖包 yum install libpcap libpcap-devel epel-rel…...

《每天5分钟玩转kubernetes》读书笔记

笔记 概念 Pod是脆弱的&#xff0c;但应用是健壮的。 kubelet运行在Cluster所有节点上&#xff0c;负责启动Pod和容器。kubeadm用于初始化Cluster。kubectl是k8s命令行工具。通过kubectl可以部署和管理应用&#xff0c;查看各种资源&#xff0c;创建、删除和更新各种组件。 …...

【RabbitMQ】golang客户端教程4——路由(使用direct交换器)

路由 在上一教程中&#xff0c;我们构建了一个简单的日志记录系统。我们能够向许多接收者广播日志消息。 在本教程中&#xff0c;我们将向它添加一个特性-我们将使它能够只订阅消息的一个子集。例如&#xff0c;我们将只能将关键错误消息定向到日志文件&#xff08;以节省磁盘…...

Shell脚本学习-for循环结构2

案例&#xff1a;通过脚本实现仅sshd、rsyslog、crond、network、sysstat服务在开机时自启动。 Linux系统在开机的服务通常工作在文本模式3级别&#xff0c;因此只需要查找3级别以上的开启的服务即可。查看命令&#xff1a; chkconfig --list |grep 3:on [rootvm1 ~]# chkco…...

vue 老项目 npm install 报错Python,c++等相关错误

​​​ 老项目npm install 下载依赖包报错 解决方法&#xff1a; //下载python 1、 npm install --global --production windows-build-tools//配置环境 &#xff1a; 也可暂时不用配置,能用就不用配置&#xff08;npm config set python "D:\Python27\python.exe&q…...

【c语言初级】c++基础

文章目录 1. C关键字2. 命名空间2.1 命名空间定义2.2 命名空间使用 3. C输入&输出4. 缺省参数4.1 缺省参数概念4.2 缺省参数分类 5. 函数重载5.2 C函数重载的原理--名字修饰采用C语言编译器编译后结果 1. C关键字 C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...