如何解决如何使用Delphi Prism进行串行端口通信?
| 我对Delphi Prism非常陌生。实际上,您甚至可以说我是新手,但是过去十年来我一直在Delphi编程。我能够将在Delphi的早期版本中编写的旧软件移植到Delphi2010。现在,我准备使用Delphi Prism为Web(ASP.NET)的Delphi.Net编写相同的软件。对于我的一生,我似乎无法理解Delphi Prism的总体布局或想法。我浏览了教程和示例,甚至在Stackoverflow上搜索了示例和代码。尽管我已经花了整整一个星期的时间来玩Delphi Prism IDE,但我似乎还是不太了解Delphi Prism。 网上有人说,可以使用一个窗口独立程序,仅使用.NET框架就可以完全将其编写为Web。 现在,我只是在尝试使用SerialPort Component创建一个Web窗体以在comport上进行通信。我能够设计网页控件(按钮,标签)...该程序在本地主机启动的情况下进行编译和加载。我在浏览器上看到了按钮,但无法在串行端口上通信。 我很困惑。看来我做错了。有人可以给我一个使用Delphi Prism SerialPort组件的示例吗? 我不确定是否安装了它,或者它是否随Delphi Prism IDE一起提供。但是,如果在启动Delphi Prism后在“组件”部分下的工具箱中查看,则会看到一个名为SerialPort的组件。显然,它是Microsoft .NET Framework的一部分。 我的意思是问如何使用Delphi Prism IDE随附的串行端口组件。 非常感谢解决方法
代替寻找串行端口的Delphi棱镜组件,必须寻找.Net串行端口组件。您可以将本文“ 0”用作该主题的指南。
现在检查此处理串口通信的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,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:此代码必须从服务器端运行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。