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,发现是unix系统的,打算在Windows系统下尝试,于是将示例修改了一下。 #include <stdio.h> #include <errno.h> #include <string.h> #in…...
区块链实验室(15) - 编译FISCO BCOS的过程监测
首次编译开源项目,一般需要下载很多依赖包,尤其是从github、sourceforge等下载依赖包时,速度很慢,编译进度似乎没有一点反应,似乎陷入死循环,似乎陷入一个没有结果的等待。本文提供一种监测方法,…...
java_IO其它架包使用
文章目录 apache-common包的使用 apache-common包的使用 IO技术开发中,代码量很大,而且代码的重复率较高,为此Apache软件基金会,开发了IO技术的工具类commonsIO,大大简化了IO开发。 Apahce软件基金会属于第三方&…...
一、7.协同式任务切换与抢占式任务切换
使用TSS来在任务切换时保护现场和恢复现场 内核任务:单纯由内核组成的任务,和其他用户程序组成其他任务 内核任务的创建 ;为内核任务创建任务控制块TCB mov ecx, 0x46 call sys_routine_seg_sel:allocate_memory call append_to_tcb_link ;将此TCB添加…...
JavaScript实践:用Canvas开发一个可配置的大转盘抽奖功能
🏆作者简介,黑夜开发者,全栈领域新星创作者✌,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已…...
yay无法更新问题解决
背景 更新yay后,yay安装软件捞出问题,查的github上的都不靠谱。因此需要把yay的版本固定下,正常的11版本是可用的 解决方案 sudo pacman -S --needed git base-devel git clone https://aur.archlinux.org/yay.git cd yay makepkg -si # 注…...
C语言 — 动态内存管理(动态内存函数)
前言 本期分为三篇介绍动态内存管理相关内容,关注博主了解更多 博主博客链接:https://blog.csdn.net/m0_74014525 本期介绍动态内存函数,函数如何使用、函数格式、在使用在所需要的注意点及C/C程序的内存开辟区域 系列文章 第一篇ÿ…...
Visual ChatGPT:Microsoft ChatGPT 和 VFM 相结合
推荐:使用 NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景 什么是Visual ChatGPT? Visual ChatGPT 是一个包含 Visual Foundation 模型 (VFM) 的系统,可帮助 ChatGPT 更好地理解、生成和编辑视觉信息。VFM 能够指…...
基于java理发店预约系统微信小程序设计与实现
摘要 多姿多彩的世界带来了美好的生活,行业的发展也是形形色色的离不开技术的发展。作为时代进步的发展方面,信息技术至始至终都是成就行业发展的重要秘密。不论何种行业,大到国家、企业,小到团体、个人都在多方位的结合信息化技术…...
【软件测试】大厂测工都是这样学习的,你get到了吗?
有不少的软件测试工程师站在“十字路口”迷茫、无助,找不到自己的方向。一切的迷茫都是因为想得太多而做的太少!每位软件测试行业从业者都能意识到目前自己面临的窘境,但能及时作出改变,顺应时代变化的人还是太少。多数人明明“泰…...
如何使用ONLYOFFICE+ffmpeg来给视频文件打马赛克
如何使用ONLYOFFICEffmpeg来给视频文件打马赛克 我这里之前写过很多关于ONLYOFFICE使用、安装的系列图文,也写过很多关于ffmpeg使用的图文,那么这次继续,把这两个开源软件放在一起,能碰撞出什么火花般的功能来。 这就是给视频文…...
003-依赖注入、属性赋值源码分析
目录 引入作用代码分析InstantiationAwareBeanPostProcessor#postProcessProperties()AutowiredAnnotationBeanPostProcessor查找注入点元数据给注入点注入属性 引入 之前我们了解到BeanDefinition到Bean,经历了 实例化属性赋值初始化 3个步骤现在详细分析下属性赋…...
Elasticsearch 商业启示
上月的“红帽事件”,说明开源软件的“客服模式”行不通,那么,开源软件如何赚钱呢?既不能卖软件,又不能卖支持服务,该怎么办呢?我现在的看法是,只剩下一种模式是可行的,开…...
C++/Qt 读写文件
之前写过两篇跟文件操作相关的博客,有兴趣也可以看一下: C语言读写文件 Qt关于文件路径的处理 先讲一些关于基础文本文件和二进制文件的读写操作,后续将会整理C/Qt关于ini、xml、json、xlsx相关文件的读写操作。 C 相比于C语言使用FILE文…...
linux服务器之-nethogs命令
文章目录 NetHogs 工具安装安装依赖包安装epel源安装Nethogs 使用 NetHogs 工具 NetHogs是一个小型的net top工具,不像大多数工具那样拖慢每个协议或者是每个子网的速度而是依照进程进行带宽分组。 安装 安装依赖包 yum install libpcap libpcap-devel epel-rel…...
《每天5分钟玩转kubernetes》读书笔记
笔记 概念 Pod是脆弱的,但应用是健壮的。 kubelet运行在Cluster所有节点上,负责启动Pod和容器。kubeadm用于初始化Cluster。kubectl是k8s命令行工具。通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件。 …...
【RabbitMQ】golang客户端教程4——路由(使用direct交换器)
路由 在上一教程中,我们构建了一个简单的日志记录系统。我们能够向许多接收者广播日志消息。 在本教程中,我们将向它添加一个特性-我们将使它能够只订阅消息的一个子集。例如,我们将只能将关键错误消息定向到日志文件(以节省磁盘…...
Shell脚本学习-for循环结构2
案例:通过脚本实现仅sshd、rsyslog、crond、network、sysstat服务在开机时自启动。 Linux系统在开机的服务通常工作在文本模式3级别,因此只需要查找3级别以上的开启的服务即可。查看命令: chkconfig --list |grep 3:on [rootvm1 ~]# chkco…...
vue 老项目 npm install 报错Python,c++等相关错误
老项目npm install 下载依赖包报错 解决方法: //下载python 1、 npm install --global --production windows-build-tools//配置环境 : 也可暂时不用配置,能用就不用配置(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的基础之上,容纳进去了面向对象编程思想…...
如何高效使用Umi-OCR:免费离线文字识别工具实用指南
如何高效使用Umi-OCR:免费离线文字识别工具实用指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置多国语言库…...
从ChatGPT插件到自主Agent工作流:2026年AI工具栈跃迁的4个关键断点及突破路径
更多请点击: https://codechina.net 第一章:2026年AI工具栈搭建完整指南 构建面向生产环境的AI工具栈,需兼顾前沿性、稳定性与可扩展性。2026年主流实践已从单点模型调用转向模块化、可观测、可编排的智能工作流基础设施。以下为推荐技术选型…...
共享茶室智能系统与运营全解析:从空间设计到自动化管理
1. 项目概述:为什么“共享茶室”正在重塑传统茶饮消费如果你最近留意过城市里的新业态,可能会发现一种名为“共享茶室”的空间正在悄然兴起。它不像传统的茶馆那样需要高昂的消费和复杂的社交礼仪,也不像奶茶店那样主打快节奏的“即买即走”。…...
AI第一次科研竞赛中击败人类!Opus 4.7狂飙2930步创世界纪录
来源:新智元Prime Intellect把Opus 4.7和GPT 5.5关进H200集群,不给人类指导,跑了1万次实验。结果:AI第一次在科研竞赛中打破人类纪录。2930步,递归自改进的卢比孔河,被跨过了。历经1.4万小时H200算力测试与…...
卫星通信安全认证技术解析与应用指南
1. 卫星通信安全认证技术概述 卫星通信作为现代信息基础设施的重要组成部分,其安全性直接关系到国家安全和经济发展。在近地轨道卫星数量激增、天地一体化网络快速发展的背景下,传统地面网络的安全认证方案已无法满足卫星通信的特殊需求。卫星信道具有长…...
Source Han Serif CN:企业级开源字体终极实战指南
Source Han Serif CN:企业级开源字体终极实战指南 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 在当今数字化时代,企业面临字体选择的两难困境:商…...
STM32CubeIDE实战指南:从代码编译到一键下载的完整流程解析
1. STM32CubeIDE开发环境概述 对于刚接触STM32开发的工程师来说,选择一款合适的集成开发环境(IDE)至关重要。STM32CubeIDE是ST官方推出的免费开发工具,它集成了代码编辑、编译、调试和下载功能于一体,特别适合新手快速上手。我在实际项目中使…...
完整实战指南:使用N_m3u8DL-RE高效解决流媒体下载难题
完整实战指南:使用N_m3u8DL-RE高效解决流媒体下载难题 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL-RE …...
空洞骑士模组管理器Scarab:2024年最全面的安装与管理指南
空洞骑士模组管理器Scarab:2024年最全面的安装与管理指南 【免费下载链接】Scarab An installer for Hollow Knight mods written with Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 还在为空洞骑士模组安装的复杂流程而烦恼吗?…...
Go语言实现跨平台系统更新检查器:自动化运维与安全监控实践
1. 项目概述:一个被低估的系统运维“哨兵”在服务器和桌面系统的日常运维中,有一个场景大家一定不陌生:某天,你管理的服务器突然因为一个已知漏洞被攻击,事后排查发现,相关的安全补丁其实在几周前就已经发布…...
