我对Delphi Prism非常陌生。事实上,你甚至可以说我是一个新手,但我已经在德尔福进行了最后10年的编程。我能够将以前版本的Delphi中编写的遗留软件移植到Delphi 2010.现在,我准备使用Delphi Prism为Delphi.Net编写用于WEB(ASP.NET)的相同软件。对于我的生活,我似乎无法理解Delphi Prism如何工作的整体布局或想法。我已经阅读了教程和示例,甚至在Stackoverflow上搜索了样本和代码。尽管如此,我似乎无法理解Delphi Prism,尽管我已经花了整整一周的时间来玩Delphi Prism IDE。
网上有人说,只需使用.NET框架就可以使用一个窗口独立程序并完全为Web编写。
现在我只是尝试使用SerialPort组件创建一个webform,以便在comport上进行通信。我能够设计网页控件(按钮,标签)......程序编译并加载localhost启动。我看到浏览器上的按钮,但它不会在串口上通信。
我很困惑。看起来我做得不对。有人能给我一个Delphi Prism SerialPort组件使用的例子吗?
我不确定我是安装它还是随附Delphi Prism IDE。但是,如果在启动Delphi Prism后查看“组件”部分下的工具箱,您将看到一个名为SerialPort的组件。显然,它是Microsoft .NET Framework的一部分。
我想问一下如何使用Delphi Prism IDE附带的串口组件。
非常感谢,
答案 0 :(得分:3)
您必须寻找 .Net 串行端口组件,而不是为串行端口寻找Delphi prism组件。您可以使用本文SerialPort (RS-232 Serial COM Port) in C# .NET
作为该主题的指南。
现在检查处理串口通信(仅接收数据)的delphi prism类
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:此代码必须从服务器端运行。