1

I am trying to interface Matlab with a C code that I used to read data through UDP. I am using the winsock2 library, and compiling the C code into a DLL file for it to be loaded into Matlab. My C code is working fine and reading the udp data as expected. But when I use the same code via'loadlibrary' function in Matlab, it just returns me all zeroes. The problem is definitely on the MATLAB side since I have already verified C code to be working and reading data properly. Does anyone have an idea of what I am doing wrong? My C code, header file and Matlab script are given below:

C code:

``#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#include <windows.h> // Include for Sleep function
#include "udpfunc2.h" 
#define BUFLEN 48
SOCKET s;
// Function to initialize UDP socket
int init_udp_socket() {
  WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
    printf("WSAStartup failed\n");
    return -1;
}
return 0;
}
// Function to create and bind UDP socket
int create_udp_socket() {
if ((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) {
    printf("Socket creation failed\n");
    return -1;
}
return 0;
}
// Function to bind UDP socket to specified IP address and port
int bind_udp_socket(const char *ip_address, int port) {
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr(ip_address);
server.sin_port = htons(port);
if (bind(s, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR) {
    printf("Bind failed\n");
    return -1;
}
return 0;
}
// Function to set socket to non-blocking mode
int set_socket_nonblocking() {
unsigned long mode = 1; // 1 to enable non-blocking mode
if (ioctlsocket(s, FIONBIO, &mode) != 0) {
    printf("Failed to set socket to non-blocking mode\n");
    return -1;
}
return 0;
}
// Function to continuously read data through UDP as 12 single values (non-blocking)
void udp_read_continuous(float *data) {
struct sockaddr_in si_other;
int slen = sizeof(si_other);
int recv_len;
//zero out the memory buffer
memset(data,0,12 * sizeof(float));

recv_len = recvfrom(s, (char *)data, BUFLEN, 0, (struct sockaddr *)&si_other, &slen);
    
// Convert data from big-endian to host byte order
// Assuming each single value is a 32-bit float
for (int i = 0; i < 12; i++) {
    unsigned int val;
    memcpy(&val , &data[i], sizeof(float));
    val = ntohl(val);
    data[i] = *((float*)&val);
}
// Print received data
printf("Received data: ");
for (int i = 0; i < 12; i++) {
    printf("%.6f ", data[i]);
}
printf("\n");

}
// Function to close UDP socket
void close_udp_socket() {
closesocket(s);
WSACleanup();`
}

` Header File:

`#ifndef UDP_FUNC2_H
#define UDP_FUNC2_H
#include <winsock2.h>
#ifdef __cplusplus
extern "C" {
#endif
// Function prototypes
int init_udp_socket();
int create_udp_socket();
int bind_udp_socket(const char *ip_address, int port);
int set_socket_nonblocking();
void udp_read_continuous(float *data);
void close_udp_socket();
#ifdef __cplusplus
}
#endif
#endif // UDP_FUNC2_H`

MATLAB Script

```clc;
clear;
if libisloaded('udpfunc2')
unloadlibrary('udpfunc2')
end
loadlibrary('udpfunc2.dll', 'udpfunc2.h');
% Define UDP parameters
ip_address = '127.0.0.1'; % Local IP address
localPort = 44444; % Example port number

% Initialize UDP socket
status = calllib('udpfunc2', 'init_udp_socket');
if status == 0
disp('UDP socket initialized successfully');
else
disp('Failed to initialize UDP socket');
return;
end
% Open UDP socket
status = calllib('udpfunc2', 'create_udp_socket');
if status == -1
disp('Failed to Open UDP Socket');
end
% Bind UDP Socket to Local Port and IP address
status = calllib('udpfunc2', 'bind_udp_socket', ip_address, localPort);
if status == 0
disp('UDP socket binded successfully');
else
disp('Failed to bind socket');
return;
end
% Set Socket to Non-Blocking
status = calllib('udpfunc2', 'set_socket_nonblocking');
if status == 0
disp('UDP socket set to Non-Blocking successfully');
else
disp('Failed to set socket to Non-Blocking');
return;
end
% Create a MATLAB struct to hold the 12 single values
dataPacket = zeros(1, 12, 'single');
% Read continuous UDP data
while true
calllib('udpfunc2', 'udp_read_continuous', dataPacket);
fprintf('%.6f\n', dataPacket(12));
end
% Close UDP socket
calllib('udpfunc2', 'close_udp_socket');
disp('UDP socket closed');`
% Unload the DLL
unloadlibrary('udpfunc2');

` Receiving no data for udp read on Matlab

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.