MathworksのFileExchangeにサンプルプログラムが投稿されています。
jp.mathworks.com
基本構成はVC++などのサンプルプログラムと一緒で、DLLを指定し、
f = NET.addAssembly('C:\FTD2XX_NET.dll');
FTDIをオープンし、
fo=FTD2XX_NET.FTDI; pause( 1);%準備ができるのを待つ r = OpenByIndex(fo,0);
もろもろの設定をし、
x = uint8([0,0,0]);%FTDIからポートに出力する値を入れる場所を用意 allBitsOutputMask = uint8(255); % 8ビット全てを出力に使う bitBangMode = uint8(1); %1は非同期BitBangモード resetMode = uint8(0); % リセットは0 SetBaudRate(fo,115200);%ボーレート(転送レート)設定 r = SetBitMode( fo, allBitsOutputMask, bitBangMode);%モード設定
書き出しをします。
for n=0:255 x(1) =uint8(n);%符号なし8ビットにする r = Write( fo, x, 1, 0);%書き出す end r = Close(fo);%ポートを閉じます
となるわけですが、上記のやり方だとデータを1つずつ送ることになり、転送速度がとても遅いです。
実測したところでは、1000個/秒くらいでしょうか。
(8bitデータが1秒間に1000個という意味)。
転送速度を上げるには、データを配列で渡してあげる必要があります。
Xdata=0:255;%データは256ケだとする datanum=uint32(256);%転送したいデータ数 datadum=uint32(0);%転送できたデータ数 %%%途中を省略します。 %送るデータのフォーマットに合わせる TXdata=NET.convertArray(Xdata,'System.Byte'); %PCからFTDIから送る [r,dnum] = Write(fo,TXdata,datanum,datadum); %%%以下、省略
となります。全部書くと、以下のとおりです。
Xdata=0:255;%データは256ケだとする datanum=256; datanum=uint32(datanum); datadum=uint32(0); %dllが置いてある場所を指定 f = NET.addAssembly('C:\FTD2XX_NET.dll'); fo=FTD2XX_NET.FTDI; FT_OK = FTD2XX_NET.FT_STATUS.FT_OK; pause( 1); r = OpenByIndex(fo,0); if( r ~= FT_OK) disp(r); pause(1); return; end pause( 1); allBitsOutputMask = uint8(255); % '1' bit is output bitBangMode = uint8(1); % '1' mode is async bitbang resetMode = uint8(0); % terminate bitbang SetBaudRate(fo,115200); r = SetBitMode( fo, allBitsOutputMask, bitBangMode); %送るデータのフォーマットに合わせる TXdata=NET.convertArray(Xdata,'System.Byte'); %PCからFTDIから送る [r,dnum] = Write(fo,TXdata,datanum,datadum); r = Close(fo);
転送速度は1Mくらいに向上するようです。1000倍ですね。