如何使用Delphi Prism进行串口通信?

时间:2011-06-15 14:09:18

标签: .net delphi serial-port delphi-prism

我对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附带的串口组件。

非常感谢,

1 个答案:

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