Как я могу использовать Delphi Prism для связи через последовательный порт?

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

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

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

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

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

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

Спасибо много,


person ThN    schedule 15.06.2011    source источник
comment
Вы имеете в виду связь с последовательным портом на вашем компьютере или связь с последовательным портом на сервере, на котором будет работать веб-приложение? На данный момент это одна и та же машина, но, предположительно, когда вы ее развернете, их не будет.   -  person R0MANARMY    schedule 15.06.2011
comment
@RRUZ Хороший момент. Итак, вы хотите сказать мне, что любые инструменты и компоненты, которые вы используете в своей программе для Delphi.NET или ASP.net, в конечном итоге будут использоваться сервером, а не клиентским компьютером. Видите ли, из всех чтений, которые я сделал, нигде не упоминается такая информация. Спасибо.   -  person ThN    schedule 16.06.2011
comment
..I meant to ask how one would use the serial port component that came with the Delphi Prism IDE. какие компоненты? Можете ли вы упомянуть о достоинствах одного из этих компонентов?   -  person RRUZ    schedule 16.06.2011
comment
Мне неизвестны какие-либо компоненты последовательного порта для Delphi Prism.   -  person Warren P    schedule 16.06.2011
comment
Насколько мне известно, я не устанавливал никаких компонентов в Delphi Prism IDE, кроме как просто установил Delphi Prism на свой компьютер.   -  person ThN    schedule 16.06.2011


Ответы (1)


Вместо того, чтобы искать компонент призмы Delphi для последовательного порта, вы должны искать компонент последовательного порта .Net. Вы можете использовать эту статью _ 1_ в качестве руководства по этой теме.

Теперь проверьте этот класс призмы 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: этот код должен запускаться на стороне сервера.

person RRUZ    schedule 15.06.2011
comment
Я хотел сказать, что мне трудно использовать компонент последовательного порта, поставляемый с IDE. Компонент у меня уже есть. - person ThN; 16.06.2011
comment
В IDE нет последовательного порта. - person Warren P; 16.06.2011