0

私は Delphi Prism を初めて使用します。実際、私は初心者だとさえ言えますが、ここ 10 年間、Delphi でプログラミングしてきました。以前のバージョンの Delphi で作成されたレガシー ソフトウェアを Delphi 2010 に移植することができました。これで、Delphi Prism を使用して、Delphi.Net for the WEB (ASP.NET) 用の同じソフトウェアを作成する準備が整いました。私の人生では、Delphi Prism がどのように機能するかについての全体的なレイアウトやアイデアを理解できないようです。チュートリアルと例を確認し、Stackoverflow でサンプルとコードを検索しました。それでも、Delphi Prism IDE をいじるだけで丸 1 週間費やしたにもかかわらず、Delphi Prism を理解できないようです。

オンラインの誰かが、ウィンドウ スタンドアロン プログラムを使用して、.NET フレームワークを使用するだけで完全に Web 用に作成できると述べました。

現在、シリアルポート コンポーネントを使用して Web フォームを作成し、comport で通信しようとしています。Web ページ コントロール (ボタン、ラベル) を設計することができました...プログラムはコンパイルされ、localhost が開始された状態で読み込まれます。ブラウザにボタンが表示されますが、シリアルポートで通信できません。

私は混乱しています。私はそれを正しくしていないようです。Delphi Prism SerialPort コンポーネントの使用例を教えてください。

インストールしたのか、それとも Delphi Prism IDE に付属していたのかはわかりません。ただし、Delphi Prism を起動した後でツールボックスの Components セクションを調べると、SerialPort というコンポーネントが表示されます。どうやら、これは Microsoft .NET Framework の一部です。

Delphi Prism IDE に付属しているシリアル ポート コンポーネントをどのように使用するのかを尋ねるつもりでした。

どうもありがとう、

4

1 に答える 1

3

シリアル ポート用の Delphi プリズム コンポーネントを探す代わりに、.Netシリアル ポート コンポーネントを探す必要があります。この記事SerialPort (RS-232 Serial COM Port) in C# .NETは、このトピックに関するガイドとして使用できます。

次に、シリアル ポート通信を処理するこの Delphi プリズム クラスを確認します (データの受信のみ)。

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 に答える