如何使用Simulink外部模式在Lego Mindstorms EV3上发送和接收UDP数据包?

时间:2015-11-18 16:39:57

标签: c matlab udp simulink mindstorms

我正在尝试使用c代码为我的EV3创建一个simulink块,以便从其传感器发送测量值和/或通过UDP Pakets从其他硬件(raspberry pi)接收数据。但是我在互联网上找不到任何具体的例子。我尝试按照https://www.abc.se/~m6695/udp.html中的示例编写自己的代码。我期望它能够工作,因为EV3是一个Linux系统。但是,它无法正常工作。

udp_receiver的c代码库(已更新):

#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>

// BUFLEN = max size
#define BUFLEN 512
#define NPACK 1


double * linux_udp_empfaenger(int32_t PORT)
{
  struct sockaddr_in si_me, si_other;

  int s, i, j, slen = sizeof(si_other) , recv_len;
  char buf[BUFLEN];
  //char buf_h[BUFLEN];
  unsigned short recv_port = (unsigned short) PORT;
  double * data;

  //create a UDP socket
  if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
  {
    return 0;
    exit(1);
  } else{

    // zero out the structure
    memset((char *) &si_me, 0, sizeof(si_me));

   si_me.sin_family = AF_INET;
   si_me.sin_port = htons(recv_port);
   si_me.sin_addr.s_addr = htonl(INADDR_ANY);

   //bind socket to port
   if( bind(s , (struct sockaddr*)&si_me, sizeof(si_me) ) == -1)
   {
     close(s);
     return 0;
     exit(1);
   } else{

    //clear the buffer by filling null, it might have previously received data
    //memset(buf,'\0', BUFLEN);

    for (i=0; i<NPACK; i++) {
     if (recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen)==-1)
      {
        close(s);
        return 0;
       } else {
        //Convert buf into usable host format
        //buf_h = ntohs(buf);

        // Convert data from string to double
        //data = atof(buf);

        int N_DATA = sizeof(buf)/sizeof(buf[0]);

        for (j = 0; j < N_DATA; j++){
        data[j] = (double)be64toh(((uint64_t *)buf)[j]);
        }

        close(s);
        return data;
      } 

    }

  }

 }

}

当我在外部运行块时,模型显示正在运行,但T = 0.000一直在运行。我现在甚至无法停止这个模型。

希望得到你的帮助。 谢谢你们!

1 个答案:

答案 0 :(得分:0)

  

./ udp_send_receive.c:14:警告:内置函数'exit'的不兼容隐式声明

你错过了

#include <stdlib.h>
  

./ udp_send_receive.c:31:警告:内置函数'memset'的不兼容隐式声明

     

./ udp_send_receive.c:66:警告:内置函数'memset'的不兼容隐式声明

     

./ udp_send_receive.c:76:警告:内置函数'strlen'的不兼容隐式声明

你错过了

#include <string.h>
  

./ udp_send_receive.c:44:警告:从不兼容的指针类型传递'recvfrom'的参数5

不完全确定如何修复此问题。定义__USE_GNU可能会有所帮助。请参阅sys/socket.h

  

./ udp_send_receive.c:70:警告:传递'inet_aton'的参数1使得整数指针不带强制转换

     

./ udp_send_receive.c:76:警告:传递'strlen'的参数1使得整数指针没有强制转换

需要将*添加到参数声明中。 char是一个字符。 char *是一个字符串。

void udp_send(char *data, char *SERVER, int PORT)