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.
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
Yorum Gönder