本人的第一篇部落格,在這獲得過大家的協助,也希望自己可以將自己所學的傳遞給有需要的人。
最近在做將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發送給VSfopen(handles.udpTransmit);%開啟udphandles.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 returnend%%%%%%%%%%%%%%%%%讀取顯示部分%%%%%%%%%%%%%%%%%%strdata=fscanf(handles.udpTransmit);%文本方式讀VS發送的資料strtime=datestr(now,'HH:MM:SS');%顯示時分秒strtime=[strtime,10];%添加分行符號10strdata1=[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的通訊了,介面如下: