We use TCP/UDP/IP Toolbox 2.0.5 to read and write data from/to a TCPIP port. It’s fast and reliable. The version we use is 2.0.5. Below is a matlab sample script showing how to connect to another computer (called ETG-4000) with TCPIP :
%Connect LAN Port fid=pnet('tcpconnect','172.17.101.1',51027); if pnet(fid,'status')==-1 disp('Connection Failed.'); return; end; %Write to port (i.e. Send Command for ETG-4000) pnet(fid,'printf','++Hello ETG-4000\r\n'); %Read from port (i.e. Receive Command from ETG-4000) welcomeMessage = pnet(fid,'read',74); disp('Press ETG-4000 START Button!'); %//////////////////////// Get ETG-4000 Data //////////////////////////////// while(1); buff1=pnet(fid,'read',4, 'uint8'); hsize=bread(buff1,'int32'); if hsize==12;%Data is comming! %disp('hsize is 12'); %///////////////////////// Data Number /////////////////////////////// buff2=pnet(fid,'read',4, 'uint8'); num=bread(buff2,'int32');%Number of Data %disp(['num: ' num]); %disp(['num of buff2 ' num2str(num)]); %//////////////////////////// Data Size:428 //////////////////////////// buff3=pnet(fid,'read',4, 'uint8'); dsize=bread(buff3,'int32'); %disp(['dsize ' dsize]); %/////////////////////////// Hb Data //////////////////////////////// for ch=1:52;%Oxy buff4=pnet(fid,'read',4, 'uint8'); oxy(ch,num)=bread(buff4,'single'); % disp(oxy(ch,num)); end; for ch=1:52;%Deoxy buff5=pnet(fid,'read',4, 'uint8'); deo(ch,num)=bread(buff5,'single'); end; %//////////////////////////// Mark /////////////////////////////// buff6=pnet(fid,'read',2, 'uint8'); mark(num)=bread(buff6,'int16'); %/////////////////////////// Time //////////////////////////////// buff7=pnet(fid,'read',10); time(num,:)=char(buff7); %disp(time(num,:)) end; %(check status) Push ETG-4000 Stop Button stat=pnet(fid,'status'); if(stat == 0) break; end end; pnet('closeall'); clear fid;
bread is a function to convert binary data to a certain data type:
function y = bread(x, type) y = typecast(x, type); % work for pnet
One important thing is you need specify the 4th parameter (datatype) when you read data in pnet(‘read’). The default value is ‘char’ and if your incoming data is float, you will find any value in a byte which is bigger than 127 is reset to 255. Specifying the 4th parameter to ‘uint8’ solves this problem. I spend a day to find this.
Hi Xu!
Thanks for the nice script! Works very well 🙂
Do you know if it is possible to start and stop the ETG-4000 by using TCP/IP? I want my stimulus program to trigger the start, instead of having someone pressing the ETG-4000 START button…
Never did that. We use serial port to start/stop ETG recording (as well as to put markers).
Dear Xu Cui,
Tnank you for your script.But I have some trouble here.
Can it work on the win32 system? Does it need to mix matlab and C plus programming, since my error is : Invalid MEX-file ‘F:\program_BCI\2011-3\tcp_udp_ip\pnet.mexw32’.
My matlab version is 7.1. win32 system
Do you have any suggestion?
Thank you very much!!
I’m not sure. You don’t need C programming though. MEX file is always a nightmare – it is so system dependent. You may want to contact the original author of pnet.