2010-04-26 3 views
0

Я понял, что должен использовать MEX-файл для вывода цифровых импульсов в петле (40 кГц) из Matlab на DAQ-Board, у меня есть некоторые API-интерфейсы от поставщик DAQ-Board, но я действительно не знаю, полезны ли они. Это большая документация на веб-сайте Mathworks о MEX-файлах и API-интерфейсах, которые просто заставляют меня смущаться. Итак, я спрашиваю, может ли кто-нибудь ориентировать меня или показать мне пример кода, чтобы понять это!MEX-файл на выходной импульс в петле на DAQ-плату

ответ

0

Я написал небольшой пакет winsock, используя функции mex некоторое время назад, потому что материал tcpip у Matlab имел проблемы с отправкой больших объемов данных (например, изображений). Я не знаю много о функциях mex, кроме того, что я узнал, чтобы заставить этот пакет работать, и даже это было довольно давно. Но вот некоторые из моих заметок от ранее и одна из функций, которые я написал в качестве примера, который, надеюсь, может помочь вам.

Прежде чем писать какие-либо функции mex, вам нужно настроить Matlab для их компиляции. Вы делаете это, набрав «mex -setup» в командной строке matlab и следуя инструкциям, которые она дает. Я сконфигурировал его для использования компилятора Visual Studio (обратите внимание, что для этого варианта необходимо установить Visual Studio).

После настройки компилятора вы скомпилируете свои mex-функции, введя «mex filename.cpp» в командной строке Matlab. Это создает файл .mexw32 (предположим, 32-разрядный), который использует Matlab, когда вы вызываете вашу функцию mex.

Чтобы написать функцию mex, вы пишете m-файл, чтобы объявить его и предоставить комментарии, а также файл cpp с фактической реализацией.

В качестве примера, вот один из м-файлов, которые я написал:

function sendColorImage(socketHandle, colorImage) %#ok<*INUSD> 
%SENDCOLORIMAGE Sends a color image over the given socket 
% This function sends a color image over the socket provided. The image 
% is really just an MxNx3 matrix. Note that this function sends the 
% image data in the order in which Matlab stores it (non-interlaced 
% column major order), which is different from most other languages. 
% This means the red values for every pixel will be sent first, then the 
% green values, then the blue values. Furthermore, the scanlines read 
% from the top of the image to the bottom, starting at the left side of 
% the image. 
% 
% socketHande - A handle to the socket over which the image should be 
% sent. This handle is returned by the openSocket function when the 
% socket is first created. 
% 
% colorImage - An MxNx3 matrix containing the image data. This matrix 
% should be in the same format as a matrix loaded using Matlabs imread 
% function. 
% 
% This is a mex function and is defined in its corresponding .cpp file. 

А вот соответствующий CPP файл. Обратите внимание, что я только что составил свой собственный формат сообщения и имел соответствующий код C#, который разбирал его обратно из потока байтов.

// Instruct the compiler to link with wsock32.lib (in case it isn't specified on the command line) 
#pragma comment(lib,"wsock32.lib") 

#include "mex.h" 
#include <winsock2.h> 
#include <cstdio> 
#include "protocol.h" 

// See the corresponding .m file for documentation on this mex function. 
void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]){ 

    char errorMessage[100]; 

    // Validate input and output arguments 
    if(nlhs != 0) 
     mexErrMsgTxt("There are no output arguments for this function."); 
    if(nrhs != 2) 
     mexErrMsgTxt("Must have 2 input parameters: the socket handle and the MxNx3 image matrix"); 
    if(!mxIsClass(prhs[0], "uint32")) 
     mexErrMsgTxt("The first input parameter should be a uint32 containing the socket handle"); 
    if(!mxIsClass(prhs[1], "uint8") || mxGetNumberOfDimensions(prhs[1]) != 3 || mxGetDimensions(prhs[1])[2] != 3) 
     mexErrMsgTxt("The 2nd input parameter should be an MxNx3 uint8 matrix containing the image"); 

    // Get the socket handle 
    SOCKET socketHandle = (int)(mxGetPr(prhs[0])[0]); 

    // Set up the header 
    int frameWidth = mxGetDimensions(prhs[1])[1]; 
    int frameHeight = mxGetDimensions(prhs[1])[0]; 
    int header[3]; 
    header[0] = COLOR_IMAGE; 
    header[1] = frameWidth; 
    header[2] = frameHeight; 

    // Send the header 
    int bytesSent; 
    int totalBytesSent = 0; 
    while(totalBytesSent < 3*sizeof(int)){ 
     bytesSent = send(socketHandle, ((char*)header) + totalBytesSent, 3*sizeof(int) - totalBytesSent, 0); 
     if(bytesSent == SOCKET_ERROR){ 
      sprintf(errorMessage, "Error sending image header over the socket: %d", WSAGetLastError()); 
      mexErrMsgTxt(errorMessage); 
     } 
     totalBytesSent += bytesSent; 
    } 

    // Send the image 
    totalBytesSent = 0; 
    int totalBytesToSend = frameWidth * frameHeight * 3; 
    char* dataPointer = (char*)mxGetData(prhs[1]); 
    while(totalBytesSent < totalBytesToSend){ 
     bytesSent = send(socketHandle, dataPointer + totalBytesSent, totalBytesToSend - totalBytesSent, 0); 
     if(bytesSent == SOCKET_ERROR){ 
      sprintf(errorMessage, "Error sending image over the socket: %d", WSAGetLastError()); 
      mexErrMsgTxt(errorMessage); 
     } 
     totalBytesSent += bytesSent; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^