Sunday 1 March 2015

INFO :: Cara Membuat COMPILE C++ Sendiri Dengan NOTEPAD++



COMPILE C++ WITH NOTEPAD++


1) Install Notepad++ silahkan download disini  setelah selesai download install deh, sperti biasa next, netx terus sampai finish.

2)  Install Borland C++ googling aja mas. kalo yang ane pake sih Borland c++ versi 5.02. kita cuma ambil buat compiler doang bro.

3) Kita butuh sebuah plugin its called NppExec silahkan dicek di tab plugins noh ada diatas.


4)  Kalo udah teristall buka tab plugins > NppExec  lalu centang "follow $(CURRENT_DIRECTORY)". that's it..

5) Terakhir kita akan setting compilernya. caranya??
-Buka Notepad++  silahkan bikin program "hello world".. silahkan tulis scriptnya..

#include 
#include 
main 
{
cout<<"hello world";
getch();
}

compile dengan cara klik tab Plugins > NppExec > Execute.. or tekan F6 biar lebih  cepet gtu..
otomatis akan ada printah untuk menyimpan file, simpan file dengan nama "hello.cpp"  INGAT!! ".cpp" jangan sampai lupa!!

selanjutnya akan keluar command for execute isi kan kolom command dengan
bcc32 "$(FULL_CURRENT_PATH)" "$(NAME_PART)"

lalu save dengan nama "c++ compiler" setelah tekan OK maka file ok akan di compile like this..


nah selesai deh di compile... nah selamat mencoba.. :)
jika kalian ingin melihat hasil c++ yang kita compile tadi silah kan ketik di console npp_run "nama_file" kalo dalam kasus tadi berarti kita ketik npp_run hello  like this...
 hasilnya kita lihat


selamat mencoba GOOD LUCK semoga bermanfaat ;).

Sumber : arifazik06

INFO :: Proses Dan Cara Membuat Sebuah Compiler


Berikutnya adalah: bagaimana kalau kita ingin membuat compiler? Interpreter hanya mengeksekusi program, dan tidak menghasilkan output. Compiler perlu mengoutputkan kode dalam bahasa assembly, yang kemudian akan dikompilasi oleh assembler. Mempelajari assembly yang lengkap butuh waktu, apalagi jika kita ingin menargetkan berbagai prosessor, sehingga membuat compiler yang mengoutputkan ke assembly langsung tidaklah mudah.
Karena sulitnya bahasa assembly, dalam tahap-tahap berikutnya, kita tidak akan mengoutputkan bahasa assembly langsung, tapi akan menggunakan bantuan LLVM (Low Level Virtual Machine). Tapi untuk tahap-tahap awal, saya bisa menunjukkan bagaimana output assembly langsung bisa dibuat, apalagi dalam bahasa yang sangat sederhana seperti ini.
Pertama saya akan membahas dulu apa bedanya sebuah compiler dengan interpreter. Sebuah compiler menghasilkan kode assembly dari sebuah program. Compiler tidak menghasilkan file executable. Diberikan program Z dalam bahasa X, compiler membuat versi assembly dari program Z tersebut. Jadi compiler hanya menerjemahkan sebuah bahasa ke ekivalennya dalam bahasa assembly.

compiler.png
Tugas mengubah ke bahasa mesin dilakukan oleh assembler. Assembler mengubah instruksi assembly menjadi bahasa mesin. File yang dihasilkan compiler ini disebut sebagai object code, file ini sudah dalam bahasa mesin, tapi belum bisa dieksekusi.
assembler.png
Mengapa belum bisa? karena masih ada fungsi-fungsi yang belum diketahui definisinya. Misalny, ketika Anda membuat program dalam C, apakah Anda mengimplementasikan sendiri fungsiprintf? biasanya tidak, karena fungsi itu sudah ada di Library. Proses berikutnya adalah menggabungkan library dengan object code untuk membentuk executable. Proses ini dilakukan oleh program linker.
linker.png
Yang paling penting bagi kita bukanlah urutan proses tersebut, tapi apa yang ada dalam sebuah compiler yang membedakannya dari interpreter. Sebagian komponen compiler sama dengan interpreter. Bagian parser sama persis, sehingga kita bisa memakai parser dari tutorial bagian sebelumnya.
compiler detail.png

Algoritma

Algoritma dasar untuk compiler masih sama dengan interpreter. Pada versi interpreter, kita langsung menjalankan program, nah di versi compiler ini, kita menghasilkan teks di setiap langkah (teks bahasa assembly). Kode assembly tidak langsung dituliskan ke file, tapi ditampung dulu dalam sebuah StringBuffer. Untuk memudahkan, saya akan menggunakan pendekatan berbasis stack (stack based) dan bukan register based (akan saya jelaskan nanti alasannya). Jika Anda tertarik, Anda bisa membaca Wikipedia mengenai Stack machine dan Register machine.
Di awal kita perlu membuat sebuah template, yang merupakan kerangka program. Berikutnya, di setiap langkah kita menghasilkan instruksi yang sesuai, misalnya ketika menemui sebuah integer, kita menghasilkan instuksi untuk menaruh integer tersebut di stack. Ketika menemui instruksi untuk menambah dua ekspresi, kita panggil secara rekursif kode program kita untuk menghasilkan assembly bagi operand kiri dan operand kanan, lalu kita hasilkan instruksi untuk menjumlahkan kedua hasilnya.

Memakai Assembly

Kita akan membatasi bahasan kita untuk Intel x86 32 bit saja. Untuk mengimplementasikan compiler dalam bahasa sederhana tersebut, kita hanya perlu 6 instruksi dan 2 register. Instruksi pertama adalah push <reg> atau push <nilai> untuk menaruh nilai ke stack. Lalu pasangannya adalah pop <reg> untuk menaruh isi stack ke register. Berikutnya kita perlu instruksi add untuk menjumlah, sub untuk mengurangi, dan imull untuk mengalikan integer. Kita juga perlu instruksicall untuk memanggil fungsi printf milik library C, serta ret untuk kembali dari fungsi utama ke sistem operasi.
Kita akan menggunakan syntax assembly AT&T, dan saya hanya mengetes ini di Linux. Ada beberapa tutorial assembly untuk Linux, misalnya http://asm.sourceforge.net/howto/Assembly-HOWTO.html, Anda bisa membaca aneka tutorial jika Anda benar-benar blank mengenai assembly. Setiap file output pasti punya kerangka dasar seperti ini:
.section    .rodata
.mytext:
.string "Result %d\n"
.text
.globl main
.type main, @function
main:
/*aneka macam perintah akan diletakkan di sini*/
ret
.size main, .-main
Untuk mengevaluasi ekspresi, kita selalu menggunakan stack. Contohnya begini, Jika kita memiliki (1 * 3) + (4 - 5), kita akan memiliki tree, dengan + sebagai akar (root), anak pertama akan mengandung subtree dengan * di root serta 1 dan 3 di anak, sedangkan anak kedua memiliki subtree dengan - di root serta 4 dan 5 sebagai anak.
example comp 1.jpg
Ketika menemui '+', kita ingin agar ekpresi di sebelah kiri (1 * 3) dievaluasi dulu, lalu sebelah kanan di evaluasi (4-5), dan hasil evaluasi keduanya kita jumlahkan. Pertama, kita evaluasi 1 * 2. Ketika menemui *, kita ingin agar bagian kiri (1) dan (3) dievaluasi, lalu hasilnya baru dikalikan. Ketika mengevaluasi 1, maka hasilnya adalah instuksi assembly untuk menaruh 1 di stack, ketika menemui 3, maka hasilnya juga instruksi assembly untuk menaruh hasilnya di stack. Perhatikan awalan $ di syntax AT&T artinya angka 1 dan 3 merupakan literal:
pushl $1 
ISI STACK:
1
pushl $3
ISI STACK:
1 3
Ketika menemui *, kita pop 2 angka dari stack, lalu kita kalikan kedua angka tersebut, lalu taruh hasilnya di stack:
popl e%ax
ISI STACK:
1
Isi EAX = 3

popl %ebx
ISI STACK:
kosong
Isi EBX = 1

imull %ebx, %eax ; artinya EAX = EAX * EBX
ISI STACK:
kosong
Isi EAX = 3

pushl %eax

ISI STACK:
3
Sekarang kita evaluasi (4-5), langkahnya sama dengan di atas (jika tidak yakin, Anda bisa menjalankan compilernya), di akhir, kita akan mendapati isi stack seperti ini:
ISI STACK:
3 -1
Lalu operasi penjumlahan dilakukan
popl %eax --> ambil dari stack (-1)
popl %ebx --> ambil dari stack (3)
addl %ebx, %eax --> EAX = EAX + EBX
pushl %eax --> masukkan hasilnya ke stack
Di akhir, kita ingin mencetak hasilnya. Untuk mudahnya, kita akan menggunakan library C. Anda juga bisa menggunakan cara khusus sebuah OS, misalnya di DOS Anda bisa menggunakan INT 21 Fungsi 9 dan di Linux Anda bisa memanggil syscall write. Tapi cara-cara tersebut tidak portabel. Library C sudah tersedia di aneka OS berbasis UNIX, jadi demi kesederhanaan artikel, saya akan memakai library C. Di C, mencetak sebuah integer mudah sekali, cukup printf("Result: %d\n", result). Di assembly ini juga tidak sulit, cukup perlu:
pushl  %eax
push $.mytext
call printf
popl %ebx
popl %ebx
Passing parameter dalam assembly dapat dilakukan via register atau stack (tergantung calling convention, dan jumlah parameternya, tapi itu tidak penting sekarang). Dalam kasus printf kita perlu menggunakan stack, parameter untuk printf dalam kasus ini ada dua, yang pertama adalah format string "Result: %d\n", yang saya letakkan di label .mytext, serta nilai integer yang akan kita cetak. Passing dilakukan terbalik, parameter terakhir dipush pertama.
Karena pushl %eax sudah dilakukan di akhir setiap ekspresi, maka kita tidak perlu mengulanginya. Seperti yang Anda lihat di bagian template, isi $.mytext adalah "Result: %d\n". Instruksi calldigunakan untuk memanggil printf. Fungsi printf di C merupakan fungsi khusus (jumlah parameternya bisa banyak), sehingga kita perlu membuang lagi nilai yang dipush dengan popl ke sembarang register (dalam hal ini saya pilih saja %ebx).

Menjalankan compiler

Anda bisa menjalankan compiler ini seperti menjalankan interpreter. Output compiler ini ada dua, yang pertama adalah file assembly .s (misalnya input adalah test.e, maka outputnya adalah test.e.s), dan file executable (file test.e.exe). Jika compiler gcc tidak tersedia di sistem, maka hanya satu saja outputnya (.s). Anda bisa melakukan assembling dan linking dengan:
gcc -m32 namafile.s -o namafile.exe
Secara otomatis program Java akan mencoba menjalankan perintah itu, tapi tidak akan berhasil jika gcc tidak ada di path. Parameter -m32 memaksakan agar kita menggunakan mode 32 bit meski di OS 64 bit (OS yang saya pakai 64 bit, tapi sebagian besar orang masih memakai 32 bit).
Anda bisa mempelajari dan membandingkan dengan output sebuah program dalam bahasa C. Menggunakan compiler GCC, Anda bisa mengoutputkan kode assembly untuk sebuah program dalam bahasa C seperti ini:
gcc -S namafile.c
hasilnya adalah namafile.s. Sebenarnya gcc selalu menghasilkan file assembly .s, tapi file ini dibuat di direktori sementara. Dengan opsi -S kita meminta agar membuat file .s di direktori saat ini dan meminta gcc berhenti setelah membuat file .s (tidak meneruskan tahap assembler dan linker).

Kode Program

Source code compiler lebih panjang dari source code interpreter (83 baris vs 60 baris). Kode-kode berikut ini ada pada file ExprComp.java. Di bagian main kita buat dulu template dasar file assembly yang akan dihasilkan:
        StringBuffer result = new StringBuffer();
result.append(".section .rodata\n");
result.append(".mytext:\n");
result.append(".string \"Result %d\\n\"\n");
result.append(".text\n");
result.append(".globl main\n");
result.append(".type main, @function\n");
result.append("main:\n");
el.compile(result);
result.append("ret\n");
result.append(".size main, .-main\n");
Lalu dibagian evaluasi (method compileExpr), kita perlu menghasilkan assembly yang sesuai, untuk integer:
           if (expr.getType()==ExprLexer.INT) {
result.append("pushl $"+expr.getText()+"\n");
return;
}
Untuk +,-,* semua perlu dua operand, jadi instruksi awalnya pasti sama, yaitu: hasilkan instruksi untuk kiri dan kanan, lalu pop dua operand ke eax dan ebx:
        if (expr.getText().equals("+") || expr.getText().equals("-")
|| expr.getText().equals("*")) {
compileExpr(result, (CommonTree)expr.getChild(0));
compileExpr(result, (CommonTree)expr.getChild(1));
result.append("popl %eax\n");
result.append("popl %ebx\n");
}
Berikutnya mudah, kalau + hasilkan addl, kalau - hasilkan subl, dan kalau * hasilkan imull:
        if (expr.getText().equals("+")) {
result.append("addl %ebx, %eax\n");
}
if (expr.getText().equals("-")) {
result.append("subl %eax, %ebx\n");
}
if (expr.getText().equals("*")) {
result.append("imull %ebx, %eax\n");
}
Hasilnya kita kembalikan ke stack:
            result.append("pushl   %eax\n");
Setelah sebuah ekspresi selesai, kita perlu mencetaknya
    void compileExpression(StringBuffer result, CommonTree expr) {
compileExpr(result, (CommonTree)expr.getChild(0));
result.append("push $.mytext\n");
result.append("call printf\n");
result.append("popl %ebx\n");
result.append("popl %ebx\n");
}
Jadi instruksi yang kita pakai benar-benar amat sedikit.
Program Java akan menyimpan hasil akhir ke file:
        String asmname = argv[0]+".s";
FileWriter fw = new FileWriter(asmname);
PrintWriter pw = new PrintWriter(fw);
pw.println(result.toString());
fw.close();
Lalu hasilnya dikompilasi:
        String command[] = {"gcc", "-m32", asmname, "-o", 
argv[0]+".exe"};
Process p = Runtime.getRuntime().exec(command);
p.waitFor();
Perhatikan bahwa jika kompilasi gagal atau berhasil, tidak akan ada pesan apapun. Anda hanya akan tahu bahwa kompilasi berhasil atau tidak dengan melihat apakah file .exe tercipta atau tidak. Silahkan tambahkan sendiri kode untuk melakukan pemeriksaan tersebut.

Terlalu sederhana

Instruksi yang dihasilkan oleh compiler ini sangat sederhana, namun sangat tidak efisien. Karena semua hanyalah konstanta (kita belum bisa menerima input dari user), maka sebenarnya yang penting hanyalah hasil akhir saja. Meski demikian, latihan ini penting sebelum masuk ke bahasa yang bisa memiliki variabel/identifier.
Ketika kita sudah bisa menerima input dari user, eksekusi berbasis stack kurang efisien. Sebuah prosessor memiliki beberapa register, dan penggunaan stack lebih lambat dari register. Misalnya kita punya 3 variabel, kita bisa meletakkan 3 variabel tersebut di register, tanpa perlu menyentuh stack sama sekali. Tapi masalah muncul ketika jumlah variabel semakin banyak. Jumlah register di prosessor terbatas (biasanya 16-32 register), jadi kita tetap perlu memakai stack ketika jumlah variabel semakin banyak. Kita harus dengan pintar mengatur, variabel apa yang masuk register dan apa yang masuk stack. Masalah ini dinamakan register allocation problem. Anda bisa membaca aneka buku dan paper untuk memahami masalah tersebut.
Kita juga harus memiliki pengetahuan assembly aneka prosessor untuk bisa membuat kode assembly yang baik. Masalahnya terutama adalah masalah optimasi, ada banyak cara untuk melakukan suatu hal (misalnya membagi dua bisa dilakukan dengan shift right satu bit), sebuah compiler yang baik harus bisa memilih instruksi terbaik untuk menghasilkan kode tercepat.
Di masa yang akan datang, saya akan menunjukkan bagaimana menggunakan LLVM, yang akan bisa mengoutputkan kode bahasa mesin, tapi kita sendiri tidak perlu memahami aneka prosessor. LLVM merupakan proyek yang sudah ada sejak 9 tahun yang lalu (tahun 2000), dan sudah didukung oleh banyak perusahaan besar (Adobe, Apple, dsb).

semoga bermanfaat ^_'

sumber : yohan.es

Praktek Pengenalan C#


Selamat Malam Permirsa jufrikablog kali ini saya akan memberi modul praktikum saya di mata kuliah program lanjut :D 


A.    Praktikum
1.       Set path Windows ke compiler. Caranya :
1.1 Klik Start -> my Computer, kemudian click kanan pada my computer pilih menu properties.
1.2 Di kotak dialog System Properties, Klik tab Advanced dan klik
Environment Variables.
1.3 Di bagian System Variables, klik Path dan klik Edit
1.4 Tekan tombol Home dan tekan tombol panah kanan beberapa kali. Cek
jika sudah ada tulisan yang mirip seperti
Microsoft.NET\Framework\vXXXX dimana XXXX adalah angka.
Apabila anda tidak menemukan tulisan tersebut, tekan tombol End, atau
anda menuju bagian akhir tulisan tersebut, tambahkan “;” diikuti path
buat compiler-nya. Di komputer saya seperti ini :
%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\
Wbem;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
1.5 Klik OK di tiap kotak dialog.





Saturday 28 February 2015

DELPHI7 :: Membaca SMS dari PC

Format PDU
Hal pertama yang saya bahas adalah, bahwa setiap pengiriman SMS, baik dari HP menuju operator, atau sebaliknya, selalu menggunakan format PDU (Protocol Data Unit), yaitu paket data dimana pesan SMS dikemas, bersama informasi tanggal, nomor tujuan, nomor pengirim, nomor operator, jenis skema SMS, masa valid SMS, dan beberapa hal lain (tergantung jenis paketnya).
Berikut ini adalah contoh PDU yang diterima oleh HP (New SMS atau Inbox):
07 91 2658050000F0 04 0C 91 265836164900 00 00 506020 31133180 04 C830FB0D
Dengan keterangan sebagai berikut:
Oktet / Digit HexaKeterangan
07Panjang atau jumlah pasangan digit dari nomor SMSC (service number) yang digunakan, dalam hal ini adalah 7 pasangan (14 digit berikutnya)
91Jenis nomor SMSC. Angka 91 menandakan format nomor internasional (misal +6281xxx). Untuk 081xxx menggunakan angka 81.
2658050000F0Nomor SMSC yang digunakan. Karena jumlah digit nomor SMS adalah ganjil, maka digit paling belakang dipasangkan dengan huruf F. Kalau diterjemahkan, nomor SMSC yang digunakan adalah +62855000000 (IM3)
04Oktet pertama untuk pesan SMS yang diterima
0BPanjang digit dari nomor pengirim (0C hex = 12 desimal)
91Jenis nomor pengirim (sama dengan jenis nomor SMSC)
265836164900Nomor pengirim SMS, yang jika diterjemahkan adalah +628563619400
00Pengenal protokol, dalam hal ini adalah 0
00Skema pengkodean SMS, juga bernilai 0
506020 311331 80Waktu pengiriman, yang berarti 05-06-02 (2 Juni 2005), dan jam 13:31:13. Sedangkan 80 adalah Timezone yang digunakan.
04Panjang dari pesan SMS, dalam hal ini adalah 4 huruf (dalam mode 7 bit).
C830FB0DPesan SMS dalam mode 7 bit. Jika diterjemahkan kedalam 8 bit, lalu dirubah ke ASCII, maka didapat pesan 'Halo'
Yah, itu adalah sekilas tentang PDU, yang sering dihadapi untuk berurusan dengan SMS. Kecuali jika HP yang anda gunakan mendukung AT+CMGF=1, yang berarti kita dapat berkomunikasi dengan HP dalam Mode Teks! seperti HP saya, SE T610 :-)
Kalau menggunakan mode teks, anda tidak berurusan dengan PDU, meski antara HP dengan operator masih menggunakan PDU.
Secara online, anda dapat menerjemahkan PDU kedalam mode teks, dengan menggunakan link ini:http://home.student.utwente.nl/
Koneksi ke PC
Selanjutnya, adalah menghubungkan HP anda dengan PC. Banyak alternatif untuk itu, diantaranya:
  • Menggunakan kabel data. Biasanya spesifik untuk setiap merk HP. Nokia punya sendiri, siemens juga punya, semoga anda juga punya :-)
    Kabel ini akan menancap di port COM, atau ada juga yang di USB port.
  • Menggunakan IrDA (Infrared). Nantinya akan tercipta sebuah port COM virtual.
  • Menggunakan Bluetooth, juga menciptakan port COM bayangan.
Yang sangat perlu diperhatikan, jika anda menggunakan kabel data sebagai alat koneksi, silakan lakukan di Windows 98, karena Direct Port Programming di Windows XP/2000 sangat rumit, dan tidak menjamin kebenarannya :-)
Anda boleh menggunakan HP jenis apapun, yang penting punya kabel datanya, dan musti support AT-Command.
Dulu saya sempat debat sama temen saya, tentang apakah semua HP support AT-Command. Sampai saat ini saya masih percaya kalau ada HP yang tidak support AT-Command.
HP yang saya gunakan adalah Siemens C35i, dengan kabel data serial hasil pinjaman :-)
Setelah punya HP dan kabelnya, silakan pasang ditempat yang seharusnya, dan pastikan HP dalam keadaan nyala.
Jika anda menggunakan IrDA atau Bluetooth, pastikan bahwa sudah tercipta port COM (biasanya dengan nomor tertinggi, misal COM4 atau COM5).
Programming
Silakan buka Borland Delphi. Saya sarankan untuk memakai Delphi versi 6 ke atas, karena ada fungsi SecondsBetween yang saya sukai :-)
Ketika pertama kali masuk delphi, ada 1 komponen yang mesti kita install terlebih dahulu, yaitu MS-Comm, yang digunakan untuk berkomunikasi dengan Port COM. Cara instalasi adalah sebagai berikut:
  • Dari IDE Delphi, pada menu Component, pilih menu Import Active-X Control
  • Pada pilihan obyek, silakan pilih MSCommXX.ocx, lalu tekan tombol Install
  • Akan muncul beberapa dialog berikutnya, pilih saja yes atau ok :-)
Setelah Active-X terinstall, pada Tab Palette Active-X, akan muncul sebuah tombol dengan gambar telepon. Klik dan letakkan komponen tersebut pada Form, maka akan tercipta sebuah obyek dengan nama MSComm1.
Komunikasi
Buat sebuah tombol (Command Button) pada Form, beri caption 'Konek'. Lalu pada event On-Click tombol tersebut, ketik program berikut ini:
procedure TForm1.Button1Click(Sender: TObject);
var waktu: tDateTime;
buffer: string;
konek: boolean;
begin
if MSComm1.PortOpen then
MSComm1.PortOpen := false;
MSComm1.CommPort := 1;
// isi dengan nomor COM
// yang terhubung ke HP,
// misal COM1, isi dengan 1
MSComm1.Settings := '19200,N,8,1';
// sesuaikan baudrate
// dengan HP anda.
// kebanyakan support 19200
MSComm1.InputLen := 0;
MSComm1.PortOpen := true;

Sleep(800);
waktu := now;
repeat
MSComm1.Output := 'ATE1'#13;
buffer := '';
repeat
buffer := buffer + MSComm1.Input;
until (Pos('OK', buffer) > 0) or
(Pos('ERROR', buffer) > 0)
or (secondsbetween(waktu, now) > 10);
until (Pos('OK', buffer) > 0) or
(secondsbetween(waktu, now) > 10);
Konek := (Pos('OK', buffer) > 0);
If Konek Then
MessageDlg('Sukses konek ke HP',
mtInformation, [mbOk], 0)
else
MessageDlg('Tidak dapat konek ke HP',
mtError, [mbOk], 0);
end;
Jalankan program, semoga tidak error. Lalu tekan tombol Button1. Jika koneksi sukses, yaitu jika HP merespon perintah 'ATE1' dengan ucapan 'OK', berarti koneksi dengan HP telah berhasil. Jika tidak, mungkin terjadi kekeliruan pada kabel, nomor Port atau setting BaudRate. Silakan dicek.
Membaca SMS
Berikutnya adalah membaca SMS.
Silakan tambahkan obyek Memo pada form, dan tambahkan tombol Button2, kemudian tuliskan kode ini pada event OnClick Button2:
procedure TForm1.Button2Click(Sender: TObject);
var waktu: tDateTime;
buffer: string;
begin
MSComm1.Output := 'AT+CMGL=1' + #13;
Sleep(500);
waktu := now;
repeat
buffer := MSComm1.Input;
Memo1.Text := Memo1.Text + buffer;
until (pos(sOK, s) > 0) or (pos(sERROR, s) > 0) or
(SecondsBetween(waktu,now) > 180);
end;
Jika program dijalankan, lalu ditekan tombol Button2, maka program akan mengirim perintah AT+CMGL=1 ke HP, yang berarti, 'berikan aku daftar SMS yang ada di Inbox'. Sehingga nantinya semua isi Inbox akan dikirimkan ke program, tetapi masih dalam format PDU.
Untuk menterjemahkan dari PDU menjadi teks, diperlukan rutin lagi. Silakan download source baca SMS, yang merupakan unit untuk membaca SMS
Silakan gunakan unit tersebut pada aplikasi anda ini, lalu buat tombol Button3. Pada event OnClick Button3, tulis program singkat ini:
procedure TForm1.Button3Click(Sender: TObject);
begin
CekSMS(Memo1);
end;
Ketika tombol Button3 ditekan, maka SMS dalam Inbox dan SMS baru, akan dimasukkan kedalam Memo1.
Berikut ini ketentuan AT+CMGL,
  • AT+CMGL=0 : SMS baru
  • AT+CMGL=1 : SMS dalam Inbox (yang sudah terbaca)
  • AT+CMGL=2 : SMS Draft (belum terkirim)
  • AT+CMGL=3 : SMS Outbox (terkirim)
  • AT+CMGL=4 : Seluruh SMS (semua yang ada di Inbox, Outbox, Draft)
Daftar lengkap perintah AT-Command dapat diperoleh disini: namun kadang ada HP yang tidak support AT-Command tertentu.
#bengkelprogram

DELPHI7 :: Cara Mengirim SMS dari PC

struktur PDU untuk dikirim:
07 91 2658050000F0 11 00 0C 91 265836164900 00 00 FF 04 C830FB0D
Keterangan:
Oktet / Digit HexaKeterangan
07Panjang atau jumlah pasangan digit dari nomor SMSC (service number) yang digunakan, dalam hal ini adalah 7 pasangan (14 digit berikutnya)
91Jenis nomor SMSC. Angka 91 menandakan format nomor internasional (misal +6281xxx). Untuk 081xxx menggunakan angka 81.
2658050000F0Nomor SMSC yang digunakan. Karena jumlah digit nomor SMS adalah ganjil, maka digit paling belakang dipasangkan dengan huruf F. Kalau diterjemahkan, nomor SMSC yang digunakan adalah +62855000000 (IM3)
11Oktet pertama untuk PDU SMS untuk dikirim (SMS SUBMIT). Untuk penjelasannya, silakan lihat artikel ini.
00TP-Message-Reference. Diisi "00" agar diisi otomatis oleh handphone.
0CPanjang digit dari nomor penerima (0C hex = 12 desimal)
91Jenis nomor penerima (sama dengan jenis nomor SMSC)
265836164900Nomor penerima SMS, yang jika diterjemahkan adalah +628563619400
00Pengenal protokol, dalam hal ini adalah 0. Silakan baca keterangan di sini.
00Skema pengkodean SMS, juga bernilai 0.
FFValiditas waktu. FF berarti maksimum. Silakan baca keterangan di sini.
04Panjang dari pesan SMS, dalam hal ini adalah 4 huruf (dalam mode 7 bit).
C830FB0DPesan SMS dalam mode 7 bit. Jika diterjemahkan kedalam 8 bit, lalu dirubah ke ASCII, maka didapat pesan 'Halo'
Untuk handphone tertentu, kita dapat menghilangkan pemberian nomor SMSC pada PDU, untuk kemudian akan diisi oleh handphone sesuai dengan kartu yang sedang digunakan. Tapi untuk lebih amannya, kita sebutkan nomor SMSC yang digunakan.
Ketika PDU SMS selesai dibentuk, maka langkah selanjutnya adalah melakukan pengiriman PDU tersebut melalui port serial yang digunakan. Perintah yang pertama kali digunakan adalah AT+CMGS, dengan aturan sebagai berikut:
AT+CMGS=<jumlah oktet PDU>
<jumlah oktet PDU> diisi dengan jumlah pasangan dalam PDU yang terbentuk, dengan dikurangi SMSC. Dengan kata lain, kita menghitung jumlah oktet mulai dari kode SMS SUBMIT (11). Untuk contoh di atas, berarti jumlah digit dalam PDU adalah 36, yang berarti terdiri dari 18 oktet. Sehingga perintah yang digunakan adalah:
AT+CMGS=18
Setelah itu, tunggu respon dari handphone. Kalau gagal, dengan berbagai alasan, maka yang dikembalikan adalah ERROR.
Sedangkan jika perintah tersebut diijinkan, maka yang dikembalikan adalah karakter '>' (lebih besar).
Jika perintah tersebut sukses, selanjutnya adalah menuliskan semua PDU tersebut ke handphone, dan diakhiri dengan penulisan karakter ASCII 26 (CTRL+Z).
Jika sukses, maka yang dikembalikan adalah OK. SMS terkirim, semoga.
Dari semua penjelasan di atas, diharapkan dapat dipahami langkah-langkah pengiriman SMS melalui PC. Untuk lebih jelasnya, silakan download source-code dalam program Delphi. Unit ini dapat digabungkan dengan unit untuk membaca SMS pada artikel sebelumnya.
Yang perlu diperhatikan adalah tentang pengaturan koneksinya. Karena masing-masing proses (kirim dan terima) membutuhkan koneksi ke handphone, maka harus diatur agar tidak terjadi proses terima dan kirim secara bersamaan.
#bengkelprogram