您的位置:首页 > 编程语言 > MATLAB

利用UDP matlab与VS实时通信传输数据

2015-11-14 10:32 2481 查看
本人的第一篇博客,在这获得过大家的帮助,也希望自己可以将自己所学的传递给有需要的人。

最近在做将VS与matlab进行实时传递数据,主要利用UDP进行。为什么使用UDP,以及UDP的好处这里也不再赘述,想了解的可以参看下面引用的博文。下面分开来说VS中C#的程序和matlab的程序。

(1)C# UDP通信的实现

主要参考http://blog.csdn.net/ecocn/article/details/8278926

里面有很详细、全面的关于UDP的介绍,以及一个C#窗体函数的源代码,本人运行过,没有错误。感兴趣的话可以下下来运行一个,当然了,这时候需要一个UDPclient端,推荐使用一款SocketTool的软件,可以参考SoccketTool使用方法,创建一个UDP Client即可与上C#的程序进行通信。这里贴上VS的窗体函数运行的界面,这里127.0.0.1表示本机的ip地址,而172.19.3.15为本机的ipv4地址,因此为都可作为本机地址,其中默认端口为8888,可点击修改按钮进行修改。



(2)matlab(GUI)中UDP通信的实现

考虑到操作起来会比较方便,所以在matlab中使用GUI来实现此部分的功能。GUI界面如下示:



因为我需要实时的通信,即VS与matlab实时的传递数据,所以在matlab中UDP部分需要实时监听对方有没有数据发送,可以采用两个方案:

一、使用timer函数。二、使用udp的callback函数。这两种方法我都尝试过,都可以用,但是考虑到我的现在的工程项目里面需要比较强的实时性,而timer函数不太适合,因而这里采用udp的callback函数。其中udp的callback函数有两个一个为ByteAvailableFcn和DatagramReceivedFcn,前者适用于serial、TCP/IP、UDP等,后者只适用于UDP

,两者的使用方法是一样的,这里采用了后者。

主要代码段:

GUI的OpeningFcn部分:

function UDPcall_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
%发送数据端的参数设置
ipMAT='127.0.0.1'; %本地数据端的ip和端口号,本地的
portMAT=20000;
ipVS='127.0.0.1'; %接收数据端的ip和端口号,远端的
portVS=30000;
set(handles.localIP,'string',num2str(ipMAT));
set(handles.remoteIP,'string',num2str(ipVS));
set(handles.remotePort,'string',num2str(portVS));
set(handles.localPort,'string',num2str(portMAT));
set(handles.receive_edit1,'string',' ');
global count num1 abnorm;
handles.udpTransmit=udp(ipVS,portVS,'LocalPort',portMAT);%MAT发送给VS
fopen(handles.udpTransmit);%打开udp
handles.udpTransmit.ReadAsyncMode = 'continuous';%异步通信时,连续读串口数据
set(handles.udpTransmit,'DatagramTerminateMode','on');
handles.udpTransmit.DatagramReceivedFcn={@updateUDP,handles};
guidata(hObject, handles);


udpcallback函数部分:

function updateUDP(obj,event,handles)%udp的回调函数
t1=clock;
global  total count  num2 num1;
if handles.udpTransmit.BytesAvailable == 0
return
end
%%%%%%%%%%%%%%%%%读取显示部分%%%%%%%%%%%%%%%%%%
strdata=fscanf(handles.udpTransmit);%文本方式读VS发送的数据
strtime=datestr(now,'HH:MM:SS');%显示时分秒
strtime=[strtime,10];%添加换行符10
strdata1=[strdata,10];
dispdata=[strtime,strdata1];
set(handles.receive_edit1,'string',dispdata);%显示时间和数据
datanum=str2num(strdata);%将文本型转化成double类型
%%%添加自己需要的操作%%%

etime(clock,t1)%查看每次传输数据的时间开销


关闭函数的callback 函数

function closebutton_Callback(hObject, eventdata, handles)
fclose(handles.udpTransmit);
delete(handles.udpTransmit);
clear ipMAT portMAT ipVS portVS;
close();%关闭GUI窗口


以此变可以进行matlab与VS的通信了,界面如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: