15 Ağustos 2012 Çarşamba

Delphi and Port Serial RS-232






OK sekarang kita akan membuat contoh sederhana interfacing PC denganmikrokontroler lewat port serial.
Di contoh ini, mikrokontroler digunakan untuk mengendalikan 4 LED dan membaca 4 saklar. Tugas komputer adalah mengendalikan ke-8 LED tersebut dan membaca posisi saklar.
Program Mikrokontroler
Mikrokontroler menggunakan sebuah AT89S52 dan menggunakan bahasa assembler. Berikut skematiknya.
Skematik ini tidak menampilkan rangkaian RS-232, hanya langsung menggunakan symbol COMPIM. Untuk rangkaian RS-232 converter bisa diliat di sini.
AT89S52 bekerja pada frekuensi 11.0592 MHz dan baud rate pada 9600 bps. Tugas utama mikro adalah selalu mengecek data dari port serial, sub-rutinCommand_Receive dan memproses perintah yang diterima, sub-rutinCommand_Process. Perintah menggunakan 1 karakter ASCII, ‘A’ – ‘G’.
Berikut adalah daftar perintah dari PC:
  1. ‘A’: toggle LED yang terhubung ke P2.0
  2. ‘B’: toggle LED yang terhubung ke P2.1
  3. ‘C’: toggle LED yang terhubung ke P2.2
  4. ‘D’: toggle LED yang terhubung ke P2.3
  5. ‘E’: semua LED ON
  6. ‘F’: semua LED OFF
  7. ‘G’: membaca posisi saklar, jika saklar ON semua mikro akan mengirim ’00′ dan jika OFF semua mikro akan mengirim ’0F’.
Program mikro bisa di download di sini.
Pada dasarnya, mikro memfungsikan port serial pada mode 1 dengan baud rate 9600 bps. Pada saat dimulai program langsung menyalakan semua LED. Dan mikrokontroler sebagian besar menghabiskan waktunya untuk membaca command dari port serial.
Program Komputer

Tampilan program komputer bisa dilihat di bawah ini dan source codenya bisa di download di sini.
Bagian utama dari program Delphi adalah:
Prosedure EnumComport
Prosedure ini adalah prosedure untuk membaca registry untuk mengetahui COM apa saja yang terinstal di komputer. Berikut cuplikan kodenya:
procedure TForm5.EnumComPorts(Ports: TStrings);
var
KeyHandle: HKEY;
ErrCode, Index: Integer;
ValueName, Data: string;
ValueLen, DataLen, ValueType: DWORD;
TmpPorts: TStringList;
begin
ErrCode := RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
‘HARDWARE\DEVICEMAP\SERIALCOMM’,
0,
KEY_READ,
KeyHandle);
if ErrCode <> ERROR_SUCCESS then
begin
//raise EComPortExt.Create(‘EnumComPorts’,CError_RegError, ErrCode);
MessageBox(Handle,’Registry Error’,pchar(Application.Title),MB_OK or MB_ICONERROR);
exit;
end;
TmpPorts := TStringList.Create;
try
Index := 0;
repeat
ValueLen := 256;
DataLen := 256;
SetLength(ValueName, ValueLen);
SetLength(Data, DataLen);
ErrCode := RegEnumValue(
KeyHandle,
Index,
PChar(ValueName),
{$IFDEF DELPHI_4_OR_HIGHER}
Cardinal(ValueLen),
{$ELSE}
ValueLen,
{$ENDIF}
nil,
@ValueType,
PByte(PChar(Data)),
@DataLen);
if ErrCode = ERROR_SUCCESS then
begin
SetLength(Data, DataLen);
TmpPorts.Add(Data);
Inc(Index);
end
else
if ErrCode <> ERROR_NO_MORE_ITEMS then
MessageBox(Handle,’Registry error’,pchar(Application.Title),MB_OK or MB_ICONERROR);
until (ErrCode <> ERROR_SUCCESS) ;
TmpPorts.Sort;
Ports.Assign(TmpPorts);
finally
RegCloseKey(KeyHandle);
TmpPorts.Free;
end;
end;
prosedur ini digunakan di event Combobox1 onDropdown:
procedure TForm5.ComboBox1DropDown(Sender: TObject);
begin
EnumComPorts(ComboBox1.Items);
end;
Pada saat ComboBox1 mengalami even Ondropdown, maka akan ditambahkan item2 baru berupa nama com yang terinstal di PC.
Prosedur Buka COM
ApdComport dibuka oleh button1, button dengan caption “Open”. Berikut cuplikan programnya:
procedure TForm5.Button1Click(Sender: TObject);
var
ComNo:integer;
S:string;
begin
if ComboBox1.ItemIndex=-1  then
begin
MessageBox(Handle,’Please select a COM’,pchar(Application.Title),
MB_OK or MB_ICONERROR);
ComboBox1.SetFocus;
exit;
end;
S:=Copy(ComboBox1.Text,4,Length(ComboBox1.Text)-3);
ComNo:=StrToInt(s);
try
ApdComPort1.ComNumber:=ComNo;
ApdComPort1.Open:=true;
Except
Port_State:=false;
end;
end;
Pertama program mengecek apakah COM sudah dipilih dengan membaca ComboBox1.Itemindex, jika bernilai -1, berarti belum ada com yang dipilih. Program akan menampilkan pesan error. Jika sudah ada com yang terpilih, program akan mengambil nomor comnya, dengan membuang string “COM”.
Lalu apdComport coba dibuka dengan membuat property open menjadi true. Jika gagal, misal karena com yang bersangkutan telah dipakai oleh aplikasi lain, maka sebuah variabel Port_State akan bernilai false. Variable ini digunakan untuk mengecek apakah com telah sukses dibuka atau tidak. Setiap pengiriman atau penerimaan data akan selalu mengecek variable ini. Pengiriman baru bisa dilakukan apabila com telah sukse dibuka, jika tidak akan error.
Menyalakan atau Mematikan LED
Menyalakan atau mematikan LED dilakukan dengan mengirim perintah yang telah ditentukan di atas. LED bisa diatur secara individu atau secara bersamaan. Misal untuk untuk mengatur LED yang terhubung ke P2.0 dilakukan dengan mengirim karakter “A”:
procedure TForm5.CheckBox1Click(Sender: TObject);
begin
if not Port_State then exit;
ApdComPort1.Output:=’A';
end;
Sedangkan program untuk menyalaka semua LED:
procedure TForm5.Button3Click(Sender: TObject);
begin
if not Port_State then exit;
ApdComPort1.Output:=’E';
end;
Prosedur Membaca Saklar
Untuk membaca saklar, pertama program akan mengirim perintah membaca saklar, kemudian membaca data yang dikirim oleh mikro.
procedure TForm5.Button5Click(Sender: TObject);
var
S:string;
TheData,code: integer;
begin
if not Port_State then exit;
ApdComPort1.Output:=’G';
S:= ReadSerialData(100);
val(‘$’+S,TheData,code);
Label2.Caption:=’SW1 OFF’;
Label3.Caption:=’SW2 OFF’;
Label4.Caption:=’SW3 OFF’;
Label5.Caption:=’SW4 OFF’;
TheData:= not TheData;
if (TheData and 1 = 1)  then
Label2.Caption:=’SW1 ON’;
if (TheData and 2 = 2)  then
Label3.Caption:=’SW2 ON’;
if (TheData and 4 = 4)  then
Label4.Caption:=’SW3 ON’;
if (TheData and 8 = 8)  then
Label5.Caption:=’SW4 ON’;
end;
Program pembacaan data dilakukan di fungsi ReadSerialData:
function TForm5.ReadSerialData(TimeOut: integer): string;
var
i: integer;
begin
Result:=”;
while ApdComPort1.InBuffUsed=0  do
begin
Dec(TimeOut);
Sleep(1);
Application.ProcessMessages;
if TimeOut=0  then exit;
end;
Sleep(10);
for I := ApdComPort1.InBuffUsed downto 1 do
Result:=Result+ApdComPort1.GetChar;
end;
Fungsi ini akan membaca data yang diterima oleh port serial selama waktu tertentu,TimeOut. Buffer input port serial dibaca dulu (InBuffUsed), apabila selalu 0 dalam waktu TimeOut, berarti tidak ada data. Jika ada maka data dibaca per karakter (byte) melalui perintah ApdComport.GetChar. Data yang diterima akan selalu ASCII. Misal jika semua saklar pada posisi ON maka data yang diterima adalah “0F”. Program harus mengecek data yang diterima tersebut untuk menentukan semua posisi saklar.
 

Hiç yorum yok: