【问题标题】:How I can use Delphi Prism to Serial Port Communication?如何使用 Delphi Prism 进行串口通信?
【发布时间】:2011-09-15 14:04:57
【问题描述】:

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

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

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

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

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

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

非常感谢,

【问题讨论】:

  • 您的意思是与您机器上的串行端口通信,或者与将运行 Web 应用程序的服务器上的串行端口通信?目前它们是同一台机器,但大概在您部署它时,它们不会是。
  • @RRUZ 好点。因此,您的意思是告诉我,您在 Delphi.NET 或 ASP.net 程序中使用的任何工具和组件最终都将由服务器机器使用,而不是由客户端机器使用。看,在我所做的所有阅读中,他们都没有提到这样的信息。谢谢。
  • ..I meant to ask how one would use the serial port component that came with the Delphi Prism IDE. 哪些组件?你能提到其中一个组件的名称吗?
  • 我不知道 Delphi Prism 有任何串行端口组件。
  • 据我所知,除了在我的电脑上安装 Delphi Prism 之外,我还没有在 Delphi Prism IDE 中安装任何组件。

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


【解决方案1】:

您必须寻找 .Net Serial Port 组件,而不是为 Serial Port 寻找 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:此代码必须从服务器端运行。

【讨论】:

  • 我的意思是说我很难使用 IDE 附带的串行端口组件。我已经有了组件。
  • IDE 没有自带串口。
猜你喜欢
  • 2023-03-03
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多