0

我正在尝试使用 Parrot 开发的 mavlink 示例来控制使用 mavlink 协议的 Bebop2(链接在这里)。

为了向无人机发送消息,他们使用了 sendto 功能,但我遇到了一个我无法解决的问题:每次我尝试使程序正常工作时,我都会收到一个错误,经过一番调查,我发现它是'此代码中使用的sendto'(在mavlink_comm_send_msg函数中)返回EINVAL错误类型(代码位于src目录中的mavlink_comm.c文件中):

#include <errno.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <time.h>
#include <sys/time.h>
#include <poll.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <netdb.h>
#include <mavlink.h>
#include "mavlink_comm.h"

#define MAVLINK_COMM_BUFSIZE 4096

struct mavlink_comm {
    int sock;
    struct sockaddr_in remote_addr;
    unsigned char tx_buffer[MAVLINK_COMM_BUFSIZE];
    unsigned int tx_bufidx;
    unsigned char rx_buffer[MAVLINK_COMM_BUFSIZE];
    unsigned int rx_bufidx;
    void (*cb)(mavlink_message_t *msg, void *user_data);
    void *user_data;
};

struct mavlink_comm *mavlink_comm_new(struct mavlink_comm_cfg *cfg)
{
    struct sockaddr_in locAddr;
    struct mavlink_comm *c;
    struct hostent *server;

    if (!cfg)
        return NULL;

    c = calloc(1, sizeof(*c));
    if (!c)
        return NULL;
    c->cb = cfg->cb;
    c->user_data = cfg->user_data;

    c->sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
    memset(&locAddr, 0, sizeof(locAddr));
    locAddr.sin_family = AF_INET;
    locAddr.sin_addr.s_addr = INADDR_ANY;
    locAddr.sin_port = htons(cfg->local_port);

    if (cfg->remote_addr && cfg->remote_addr[0] != '\0') {
        server = gethostbyname(cfg->remote_addr);
        if (server == NULL) {
            fprintf(stderr,"ERROR, no such host %s\n",
                    cfg->remote_addr);
            exit(0);
        }
        bzero((char *) &c->remote_addr, sizeof(c->remote_addr));
        c->remote_addr.sin_family = AF_INET;
        bcopy((char *)server->h_addr,
                (char *)&c->remote_addr.sin_addr.s_addr,
                server->h_length);
        c->remote_addr.sin_port = htons(cfg->remote_port);
    }
    /* Bind the socket to port 14551
     * necessary to receive packets from qgroundcontrol */ 
    if (-1 == bind(c->sock,(struct sockaddr *)&locAddr,
                sizeof(struct sockaddr))) {
        perror("error bind failed");
        goto exit_close;
    } 
    return c;

exit_close:
    close(c->sock);
    free(c);
    return NULL;
}

static inline int mavlink_comm_send_data_internal(struct mavlink_comm *c)
{
  int size = sizeof(struct sockaddr_in);
    return sendto(c->sock, c->tx_buffer, c->tx_bufidx, 0,
            (struct sockaddr*)&c->remote_addr,
            sizeof(struct sockaddr_in));
}

int mavlink_comm_send_msg(struct mavlink_comm *c, mavlink_message_t *msg)
{
  if (!c || !msg)
        return -EINVAL;
    int len = mavlink_msg_to_send_buffer(c->tx_buffer, msg);
    return sendto(c->sock, c->tx_buffer, len, 0,
            (struct sockaddr*)&c->remote_addr,
            sizeof(struct sockaddr_in));
}

我查看了其他相关帖子并尝试了几件事来使其工作,但没有一个成功。演员表似乎是正确的,我验证了 dest_len论点,所以我很迷茫。

非常感谢你的帮助。

4

0 回答 0