シリアル ポート用の Delphi プリズム コンポーネントを探す代わりに、.Netシリアル ポート コンポーネントを探す必要があります。この記事SerialPort (RS-232 Serial COM Port) in C# .NET
は、このトピックに関するガイドとして使用できます。
次に、シリアル ポート通信を処理するこの Delphi プリズム クラスを確認します (データの受信のみ)。
namespace SerialComm;
interface
uses
System.IO.Ports, //this namespace contains classes for controlling serial ports.
System.Collections.Generic,
System.Linq,
System.Text;
type
DataMode = (Text,Hex);
TSerialComm = public class
private
CurrentDataMode : DataMode;
method port_DataReceived( sender : object; e : SerialDataReceivedEventArgs);
public
ComPort : SerialPort := new SerialPort();
method OpenPort();
method ClosePort();
method Init;
end;
implementation
//here you receive the data
method TSerialComm.port_DataReceived( sender : object; e : SerialDataReceivedEventArgs);
method ByteArrayToHexString(data : Array of Byte) : string;
Begin
var sb : StringBuilder := new StringBuilder(data.Length * 3);
for each b in data do
sb.Append(Convert.ToString(b, 16).PadLeft(2, '0').PadRight(3, ' '));
result:=sb.ToString().ToUpper();
end;
Var
data :string ;
begin
if not ComPort.IsOpen then exit;
try
// text mode
if (CurrentDataMode = DataMode.Text) then
begin
data := comport.ReadExisting();
//do your stuff here
end
else
///binary (hex) mode
begin
var bytes : Integer := ComPort.BytesToRead;
var buffer : Array of byte := new byte[bytes];
ComPort.Read(buffer, 0, bytes);
Data:= ByteArrayToHexString(buffer);
//do your stuff here
end;
except
on ex: exception do begin
OutLog('port_DataReceived: ' + ex.Message + ' ** Trace: ' + ex.StackTrace);
exit;
end;
end;
end;
method TSerialComm.OpenPort();
begin
CurrentDataMode := DataMode.Text;
OutLog('Open Port COM');
if ComPort.IsOpen then ClosePort();
ComPort.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
//ComPort.ReadTimeout:=100;
ComPort.BaudRate := Convert.ToInt32(_Settings.BaudRate);
ComPort.DataBits := Convert.ToInt32(_Settings.DataBits);
var aStopBits : StopBits := StopBits(Enum.Parse(typeof(StopBits), _Settings.StopBits, true));
ComPort.StopBits := aStopBits;
var aParity : Parity := Parity(Enum.Parse(typeof(Parity), _Settings.Parity, true));
ComPort.Parity := aParity;
ComPort.PortName := _Settings.PortName;
ComPort.Open();
if ComPort.IsOpen then
OutLog('Port '+ComPort.PortName+' Open')
else
OutLog('was not possible open the port '+ComPort.PortName);
end;
method TSerialComm.ClosePort();
begin
if ComPort.IsOpen then
begin
ComPort.DataReceived +=nil;
ComPort.ReadExisting;
ComPort.Close();
end;
end;
method TSerialComm.Init;
begin
ComPort.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
end;
注 1 : これOutLog
は単にログに記録する関数です。この関数の呼び出しにコメントを付けることができます。
注 2 : このコードはサーバー側から実行する必要があります。