Transmit Data Paket

Fungsi data yang akan dibuat mempunyai susunan

START BYTE 1st START BYTE 2nd DATA[0] DATA[1] DATA[2] DATA[3] CHECKSUM

Perhitungan checksum berdasarkan https://wangready.wordpress.com/2011/09/24/error-control/

Berikut fungsinya dalam bahasa C yang saya aplikasikan untuk compiler CodeVisionAVR.

void transmit_packet(unsigned char data0,unsigned char data1,unsigned char data2,unsigned char data3)
{
        putchar(0xFF);
        putchar(0xFF);
        putchar(data0);
        putchar(data1);
        putchar(data2);
        putchar(data3);
        putchar(~(data0+data1+data2+data3));   //checksum
}

unsigned char data_receive[4];
unsigned char receive_packet()
{
unsigned char i,data_check=0;
start_data:
        while(getchar()!=0xFF){};
        if(getchar()!=0xFF)goto start_data;

        for(i=0;i<5;i++)
        {
                if(i<4)
                {
                        data_receive[i] = getchar();
                        data_check += data_receive[i];
                }
                else
                {
                        data_check += getchar();
                }
        }
        if(data_check==0xFF)
                return(1);//data benar
        else
                return(0);//data tertolak
}

atau untuk ukuran file yang flexible bisa digunakan fungsi di bawah ini. Setting nilai UKURAN_DATA sesuai dengan ukuran data yang akan dikirim/diterima. Code di bawah ini disetting misal untuk 5 data jadi nilai #define UKURAN_DATA 5.


#define UKURAN_DATA 5

unsigned char data_kirim[UKURAN_DATA];

void transmit_packet(unsigned char *data_kirim)
{       
unsigned char 	i = 0,
				sum_data = 0;       
        putchar(0xFF);
        putchar(0xFF);
		for(i=0;i<UKURAN_DATA;i++)
		{
			putchar(data_kirim[i]);
			sum_data += data_kirim[i];
		}
        putchar(~(sum_data));   //checksum
}

unsigned char data_receive[UKURAN_DATA]; 
unsigned char receive_packet()
{                     
unsigned char i,data_check=0;  
start_data:     
        while(getchar()!=0xFF){};
        if(getchar()!=0xFF)goto start_data;

        for(i=0;i<(UKURAN_DATA+1);i++)
        {
                if(i<UKURAN_DATA)
                {
                        data_receive[i] = getchar();
                        data_check += data_receive[i];
                }
                else
                {
                        data_check += getchar();
                }
        }     
        if(data_check==0xFF)
                return(1);//data benar
        else    
                return(0);//data tertolak
}

Jadi, misal kita akan mengirim data, maka di program utama kita tinggal panggil fungsi di atas.

data_kirim[0]=24;
data_kirim[1]=220;
data_kirim[2]=23;
data_kirim[3]=2;
data_kirim[4]=14;
transmit_packet();

Sedangkan jika kita ingin menerima data.

unsigned char dataku[5],i;
if(receive_packet()==1)//cek apakah nilai checksum benar
{
   for(i=0;i<5;i++)
   {
    dataku[i] = data_receive[i];
   }
}

11 Responses to Transmit Data Paket

  1. Irwan says:

    Salam kenal,
    Saya ingin membuat interface pc dengan mikon type ATMEGA 8535 dimana saya ingin mengirim lebih dari satu byte data dari pc untuk di olah di mikon tsb..
    1. kira-kira alur pembuatan program untuk membaca data yang dikirim pc bagaimana (kalau bisa dengan contoh (cvAVR)
    2. misal saya mengirim 2 byte data dari pc, kemudian 1 byte data saya gunakan untuk kontrol output full 8 bit (misal di PORTC), 1 byte data lain hanya 2 bit data yang ingin saya ambil dari data tersebut.. bagaimana proses pengambilan data tersebut dalam program

    sebelumnya terima kasih

    • wangready says:

      mas kirim aja pake data string, nanti diubah/diolah lg pake mikro. selain itu, bisa juga buat alamat. jadi misal untuk data pertama diawali huruf ‘a’, data kedua diawali huruf ‘b’.
      misal,akan menerima data dengan lebar uint8, perhatikan tabel ASCII, dan gunakan receive interrupt setting:

      kirim data dari pc: ‘a252b1′ maka, di mikro data_PORTC=252 dan data_proses_lain=1; dengan catatan data dikirim berulang dari PC dengan interval waktu menggunakan timer kira2 1 ms

      unsigned char data_buffer[3];
      unsigned char data_PORTC,data_proses_lain;

      while(getchar()!=’a’);
      data_buffer[0] = getchar();
      data_buffer[1] = getchar();
      if((data_buffer[1]>57)&&(data_buffer[1]57)&&(data_buffer[1]57)&&(data_buffer[1]57)&&(data_buffer[1]<48))
      {
      data_buffer[2] = data_buffer[1];
      data_buffer[1] = data_buffer[0];
      data_buffer[0] = '0';
      goto next2_data;
      }
      next2_data:
      data_proses_lain = ((data_buffer[0]-48)*100) + ((data_buffer[1]-48)*10) + (data_buffer[2]-48);

  2. rahmi says:

    kalu yang di atas it susunan data dan checksum yang akan dikirim ke pc ya?
    pi kalu saya dapat dapat dari device lain dan ditangkap oleh mikon dan data tersebut misalnya 14 byte, saya ambil dan disusun serta cheksumnya lalu dikirim ke pc. itu kira kira programnya bagaimana ya?
    bisa bantu saya?
    sebelumnya terima kasih ya

    • wangready says:

      susunan data di atas bisa dipake hanya untuk komunikasi yang formatnya sama. Inti dari format data diatas hanya untuk memastikan data yang diterima adalah data yang valid. kalo data yang mau dikirim ke PC lewat serial, dikirim datanya langsung jg bisa.
      Kalau ngambil data dari suatu device biasanya punya format sendiri dan bisa saja formatnya berbeda tiap alat. jadi harus dilihat datasheetnya. prosesnya biasanya harus deteksi kepala datanya dulu, baru kemudian mengambil data selanjutnya.

      • rahmi says:

        tetapi saya ambil datannya pada device yang sama lalu dikirim datanya ke pc lewat ethernet. jadi saya yang menyusun format datanya dan krim ke pc.
        tetapi sekarang saya mau simulasikan saja. saya buat format data di avr atmega dan saya kririm lewat serial ke avr atmega yang satunya lagi.
        apakah itu saya bisa gunakan format data diatas? cz saya tidak mengerti buat format data dalam program avr, saya cuma mengirim data serial biasa hello ke terminal pc.
        bisa bantu saya ?
        terima kasih sebeumnya

      • wangready says:

        selama kedua devicenya mempunyai protokol format yang sama, bisa saja…

      • rahmi says:

        jika dalam avr studio 4 apakah sama coding nya.
        saya coba putchar dan getchar dy malah warning seperti dibawah ini

        // ../main.c:76: warning: implicit declaration of function ‘putchar’
        // ../main.c:88: warning: implicit declaration of function ‘getchar’

        gmana jadinya.?
        terima kasih seblumnya..
        tolong bantuannya

      • wangready says:

        fungsi transmit yang saya post menggunakan CodeVisionAVR yang fungsi UART nya digenerate oleh codewizard nya: putchar dan getchar. kalau pake AVRStudio 4 berarti harus buat dulu fungsi UART putchar dan getchar nya dulu. coba cek post yg ini https://wangready.wordpress.com/2011/02/02/pemrograman-usart-pada-mikrokontroler-avr-avr-studio-4/
        void USART_Transmit diganti jadi putchar
        unsigned char USART_Receive diganti jadi getchar
        mungkin bisa dicoba

  3. gimana gan program mengirim data dari ys 1020 ke pc .saya ambil data dari 4 sensor melalu ys1020. saya sudah coba mengirim dan menerima menggunaka hterm dengan boudred 9600 kemudian mengirim dengan Serial prin saja data yang dibaca hterm tersebut tidak jelas atau tulisan alien tolong dong bantuannya

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s