0

我对德尔福棱镜非常陌生。事实上,你甚至可以说我是一个新手,但在过去的 10 年里,我一直在用 Delphi 编程。我能够将以前版本的 Delphi 编写的遗留软件移植到 Delphi 2010。现在,我准备使用 Delphi Prism 为 WEB (ASP.NET) 的 Delphi.Net 编写相同的软件。对于我的一生,我似乎无法理解 Delphi Prism 如何工作的整体布局或想法。我浏览了教程和示例,甚至在 Stackoverflow 上搜索示例和代码。尽管如此,我似乎还是无法理解 Delphi Prism,尽管我已经花了整整一周的时间来玩 Delphi Prism IDE。

网上有人说,只要用.NET框架,就可以拿一个window独立程序,完全为web编写。

现在我只是想用 SerialPort 组件创建一个 webform 来在 comport 上进行通信。我能够设计网页控件(按钮,标签)......程序编译并加载 localhost 启动。我看到浏览器上的按钮,但它不会在串行端口上通信。

我很困惑。看来我做得不对。有人可以给我一个 Delphi Prism SerialPort 组件使用的例子吗?

我不确定是我安装了它还是它随 Delphi Prism IDE 一起提供。但是,如果您在启动 Delphi Prism 后查看组件部分下的工具箱,您将看到一个名为 SerialPort 的组件。显然,它是 Microsoft .NET Framework 的一部分。

我的意思是问如何使用 Delphi Prism IDE 附带的串行端口组件。

非常感谢,

4

1 回答 1

3

不必为 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:此代码必须从服务器端运行。

于 2011-06-15T18:16:52.233 回答