EDA365电子论坛网

标题: Matlab与C语言的应用接口程序 [打印本页]

作者: Lionoon    时间: 2020-3-3 13:47
标题: Matlab与C语言的应用接口程序

Matlab与C语言的应用接口程序

5 M( C. [' I" p. q

、理解几个常用的socket函数
1 [$ b- m4 j; u9 O" ^

#include
5 Z- g0 _+ r2 k. W( Q7 }& f
#include
, @' L' _- N7 B" D
int socket(int domain,int type,int portocol);

  o* I& u( j6 t6 X3 \& ?
domain指所使用的协议族(family)可以为AF_UNIX和AF_INET,一般只用AF_INET(指Internet)type指所用的传输类型,可以为SOCK_STERAM(面向连接的TCP),和SOCK_DGRAM(面向无连接的udp)
' ]$ x1 H$ o% u/ `* x' s
int bind(int s,const struct sockaddr *address,size_t address_len);
* [3 l( k' C6 {% s
s为socket返回的文件描述符
$ }1 X1 a7 a$ {& o7 S0 e$ Q
address为协议族名称和其他信息
6 |" s9 Y/ H. t+ }% _
具体结构为struct sockaddr_in{

( H2 Y. o+ v" y% A  O* i
short sin_family;/*协议族
4 c* T% T+ |: U

u_short sin_port;/*端口*/9 @. U+ Q1 s, |. W, q9 F: y+ B
struct in_addr sin_addr;/*地址*/* L5 @( k, g9 K5 [0 I
char sin_zero[8];
/ v8 H3 ~! n2 d! ~) \, Y};
2 L% w1 I+ b4 W1 K  i; uint listen(int s,int backlog);0 G# Q! m  e$ c
backlog为容许的请求数目* \( M) X% e3 g% d* L0 F: A
int accept(int s,struct sockaddr *address,int *address_len);( V. j4 m4 b$ a+ [0 k7 s, f
这里的前两个参数同上
& F* \/ X6 e5 c" D0 l* m: oaddres_len是要传递一个记有结构大小的地址
3 R6 q! ~  x6 e* m4 W; Lint connect(int s,struct sockaddr *address,size_t address_len);2 |8 G4 J! m) J6 Q; K) I" [) k4 U
这里的参数意义同bind

- e4 ^' G& A( k

2.理解建立程序的一般调用过程


# B6 W: A0 ^5 H$ o- a* }

要建立一个处理连接的服务器端程序,首先要调用socket函数创建一个socket,返回一个文件句柄fd,使以后对它的操作就象对普通文件设备一样读写。

6 b6 y1 \2 s' W6 \3 j+ A

由于是服务器端必须对一个断口进行监听其他机器的请求,所以接下去调用bind函数,传入刚才的fd,定义好地址和端口,由于是要接受来自任何host的连接所以应讲sin_addr赋为INADDR_ANY,port为你所设定的端口。


4 d- S" ]- l4 X, L7 Z& {

注意:这里的地址和端口是网络字节顺序,所以要调用htonl,htons完成主机字节顺序
. b0 C: A* _9 u; a到网络字节的转变


: b+ Z: t' `! E. N

接下来就是监听listen,调用accept接受来自客户端的请求,accpet返回连接后的文件描述符,你就可以用它进行收发信息(对应于read,write)这样的一个过程就是socket->bind->listen->accpet->Read,write3 }1 T& V  i0 V4 D, X6 o
而对于客户端则是socket->connect->read,write


: Q6 p9 u! A1 v( R3 Y$ F. ]

三、C语言程序MEX文件实例

. e" z) r: q- W2 L1 Q$ r" l" ^

MATLAB 5 API提供了一系列程序来处理MATLAB所支持的各种数据类型,每一种数据类型都有对应函数共你使用来处理对应的数据。下面给出一个简单的C语言程序和与之对应的MEX文件代码,该程序的功能是将标量x加倍。

$ s" S- D1 f4 e0 q7 L% C) @

#include "math.h"! t% _, i# o$ T/ Q! q& Y" N
void TImestwo(double y[], double x[])
+ h8 G7 P( A' d{3 Z3 F3 L" }" [# S9 G, E1 s3 w1 ]
y[0]=2.0*x[0];
7 v; p+ _1 S1 r5 {/ Y! Breturn;- L7 B' R/ I4 q. ^( R) f
}


. n) s: E: j6 _0 y

下面是与C语言程序功能相同的MEX文件:
# b+ S8 b5 N1 Q) d) r7 a#include "mex.h". \4 p5 o. b" H* \1 Z9 a3 E
void TImestwo(double y[], double x[])
5 a) c: U. X; V: F6 e9 q' c{
4 D' {) i: P) u2 q4 By[0]=2.0*x[0];4 }) w, e% g* V/ D
}8 h" F2 \& o9 {1 Y6 n4 k( V+ d
void mexFuncTIon(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
. s: y  {8 W9 N% x8 P! n; i{& Y/ X. n+ T6 B
double *x, *y;$ R0 u* C  U+ I( p
int mrows, ncols;" C5 S7 X0 t2 m( V: @7 `% V
/*检查正确的参数数目*/' I1 c# |  |  Z4 j, I5 E
if(nrhs!=1){6 ~2 ]& Y; ^, Y/ g0 D3 x5 i& a
mexErrMsgTxt("需要一个输入参数.");
5 m% {* Z2 K2 N% j8 ]}9 Q- i" J; K' n
else if(nlhs>1){" Z# t$ d8 i3 T2 b' B7 G
mexErrMsgTxt("输出参数太多.");
2 O* e' c/ z& I}
  M+ i& l1 \" p+ N) B/*输入变量必须是非复数类型的标量*/
3 B1 Y  I* [$ imrows=mxGetM(prhs[0]);
% p) G9 {7 ?# Rncols=mxGetN(prhs[0]);) ]- c0 ~, {1 y: c/ C
if(!mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) || !(mrows==1 && ncols==1)){- v2 H" U( D% B& x
mexErrMsgTxt("输入变量必须是非复数类型的标量.");
+ A5 E/ E4 ^% I* ?( H, V' t}
8 m5 ^& \3 y, }" M/*为返回参数创建矩阵*/
& @, v/ `4 e, n3 z+ t7 M2 @( Zplhs[0]=mxCreateDoubleMatrix(mrows, ncols, mxREAL);2 L2 ^3 y* }4 u& Y* Y
/*分配输入输出参数的指针*/
5 Y3 m2 A: K+ f0 `2 w# E- v( b2 mx=mxGetPr(prhs[0]);" f3 ?: {  Y, {# ^: @0 |) a
y=mxGetPr(plhs[0]);  K  ]+ E( F8 c: @5 u
/*调用TImestwo子函数*/8 _7 l3 N$ C4 m$ ]
timestwo(y, x);
+ [# c5 e, {, K}

  i  z" I; S& S' q. S* }6 X* W0 \( A

C语言是在编译的时候检查函数参数。MATLAB可以在M函数中传递任意数量和类型的参数,MEX文件也是如此,不过在程序中必须可靠地处理输入输出参数的数目。如果将上面的MEX文件命名为timestwo.c,就可以对它进行编译和链接,在MATLAB命令窗口下输入:* @! J" r& N, P5 _( H! O7 {
mex timestwo.c


  {5 J7 s6 X! K+ Z5 z: k  P

这是产生MEX文件timestwo.***所必需的步骤,该文件的扩展名所运行的系统平台的类型。Windows系统下,扩展名为dll。此时,就可以象调用M函数一样调用timestwo了。9 Y/ }( c% P! Y. q9 M2 O
在MATLAB命令窗口中输入:, F, e- F+ k& m/ t
x=2;
' _: {+ e* U: Q2 Z1 F/ C" y* yy=timestwo(x);
0 M% b  I( Y, V- q. F- I就可以得到:
1 o! K' Z4 A  }% |  ^) iy=4;

3 M4 B0 p" b# `9 J" S# X. [

四、小 结


$ [/ y6 Z6 X5 _& g  w3 K

MEX文件虽然具有较强大的功能,但并不是对所有的应用都恰当。MATLAB是一个高效率的编程系统,特别适合于工程计算、系统仿真等应用。它的最大优点就是将人们从繁杂的程序中解放出来。因此,能够用M文件完成的程序,应尽量使用MATLAB编写,除非遇到必须使用MEX文件的情况。

8 T. K  `# \& L+ x

MATLAB的应用编程接口是一个功能强大的系统,除了调用C或Fortran程序,还可以实现从MATLAB环境中输入输出数据、在MATLAB中和其他程序建立客户/服务器关系等功能。


0 ^9 X2 n4 n3 l  N& Q/ g/ i8 J: ^7 j/ s: }6 c0 r9 p# `/ U" K% c( K

作者: xixihahaheihei    时间: 2020-3-3 16:15
Matlab与C语言的应用接口程序




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2