Lazarus free pascal - Seri port

 


Seri port veya RS232 bağlantı, hala endüstriyel cihazlar (etiket yazıcı, barkod okuyucu, PLC vs.) tarafından desteklenmektedir. Usb bağlantıda, temizlikçi kadın problemi varken, seri port kablosu sokete vidalanırsa sapasağlam yerinde duracaktır. (temizlikçi kadın problemi: küçük bir dokunuşla usb kablo yuvasından çıkabilmektedir)

Lazarus tanıtım yazısında hazırladığımız gibi küçük bir form hazırladık. TCP/IP bağlantıda olduğu gibi seri port kütüphanesi de utf-8 karakerleri destekliyor. Yani ş, ğ gibi karakterleri etiket yazıcıya bir sıkıntı olmadan gönderebiliyoruz. LazSerial paketini Package > Online Package Manager... penceresinden Lazarus'a kuruyoruz. 

Windows'da Lazarus normalde C:\lazarus dizinine kurulur. Paket yöneticisinin indirdiği kütüphaneler ise C:\Users\kullanici\AppData\Local\lazarus\onlinepackagemanager\packages dizinine kurulurlar. Bu dizin içinde bulunan, test veya example (örnek) isimli dizinleri inceleyip kütüphaneyle ilgili örnek programlara ulaşabilirsin.

Bir adet TLazSerial komponentini forma yerleştirelim. Solda LazSerial1'in özellikleri görülmektedir. Bu isim, özellikler penceresinden değiştirilebilir.




Form özelliklerinde Position için poScreenCenter özelliğini seçelim ki uygulama çalışınca form ekranın ortasında belirsin. LazSerial1'e çift tık yaparsak LazSerial1RxData prosedürü kod bölümüne eklenecektir. Bu prosedür, seri porta bilgi geldiğinde çağırılır.




LazSerial1'in Events (olaylar) sekmesinde OnRxData dışında OnStatus olayı bulunur. OnStatus yanındaki boş kutuya tıklayınca ... çıkacaktır. ... sembolüne tıklayınca kod editöründe LazSerial1Status prosedürü oluşacaktır. Bu prosedür, seri port bağlantısı için port açıldığında veya kapatıldığında çağırılacaktır.



unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, LazSerial,
  LazSynaSer, iniFiles;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    LazSerial1: TLazSerial;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure LazSerial1RxData(Sender: TObject);
    procedure LazSerial1Status(Sender: TObject; Reason: THookSerialReason;
      const Value: string);
  private

  public

  end;

var
  Form1: TForm1;
  IniFile: TiniFile;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.LazSerial1RxData(Sender: TObject);
var
  str : string;
begin
  str:= LazSerial1.ReadData;
  Memo1.Lines.Add(str);
end;

procedure TForm1.Button1Click(Sender: TObject); // Open port butonu
begin
  try
    LazSerial1.Device:= Edit1.Text;
    LazSerial1.Open;
  except
    on E: Exception do
    ShowMessage(E.Message) ;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject); // Close port butonu
begin
  LazSerial1.Close;
end;

procedure TForm1.Button3Click(Sender: TObject); // Send butonu
begin
  LazSerial1.WriteData(Edit2.Text + #13#10);
end;

procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  if LazSerial1.Active then
    LazSerial1.Active := false ;
  IniFile.WriteString('Settings', 'Port', Edit1.Text);
  IniFile.Free;
  Application.Terminate;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  IniFile := TIniFile.Create(
  ExtractFilePath(Application.EXEName) + 'SerTest.ini');
  Edit1.Text:= IniFile.ReadString('Settings', 'Port', 'COM1'); ;
end;

procedure TForm1.LazSerial1Status(Sender: TObject; Reason: THookSerialReason;
  const Value: string);
begin
  case Reason of
    HR_SerialClose : Memo1.Lines.Add('Port ' + Value + ' closed');
    HR_Connect : Memo1.Lines.Add('Port ' + Value + ' connected');
    HR_Wait : Memo1.Lines.Add('Wait : ' + Value) ;
  end ;
end;

end.     

Port açmak için kullanılan Button1Click prosedüründe try-except kullanıldı. Örneğin Edit1'de COM1 yazıyor ama kullanmanız gereken port COM3. Bu durumda program hata verir veya çakılır. Try-except bu durumdan bizi kurtararak programın çakılmamasını sağlar.

Edit1'de yazan COM numarası SerTest.ini isminde bir dosyaya yazıldığından, program kapatılıp açılsa bile bu numara dosyada saklanacaktır. Programla ilgili ayarları bu şekilde ini dosyasına yazabiliyoruz.




Seri port programını test etmek için Hercules programında Serial sekmesini kullanıyoruz. com0com programı, bilgisayara sanal olarak iki tane seri port kurmaktadır. Birini, Lazarus programımıza diğerini Hercules'e tanımladığımızda iki program haberleşebilmektedir.

Yorumlar

Bu blogdaki popüler yayınlar

VBA - Mscomm (seri port) ile veri loglama

RJ45 2 - Novexx barkod yazıcıya, S7-1200 plc ile etiket yazdırma

Lazarus free pascal - Tanıtım