Delphi dan Sistem Embedding – Port Serial (RS-232): Contoh Pertama

OK sekarang kita akan membuat contoh sederhana interfacing PC dengan mikrokontroler 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-rutin Command_Receive dan memproses perintah yang diterima, sub-rutin Command_Process. Perintah menggunakan 1 karakter ASCII, ‘A’ – ‘G’.

Berikut adalah daftar perintah dari PC:

  • ‘A’: toggle LED yang terhubung ke P2.0
  • ‘B’: toggle LED yang terhubung ke P2.1
  • ‘C’: toggle LED yang terhubung ke P2.2
  • ‘D’: toggle LED yang terhubung ke P2.3
  • ‘E’: semua LED ON
  • ‘F’: semua LED OFF
  • ‘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.

Source Code Download

26 Responses

  1. Kang, mohon bantuan..
    bagaimana cara mengatasi “Privileged Instruction” pada Delphi under Win XP? Saya saat ini sedang mengerjakan tugas akhir yg menggunakan delphi untuk interface mikrokontroler..
    Pada saat di run under Win 98 berhasil, tp di XP tidak bisa..
    Nuhun..

    • “Privileged Instruction”? Akses port pakai bahasa assembler ya?

      Memang di XP dan windows NT (versi Windows 2000 ke atas) akses port di user mode tidak diijinkan, aplikasi yang dibuat pkaia delphi adalah user mode. Akses port atau alamat memori tertentu hanya diijinkan lewat kernel mode dalam hal ini driver.
      Oleh karena itu kalau mau akses port harus melalui driver..saya juga dulu pernah mengalami hal yang sama, saat itu saya membuat downloader mikro S52 under windows 98 dan menggunakan assembler untuk mengakses port parallel, pas di running di XP, ada error.
      Ada banyak komponen Delphi untuk mengakses port under windows XP.
      Saya dulu pakai smallport, bisa download di
      http://www.delphipages.com/comp/smallport-2053.html

      Kenapa nga lewat port serial aja? se[erti cotoh program saya ini

  2. Project Saya ini melalui serial kok kang.. Saya pake komponen serial Comport di delphi 7..
    Sebenarnya Saya ingin menguji komunikasi serial ini seperti project yg akang buat diatas.. tp pas Saya download komponen serial APDcomport nya, Saya bingung nginstallnya, ada perbedaan isi dr file hasil download dg tutorial yg akang buat..
    jadi saya buat program sederhana dg Comport untuk menguji komunikasi serialnya, tp tetap saja muncul error tsb..
    Merujuk ke jawaban akang di post lain mengenai cara menginstal APDcomport , Saya tidak menemukan file bpl yg akang maksud.. mohon di tutor kang cara menginstalnya..
    terima kasih banyak.

    • Jika anda mendownload komponen tapro maka tpapro_5.00.zip. Ectrack saja.
      Akan menghasilkan beberapa folder, di antaranya adalah folder Package. Di dalamnya akan ada lagi folder-folder sesuai versi delphi, D7, D2005, D2007 dan D2010.

      Maaf keterangan saya sebelumnya menyesatkan, yang saya maksud adalah file package (dpk). Buka saja file dpk sesuai versi Delphi Anda, terus ikuti cara-cara instalasi seperti di postingan terdahulu..

      Smoga berhasil..

  3. Saya menggunakan Delphi 7.. ketika Saya buka file AsyncPro.dpk ataupun dclAsyncPro.dpk dan klik install, muncul pesan error:

    [Fatal Error] OoMisc.pas(3887): Could not create output file ‘%DCU%\OoMisc.dcu’

    itu bagaimana ya kang?

  4. mas, ketika sample programny saya runing kursor error mengarah dibagian uses “OoMisc, AdPort”
    itu kira-kira mengatasinya simana ya Mas?

  5. padahal saya sudah berhasil install komponennya Mas…

  6. Pesan errornya gimana?

  7. tu mas waktu waktu compile programnya.

  8. Mas kalau pake usb to serial sama saja atau ada yang di ubah???
    Thanks sblumnya…

    • sama aja,,,USB to serial kan nanti ke detectnya sebagai COM..saya juga klo nyoba pakai USB to Serial

  9. kang program mikro Contoh1.asm wakt sy compile ko’ ad baris yang error mohon bantuannya,
    sy bingung klo pakek bahasa asm.
    maklum baru blajar

    Trimakasi….

  10. sy pakek software copiler M IDE-51.
    waktu sy compile keluar
    ” illegal control statement ”
    1 error detected

    trimaksih mas..

  11. trimakasih mas.

    ilmunya sangat bermanfaat.

  12. Makasih kang…. udah ngasih ilmu yang bermanfaat

    kunjungi blog q : http://mazmuhtar.worpress.com

  13. Kang, contoh programnya dibuat pake delphi berapa?
    soalnya saya pake delphi 7 kok error, padahal komponennya pada saat instalasi tidak muncul error.
    kalau contoh programnya saya open d delphi 7, muncul error “Invalid Resource File : Error Reading File” kemudian kalau saya running (F9) muncul error “[Fatal Error] uContoh1.pas(7): File not found: ‘OoMisc.dcu'”
    kira2 knp ya Kang?
    terima kasih sebelumnya..

    • Saya pakainya Delphi 2007, sepertinya tidak bisa langsung dibuka di Delphi7.

      Kalau mau dibuka di Delphi7, coba bikin project baru aja, terus programnya di copy paste aja

  14. salam kenal mas… contoh yang mas tampilkan di atas tersebut menggunakan bahasa assembly ya mas. tlong dong mas untuk sourccode bascom…
    ni email saya mas: aneuk.atjeh12@gmail.com

    mohon dengan sangat mas bantuannya, waktu saiai 2 bulan lagi untuk selesaikan project

    terima kasih mas

  15. mas pas aku buka programnya pake delphi
    muncul kotak dialog igrone..apa sih maksudnya?
    apa ada komponen delphi yang harus dimasukin dulu?
    ke email aku yah mas unuckhvrebex@gmail.com

    makasih sebelumnya…

  16. Sukses Install, dari kmarin cari2 installernya ga bisa diinstall semua
    Makasih Mas

  17. mw tanya ini kan di buat dgn port serial…. nah klw menggunakan port pararel gmn? dpt tgs dr dosen nih..

Leave a comment