Как я могу использовать Delphi Prism для связи через последовательный порт? - PullRequest
0 голосов
/ 15 июня 2011

Я очень новичок в Delphi Prism. На самом деле, вы даже можете сказать, что я новичок, но я программировал в Delphi последние 10 лет. Я смог перенести наше устаревшее программное обеспечение, которое было написано в предыдущей версии Delphi, на Delphi 2010. Теперь я готов написать то же самое программное обеспечение для Delphi.Net для WEB (ASP.NET) с использованием Delphi Prism. На самом деле я не могу понять общую схему или идею того, как работает Delphi Prism. Я прошел учебники и примеры и даже искал в Stackoverflow образцы и коды. Тем не менее, я не могу понять Delphi Prism, хотя я уже потратил целую неделю, просто играя в Delphi Prism IDE.

Кто-то онлайн сказал, что можно взять отдельную оконную программу и написать ее полностью для Интернета, просто используя .NET Framework.

Прямо сейчас я просто пытаюсь создать веб-форму с компонентом SerialPort для связи на компорте. Мне удалось создать элементы управления веб-страницы (кнопки, метки) ... Программа компилируется и загружается с локального хоста. Я вижу кнопки в браузере, но он не связывается с последовательным портом.

Я в замешательстве. Похоже, я не делаю это правильно. Может кто-нибудь привести пример использования компонента Delphi Prism SerialPort?

Я не уверен, установил ли я его или он поставлялся с Delphi Prism IDE. Однако, если вы посмотрите на панель инструментов в разделе «Компоненты» после запуска Delphi Prism, вы увидите компонент с именем SerialPort. По-видимому, это часть Microsoft .NET Framework.

Я хотел спросить, как можно использовать компонент последовательного порта, поставляемый с Delphi Prism IDE.

Большое спасибо,

1 Ответ

3 голосов
/ 15 июня 2011

Вместо того, чтобы искать компонент призмы 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. Этот код должен выполняться со стороны сервера.

...