Lazarusでバイナリーデータの送受信のテストをしました。
環境
Win10+Lazarus IDE v2.0.6
背景
Lazarusを使ってシリアルポートを操作するツールを作ろうと思い、簡単にシリアル通信ができるコンポーネントLazSerialを試してみました。
シリアル通信で接続された機器にコマンドを送り、機器からのレスポンスをシリアル通信で受信するツールになります。
シリアル通信でやり取りするデータは文字以外に文字として画面に表示できないコードのやり取りをする必要があります。
LazSerialから送信する場合は、
function WriteBuffer(var buf; size: integer): integer;
を使うと文字以外のコードを送信することができます。しかし受信のほうは、
// function ReadBuffer(var buf; size: integer): integer;
とReadBufferがコメント化されていて受信する手段がありません。
function ReadData: string;
を使って文字として受信しても正しく受信できません。
代替え手段
そこでLazSerial内で使っているLazSynaser ユニットのTBlockSerialをつかうことにしました。
方法
TBlockSerialを使うために、アプリケーション作成時に
一端、LazSerialをForm上において保存し、Form上に置いたLazSerialを削除します。
メニューの Project>Project InspectorでLazSerialPortがRequired Packageに残っていることが確認できます。
Form上にLazSerialコンポーネントを置いて、削除しなくてもProject InspectorのRequired Packageを右クリックして
LazSerialPortをAddしても同じことだとおもいます。

TBlockSerialはコンポーネントではないのでコンポーネントパレットで見ることはできません。
使用時にFormCreate内でTBlockSerial.Create; としインスタンス化します。
また、FormClose内でFreeを実行して削除します。

COM PORTをオープンする部分は以下のようになります。
ComboBox1にはCOM1,COM2,COM3,COM4… のようなCOMポートを表す文字が入っています。
ポートを閉じるときは、ser.CloseSocket; を使います。
procedure TForm1.MenuItem5Click(Sender: TObject); // Port>Open
begin
// serialポートのOpen
try
ser.CloseSocket;
ser.RaiseExcept:=True;
ser.Connect(ComboBox1.Items[ComboBox1.ItemIndex]);
ser.Config(9600,8,’N’,0,false,false);
ShowMessage(‘通信回線をオープンしました。PORT: ‘+ComboBox1.Items[ComboBox1.ItemIndex]);
except
ShowMessage(‘通信回線をオープンできませんでした‘);
end;
end;
バイナリデータを送信するときは、送信用バッファ
TxBuf : array [0..255] of Byte;
を準備して、この配列の中に送信データをセットして
ser.SendBuffer(@TxBuf,256);
とします。10バイトしか送信しない場合はser.SendBuffer(@TxBuf,10) とします。
バイナリデータを受信する場合は、受信用バッファ
RxBuf : array [0..255] of Byte;
を準備して、
ser.RecvBufferEx(@RxBuf,256,500);
または
ser.RecvBuffer(@RxBuf,256);
とします。 RecvBufferExはタイムアウト付きの関数で、 RecvBufferはタイムアウトなしです。
受信データがあるかどうかはser.CanRead(100)を使って読み出すべきデータがあるかどうかをチェックできます。
この関数の引数はタイムアウト時間(ms)になります。
今回のツール作成ではPCからコマンドを送信したときだけ相手からのレスポンスがあるので
コマンド送信後ser.CanReadでレスポンスを待って、受信データを処理するというようにしました。
通信相手から不定期にデータが送られてくる場合はEventで受信データを処理する必要がありますが、
Eventについては次回紹介したいとおもいます。


コメント