Selamat Datang Di Blog Kami

إِنَّ اللهَ لاَ يَنْظُرُ إِلَى صُوَرِكُمْ وَ أَعْمَالِكُمْ وَ إِنَّمَا يَنْظُرُ إِلَى قُلُوْبِكُمْ وَ نِيَّاتِكُمْ

“Sesungguhnya Allah tidak melihat kepada rupa dan amal-amal kalian, tetapi Dia melihat kepada hati dan niat kalian.” (shahih Muslim dan lainnya)

Selasa, 19 Januari 2010

Komunikasi data serial

Contoh coding berikut adalah potongan program sederhana untuk keperluan komunikasi data serial menggunakan C++ Builder. Pada contoh ini hanya digunakan komponen - komponen standar dari C++ Builder yaitu komponen Memo dan object Thread.
1. Jalankan C++ Builder dan mulailah dengan Start New Project
2. Tambahkan komponen Memo pada Form1 yang tersedia. Setting properties dari Memo1 sesuai dengan keinginan anda.
3. Pada menu File->New, tambahkan object Thread. Gunakan nama class TRead.
4. Jika langkah yang anda lakukan benar dapat anda lihat 2 buah file unit, yaitu: Unit1.cpp untuk Form1 dan Unit2.cpp untuk Thread.
5. Pada event handlers lakukan setting: Form1->OnCreate; Form1->OnClose; Memo1->OnKeyPress

Pada Main Form, edit listing program menjadi seperti berikut :
//---------------------------------------------------------------------------

'#include 

'#pragma hdrstop

'#include "Unit1.h"

'#include "Unit2.h"

HANDLE hComm = NULL;

TRead ReadThread;

COMMTIMEOUTS ctmoNew = {0}, ctmoOld;

//---------------------------------------------------------------------------

'#pragma resource ".dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)

{

DCB dcbCommPort;

hComm = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);

if(hComm == INVALID_HANDLE_VALUE)

Application->Terminate();

GetCommTimeouts(hComm,&ctmoOld);

ctmoNew.ReadTotalTimeoutConstant = 100;

ctmoNew.ReadTotalTimeoutMultiplier = 0;

ctmoNew.WriteTotalTimeoutMultiplier = 0;

ctmoNew.WriteTotalTimeoutConstant = 0;

SetCommTimeouts(hComm, &ctmoNew);

dcbCommPort.DCBlength = sizeof(DCB);

GetCommState(hComm, &dcbCommPort);

BuildCommDCB("9600,N,8,1", &dcbCommPort);

SetCommState(hComm, &dcbCommPort);

ReadThread = new TRead(false);

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)

{

ReadThread->Terminate();

Sleep(250);

PurgeComm(hComm, PURGE_RXABORT);

SetCommTimeouts(hComm, &ctmoOld);

CloseHandle(hComm);

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Memo1KeyPress(TObject *Sender, char &Key)

{

TransmitCommChar(hComm, Key);

if(Key != 13 && (Key < ' ' || Key > 'z')) Key = 0;

}

//---------------------------------------------------------------------------

Pada Thread, edit listing program menjadi seperti berikut:
//---------------------------------------------------------------------------

'#include 

'#pragma hdrstop

'#include "Unit1.h"

'#include "Unit2.h"

extern HANDLE hComm;

char InBuff[100];

//---------------------------------------------------------------------------

__fastcall TRead::TRead(bool CreateSuspended) :TThread(CreateSuspended)

{

}

//---------------------------------------------------------------------------

void __fastcall TRead::DisplayIt()

{

Form1->Memo1->SetSelTextBuf(InBuff);

}

//---------------------------------------------------------------------------

void __fastcall TRead::Execute()

{

DWORD dwBytesRead;

FreeOnTerminate = true;

while(1)

{

ReadFile(hComm, InBuff, 50, &dwBytesRead, NULL);

if(dwBytesRead)

{

InBuff[dwBytesRead] = 0;

Synchronize(DisplayIt);

}

}

}

//---------------------------------------------------------------------------

Yang berikutnya adalah melakukan sinkronisasi fungsi DisplayIt() pada Thread. Buka file unit2.h dan tambahkan baris DisplayIt() seperti berikut
//---------------------------------------------------------------------------

class TRead : public TThread

{

private:

protected:

void __fastcall DisplayIt(void);

void __fastcall Execute();

public:

__fastcall TRead(bool CreateSuspended);

};

//---------------------------------------------------------------------------
Selesai.

from : ARIEF SHAFF

I2C

I2C merupakan teknologi yang digunakan untuk berkomunikasi antar IC menggunakan format komunikasi data serial. Dengan demikian mikrokontroler dapat berkomunikasi dengan perangkat lain secara efektif dan efisien. Berikut adalah rutin program yang biasa diterapkan dalam berkomunikasi dengan memori serial. Di dalam sub rutin tersebut terdiri dari rutin - rutin :
1. SMDelay, memberi waktu jeda
2. SMStart, memulai komunikasi serial
3. SMStop, mengakhiri komunikasi serial
4. SMPutBit, mengirim data bit
5. SMGetBit, mengambil data bit
6. SMWriteByte, menulis data byte
7. SMReadByte, membaca data byte
8. SMWrite, menulis data serial
9. SMRead, membaca data serial
10. SMIncAddress, mengakses alamat berikutnya
11. SMSetAddress, menset alamat memori
Dalam pemrograman mcs-51 yang perlu diinisialisasikan adalah SMBuf (memori sementara sesaat sebelum/setelah dikirimkan), SCL (bit serial clock), SDA (bit serial data). Juga penggunaan memori 16 bit (DPTR) untuk keperluan pengalamatan memori serial (SMAddHigh dan SMAddrLow).
SMDelay:
nop
nop
nop
nop
ret

SMStart:
clr SCL
setb SDA
setb SCL
call SMDelay
clr SDA
call SMDelay
clr SCL
call SMDelay
ret

SMStop:
clr SCL
clr SDA
setb SCL
call SMDelay
setb SDA
call SMDelay
ret

SMPutBit:
mov SDA,c
setb SCL
call SMDelay
clr SCL
call SMDelay
ret

SMGetBit:
setb SDA
setb SCL
call SMDelay
mov c,SDA
clr SCL
call SMDelay
ret

SMWriteByte:
push 0
mov 0,#8
SMWriteByteLoop:
rlc a
call SMPutBit
djnz 0,SMWriteByteLoop
pop 0
ret

SMReadByte:
push 0
mov 0,#8
SMReadByteLoop:
call SMGetBit
rlc a
djnz 0,SMReadByteLoop
pop 0
ret

SMWrite:
push acc
push psw
call SMStart
mov a,SMAddHigh
rlc a
orl a,#10100000b
call SMWriteByte
call SMGetBit
mov a,SMAddLow
call SMWriteByte
call SMGetBit
mov a,SMBuf
call SMWriteByte
call SMGetBit
call SMStop
BusyLoop:
mov a,#10100000b
call SMStart
call SMWriteByte
call SMGetBit
jc BusyLoop
pop psw
pop acc
ret

SMRead:
push acc
push psw
call SMStart
mov a,SMAddHigh
rlc a
orl a,#10100000b
call SMWriteByte
call SMGetBit
mov a,SMAddLow
call SMWriteByte
call SMGetBit
call SMStart
mov a,SMAddHigh
rlc a
orl a,#10100001b
call SMWriteByte
call SMGetBit
call SMReadByte
mov SMBuf,a
call SMGetBit
call SMStop
pop psw
pop acc
ret

SMIncAddress:
push acc
push psw
mov a,SMAddLow
add a,#1
mov SMAddLow,a
mov a,SMAddHigh
addc a,#0
mov SMAddHigh,a
pop psw
pop acc
ret

SMSetAddress:
mov SMAddLow,dpl
mov SMAddHigh,dph
ret
Tags: MCS51

from. arief shaff

Menjadikan flashdisk sebagai dongle aplikasi

Banyak cara untuk membuat aplikasi menjadi lebih aman baik pada pendistribusian maupun penggunaannya. Berikut adalah cara sederhana membuat dongle aplikasi dengan memanfaatkan flash disk. Hal ini dilakukan dengan membaca serial number dari flash disk yang akan di setting menjadi dongle, mengingat serial number yang tertera pada flash disk merupakan kumpulan angka spesifik yang selalu berbeda setiap flash disk tersebut di format.
Pada listing program berikut, setiap aplikasi dijalankan akan selalu membaca drive flash disk. Apabila terdapat drive flash disk dengan serial number yang sudah disetting maka aplikasi yang sebenarnya akan ditampilkan.

//---------------------------------------------------------------------------
'#include 
'#pragma hdrstop
'#include "uflash.h"
'#include "stdlib.h"
//---------------------------------------------------------------------------
'#pragma package(smart_init)
'#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
        String drive;
        String VOLUME;
        DWORD SerialNumber;
        VOLUME.SetLength(255);
        drive = "D:\";
        String DRIVE = drive;
        GetVolumeInformation(DRIVE.c_str(), VOLUME.c_str(), VOLUME.Length(), &SerialNumber,
                NULL, NULL, NULL, NULL);
        Label5->Caption = DRIVE;
        Label6->Caption = VOLUME;
        char TEKS[30];
        itoa (SerialNumber, TEKS, 15);
        Label7->Caption = SerialNumber;
        Edit2->Text = SerialNumber;
        if (SerialNumber == 761563863) //ganti SerialNumber sesuai dengan flashdisk yang anda gunakan
        {
            Label8->Caption = "Flash disk cocok";
                        //Disini ditulis perintah untuk meload aplikasi yang sesungguhnya
        }
        else
        {
            Label8->Caption = "Flash disk tidak terpasang / tidak cocok";
        }
        Timer1->Enabled = false;
        HANDLE serialnumber;
        char buffer[10];
        DWORD byte_yang_ditulis;
        serialnumber = CreateFile(Edit1->Text.c_str(), GENERIC_WRITE, 0,
                NULL, OPEN_ALWAYS, FILE_FLAG_RANDOM_ACCESS, 0);
        strcpy(buffer, Edit2->Text.c_str());
        WriteFile(serialnumber, buffer, sizeof(buffer), &byte_yang_ditulis, NULL);
        CloseHandle(serialnumber);

        Close();

Pada contoh listing diatas, flashdisk sudah diset sebagai drive D, sehingga aplikasi akan menemukan kesalahan jika:
  • Partisi hardisk komputer berubah.
  • Partisi flashdisk berubah / flashdisk di format ulang.
  • Flashdisk dikenali bukan sebagai drive D (jika terdapat USB storage lain sebelum flashdisk dongle dipasang).
from. shaffan.net

Template by : kendhin x-template.blogspot.com