不必为 Serial Port 寻找 Delphi prism 组件,而必须寻找.Net Serial Port 组件。您可以使用本文SerialPort (RS-232 Serial COM Port) in C# .NET
作为有关此主题的指南。
现在检查这个处理串行端口通信的德尔福棱镜类(只接收数据)
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:此代码必须从服务器端运行。