## JURNAL MEDIA INFORMATIKA BUDIDARMA
ISSN 2614-5278 (media cetak), ISSN 2548-8368 (media online) Available Online at https://ejurnal.stmik-budidarma.ac.id/index.php/mib DOI: 10.30865/mib.v6i3.4366

## Perancangan dan Implementasi Encoder dan Decoder CRC-8 untuk Pendeteksian Error pada Transmisi Data antar Perangkat IoT
Donny Priyadi, Theophilus Wellem *
Fakultas Teknologi Informasi, Program Studi Teknik Informatika, Universitas Kristen Satya Wacana, Salatiga, Indonesia Email: 1 672018077@student.uksw.edu, 2,* theophilus.wellem@uksw.edu Email Penulis Korespondensi: theophilus.wellem@uksw.edu
Abstrak−Cyclic  Redundancy  Check (CRC)  merupakan  kode  pendeteksi error yang  digunakan  secara  luas  pada  sistem komunikasi  digital  untuk  mendeteksi error pada  data  yang  ditransmisikan  antara transmitter dan receiver .  Dengan berkembangnya pemanfaatan teknologi Internet-of-Things (IoT) di mana terdapat banyak perangkat yang saling berkomunikasi secara nirkabel, penerapan kode pendeteksi error seperti CRC merupakan hal yang penting untuk mendapatkan komunikasi yang handal ( reliable ). Komputasi CRC dapat diimplementasikan  pada perangkat keras menggunakan linear feedback shift register (LFSR) atau pada perangkat lunak dengan operasi shift dan bitwise exclusive OR (XOR) untuk pembagian polynomial. Oleh karena seringnya pemanfaatan CRC pada komunikasi nirkabel ( wireless ) untuk IoT, penelitian untuk pengembangan dan implementasi  CRC  terus  dilakukan  hingga  saat  ini.  Penelitian  ini  bertujuan  untuk  merancang  dan  mengimplementasikan algoritma perhitungan CRC-8 dengan generator polynomial 0x07 pada perangkat IoT. Dua algoritma untuk komputasi CRC, yaitu komputasi secara bitwise dengan LFSR dan menggunakan tabel lookup , diimplementasikan pada board Arduino Uno R3. Dua board Arduino yang dihubungkan secara serial digunakan untuk menguji implementasi dari encoder dan decoder pada proses transmisi data dan pendeteksian error . Dari pengujian yang dilakukan didapatkan hasil bahwa encoder dapat menghitung nilai CRC dari input data dengan benar.  Selanjutnya, komputasi menggunakan tabel lookup membutuhkan waktu yang sekitar empat kali lebih cepat dibandingkan dengan komputasi secara bitwise , tetapi dengan penggunaan memori yang lebih besar. Sebaliknya,  komputasi  secara bitwise hanya  membutuhkan  sedikit  memori,  tetapi  waktu  komputasinya  lebih  lambat.  Pada pengujian dengan input data sepanjang 128 karakter, encoder dengan bitwise membutuhkan waktu perhitungan sebesar 2.37 milidetik, sedangkan encoder dengan tabel lookup membutuhkan waktu perhitungan sebesar 0.5 milidetik. Selanjutnya, untuk pengujian error detection didapatkan bahwa receiver dapat mendeteksi error pada data yang ditransmisikan dengan persentase 100%.
Kata Kunci: Cyclic Redundancy Check ( CRC ) ; Deteksi Error; Kode Pendeteksi Error; Internet-Of-Things ; Arduino
Abstract− Cyclic Redundancy Check (CRC) is a widely used error detection code in digital communication systems to detect errors  in  data  transmitted  between  transmitter  and  receiver.  With  the  development  of  Internet-of-Things  (IoT)  technology, where many devices communicate wirelessly, the application of error detection codes such as CRC is essential to obtain reliable communication. The computation of CRC can be implemented in hardware using a linear feedback shift register (LFSR) or in software with shift and bitwise exclusive OR (XOR) operations for polynomial division. Due to the frequent use of CRC in wireless communication for IoT, research for the design and implementation of CRC continues to this day. This study aims to design and implement the encoder and decoder of CRC-8 with generator polynomial 0x07 on IoT devices. Two algorithms for computing the CRC, namely bitwise computation using LFSR and another one using lookup tables, are implemented on the Arduino Uno R3 board. Two Arduino boards connected in serial were used to verify the encoder and decoder implementation in the data transmission and error detection process. The experiment results showed that the encoder could correctly calculate the CRC value from the input data. Furthermore, the computation using lookup tables takes about four times faster than the bitwise  method  but  requires  more  memory.  In  contrast,  the  bitwise  computation  method  requires  less  memory  but  slower computation time. When testing using input data of 128 characters, the bitwise-based encoder requires a computation time of 2.37  milliseconds,  while  the  lookup  table-based  encoder  utilizing  a  lookup  table  requires  a  computation  time  of  0.5 milliseconds. In the error detection test, the results demonstrated that the receiver could detect errors in the transmitted data with a percentage of 100%.
Keywords : Cyclic Redundancy Check ; Error Detection ; Error Detection Code ; Internet-Of-Things ; Arduino

## 1. PENDAHULUAN
Sistem komunikasi data digital seperti jaringan seluler (4G/5G), jaringan komputer (Ethernet), Bluetooth, maupun komunikasi  serial  (USB)  dapat  mengalami  gangguan  yang  disebabkan  oleh  pelemahan  sinyal  ( attenuation ), interferensi,  dan noise yang  berasal  dari  luar  sistem  atau  dari  dalam  sistem  tersebut  (misalnya, thermal  noise ). Berbagai gangguan ini dapat menyebabkan sinyal yang diterima oleh penerima ( receiver ) berbeda dengan sinyal asli yang ditransmisikan oleh pengirim  ( sender )  dan terjadi error pada data dikirimkan  [1]. Untuk memastikan bahwa error pada data yang ditransmisikan dapat dideteksi dan dikoreksi oleh penerima, protokol data link pada sistem  komunikasi  data  umumnya  menerapkan  kode  pendeteksi  kesalahan  ( error  detection  code) dan  kode pengoreksi  kesalahan  ( error  correction  code )  [2].  Secara  umum,  kode  pendeteksi  kesalahan  hanya  mendeteksi apakah terdapat error pada data atau frame yang diterima. Jika terdapat error , maka frame yang diterima akan dibuang ( discarded ) dan penerima akan meminta pengirim untuk mentransmisikan ulang frame yang mengalami error ( retranmission ). Sebaliknya, jika tidak terdapat error , maka frame akan diproses lebih lanjut dan diberikan pada  aplikasi  yang  sesuai.  Berbeda  dengan  kode  pendeteksi  kesalahan,  kode  pengoreksi  kesalahan  digunakan untuk mendeteksi sekaligus mengoreksi error pada data (sesuai dengan spesifikasi kode yang digunakan) sehingga pengirim tidak perlu mentransmisikan ulang data yang mengalami error . Kode pengoreksi kesalahan umumnya diaplikasikan pada jalur komunikasi dengan delay yang signifikan atau memiliki bandwidth yang terbatas untuk

## JURNAL MEDIA INFORMATIKA BUDIDARMA
ISSN 2614-5278 (media cetak), ISSN 2548-8368 (media online) Available Online at https://ejurnal.stmik-budidarma.ac.id/index.php/mib DOI: 10.30865/mib.v6i3.4366
menghemat sumber daya ( resources ) yang digunakan dalam komunikasi. Selain pada sistem komunikasi, kode pendeteksi  kesalahan  dan  kode  pengoreksi  kesalahan  juga  digunakan  pada  sistem  penyimpanan  ( storage system/device ) seperti hardisk dan flash memory [3]. Cyclic  Redundancy  Check (CRC)  [4][5]  merupakan  salah  satu  kode  yang  digunakan  untuk  mendeteksi adanya error pada  data  ( error  detection  code )  yang  dikirimkan  dalam  jaringan  komputer  atau  pada  data  yang disimpan  pada  sistem  penyimpanan.  Pada  teknik  deteksi  error  menggunakan  CRC,  sejumlah  bit  yang  disebut dengan checksum atau check bit akan ditambahkan pada data yang akan ditransmisikan. Check bit atau nilai CRC ini  dihitung  pada  sisi  pengirim  menggunakan  CRC encoder .    Penerima  kemudian  menggunakan  nilai  CRC  ini untuk mendeteksi apakah terdapat error pada data yang diterima. CRC didasarkan pada kode siklik ( cyclic code ) sehingga  secara  umum  cara  komputasinya  ( encoding / decoding )  mirip  dengan  kode  siklik  yang  lain.  Saat  ini terdapat beberapa jenis CRC yang umum digunakan, misalnya CRC-8, CRC-10, CRC-12, CRC-16, dan CRC-32. Suatu kode CRC didefinisikan melalui suatu polynomial 𝑔(𝑥) yang disebut dengan generator polynomial seperti yang  ditunjukkan  pada  Tabel  1  [1][6].  Dengan  semakin  meningkatnya  data transfer  rate pada  jaringan  dari Megabit per detik (Mbps), Gigabit per detik (Gbps) menuju Terabit per detik (Tbps), kecepatan pemrosesan frame — termasuk di dalamnya komputasi CRC— untuk menghitung Frame Check Sequence (FCS) atau checksum oleh protokol  pada data  link  layer juga  harus  ditingkatkan  agar  pemrosesan frame tidak  mengalami delay yang signifikan.  Selain  itu,  dengan  semakin  meningkatnya  pemanfaatan  teknologi Internet-of-Things (IoT)  di  mana akurasi  data  pada  komunikasi  antar transmitter dan receiver merupakan  hal  yang  penting,  pemanfaatan  kode pendeteksi kesalahan seperti CRC diperlukan untuk mendeteksi adanya error pada data yang ditransmisikan [7].
Tabel 1. Generator polynomial untuk beberapa kode CRC
Code Generator Polynomial 𝒈(𝒙) Jumlah CRC bit Penggunaan CRC-4 𝑥 4 + 𝑥 + 1 4 ITU G.704, IEEE 802.11ah CRC-8-CCITT 𝑥 8 + 𝑥 2 + 𝑥 + 1 8 ATM Header Error Control CRC-10 𝑥 10 + 𝑥 9 + 𝑥 5 + 𝑥 4 + 𝑥 + 1 10 ATM Adaptation Layer CRC-12 𝑥 12 + 𝑥 11 + 𝑥 3 + 𝑥 2 + 𝑥 + 1 12 Telecom system CRC-16-CCITT 𝑥 16 + 𝑥 12 + 𝑥 5 + 1 16 HDLC, Bluetooth, XMODEM CRC-16-ANSI 𝑥 16 + 𝑥 15 + 𝑥 2 + 1 16 USB, Modbus CRC-24 𝑥 24 + 𝑥 10 + 𝑥 9 + 𝑥 6 + 𝑥 4 + 𝑥 3 + 𝑥 + 1 24 Bluetooth CRC-32 IEEE 802 𝑥 32 + 𝑥 26 + 𝑥 23 + 𝑥 22 + 𝑥 16 + 𝑥 12 + 𝑥 11 + 𝑥 10 + 𝑥 8 + 𝑥 7 + 𝑥 5 + 𝑥 4 + 𝑥 2 + 𝑥 + 1 32 Local Area Network (LAN)
Oleh karena luasnya penggunaan CRC pada berbagai sistem komunikasi data mulai dari Universal Serial Bus (USB), Ethernet,  komunikasi  seluler,  hingga IoT,  penelitian  yang  berkaitan  dengan  algoritma perhitungan CRC untuk  menghasilkan komputasi yang cepat dan  efisien terus dilakukan  [8]–[10] hingga saat  ini,  meskipun kode  CRC  telah  ada  sejak  tahun  1960-an.  Secara  umum  implementasi  CRC  banyak  dilakukan  pada  perangkat keras  ( hardware )  baik  menggunakan Field  Programmable  Gate  Array (FPGA)  maupun Application-specific Integrated Circuit (ASIC).  Penelitian ini bertujuan untuk merancang dan mengimplementasikan encoder untuk CRC-8  dengan  generator  polynomial 𝑥 8 + 𝑥 2 + 𝑥 + 1 yang  umum  digunakan  dalam  berbagai  standar  sistem komunikasi. CRC-8 dipilih pada penelitian ini karena hanya memerlukan resource (memori) yang kecil sehingga cocok untuk diterapkan pada perangkat IoT. Sebagai contoh, hanya dibutuhkan memori  sebesar 256 byte untuk menyimpan tabel lookup dalam perhitungan CRC-8. Untuk implementasi CRC-8 encoder pada penelitian ini, nilai CRC  akan  dihitung  menggunakan  dua  metode  yaitu:  1)  cara  konvensional  yang  dikenal  juga  dengan  istilah komputasi  secara bitwise dan  2)  menggunakan  algoritma  yang  memanfaatkan lookup  table .  Implementasi dilakukan menggunakan bahasa pemrograman C/C++ pada platform Arduino yang menggunakan mikrokontroller Atmel AVR ATmega328P [11]. Meskipun penelitian ini berfokus pada implementasi encoder pada sisi pengirim, CRC-8 decoder juga diimplementasikan untuk pengujian deteksi error pada penerima. Implementasi untuk CRC decoder tidak  dibahas  secara  detail  karena decoder menggunakan  teknik  yang  serupa  dengan encoder (yaitu melakukan operasi pembagian antara codeword yang diterima dengan generator polynomial) dan hanya berbeda pada input data yang diberikan kepada decoder . Kajian ( review ) terhadap beberapa penelitian terdahulu yang berkaitan dilakukan agar dapat memberikan gambaran  yang  lebih  luas  mengenai  topik  penelitian  ini.  Saleh  dan  Sudiro  [12]  mengimplementasikan  CRC-8 encoder dan decoder menggunakan hardware  description  language VHDL  pada  Xilinx  Spartan-3E  FPGA (xc3s100s-5vq100). Hasil yang diukur pada penelitian tersebut adalah penggunaan sumber daya perangkat keras ( hardware  resources )  pada  FPGA.  Natalia,  dkk.  [13]  mengimplementasikan  CRC-8 encoder dan decoder menggunakan  Simulink  [14]  dan  TMS320C6416T  yang  merupakan fixed-point digital  signal  processor (DSP) dari Texas Instruments. CRC-16 juga diimplementasikan pada penelitian tersebut. Pengujian hasil implementasi pada penelitian tersebut difokuskan pada perbandingan kemampuan pendeteksian error antara CRC-8 dan CRC- 16, bukan pada hardware resource yang digunakan karena implementasi dilakukan menggunakan perangkat lunak ( software ).  Panda  dan  Kumar  [15]  melakukan  implementasikan  dua  jenis  CRC-8 encoder untuk  ATM  HEC

## JURNAL MEDIA INFORMATIKA BUDIDARMA
ISSN 2614-5278 (media cetak), ISSN 2548-8368 (media online) Available Online at https://ejurnal.stmik-budidarma.ac.id/index.php/mib DOI: 10.30865/mib.v6i3.4366
( header error control ) yaitu encoder dengan input data secara serial dan encoder yang menerima input data secara paralel.  Implementasi  dilakukan  menggunakan hardware  description  language Verilog  pada  Xilinx  Spartan-3 FPGA. Sintesis kemudian dilakukan menggunakan perangkat lunak Cadence Encounter. Dari hasil implementasi tersebut disimpulkan bahwa input data CRC secara paralel dengan menggunakan multi-output LFSR lebih baik dari aspek konsumsi daya dan pemanfaatan area chip. Saleh, dkk. [16] merancang dan melakukan simulasi CRC- 8 encoder dan decoder menggunakan VHDL pada Xilinx FPGA. Novaldi, dkk. [17] mengimplementasikan sistem pendeteksi error menggunakan  CRC-8  pada  komunikasi  serial  antar  dua  Arduino board .  Hasil  dari  penelitian tersebut menunjukkan bahwa sistem yang dirancang dapat mendeteksi error pada data dengan akurat. Selain itu diperoleh bahwa penggunaan komunikasi UART ( Universal Asynchronous Receiver Transmitter ) membutuhkan waktu  yang  lebih  cepat  daripada  sistem  dengan  SPI  atau  I2C.  Berbeda  dengan  penelitian-penelitian  yang disebutkan  di  atas,  penelitian  ini  berfokus  pada  implementasi encoder pada  perangkat  IoT  menggunakan  dua metode  perhitungan  CRC-8  yang  berbeda,  yaitu  komputasi  secara bitwise dan  komputasi  menggunakan  tabel lookup .

## 2. METODOLOGI PENELITIAN

## 2.1 Tahapan Penelitian
Tahapan  yang  dilakukan  untuk  melaksanakan  penelitian  ini  ditunjukkan  pada  Gambar  1  dan  dapat  dijelaskan sebagai  berikut.  Penelitian  dimulai  dengan  melakukan  identifikasi  permasalahan  yang  berhubungan  dengan pemanfaatan kode CRC untuk mendeteksi error pada data serta perancangan encoder dan decoder -nya. Pada tahap ini  juga  dilakukan  studi  literatur  mengenai  kode  CRC  baik  dari  buku  teks  maupun  penelitian-penelitian sebelumnya  untuk  mempelajari  metode  atau  algoritma  yang  digunakan  untuk  perhitungan  CRC-8.  Selanjutnya pada  tahap  kedua  dilakukan  analisis  kebutuhan  (misalnya,  perangkat  lunak  atau  perangkat  keras  yang  akan digunakan)  untuk  melakukan  perancangan  dan  implementasi encoder CRC-8.  Tahap  berikutnya  adalah perancangan  dan  implementasi  di  mana  algoritma  untuk  menghitung  CRC-8  didesain  dan  diimplementasikan dalam  bentuk  perangkat  lunak  dan  perangkat  keras.  Setelah  tahap  ini  dilakukan  pengujian  untuk  memastikan bahwa  implementasi  yang  dilakukan  sudah  tepat dan  hasil  perhitungan  CRC-8  diverifikasi  apakah telah  sesuai dengan teori yang ada. Tahap terakhir dari penelitian ini adalah menyimpulkan hasil penelitian dan menulis laporan hasil penelitian.

## Gambar 1. Tahapan Pelaksanaan Penelitian

## 2.2 Teori Cyclic Redundancy Check (CRC)
Komputasi  FCS  atau checksum yang  dilakukan  untuk  data  yang  akan  ditransmisi  oleh  pengirim  menggunakan CRC dapat dijelaskan sebagai berikut [1][18]. Diberikan blok data ( dataword ) sepanjang k -bit, pengirim kemudian akan menghitung n - k bit checksum untuk k -bit data tersebut.  Selanjutnya, n - k bit checksum ini akan disambungkan ( appended )  pada k -bit dataword sehingga  membentuk n -bit codeword .  Proses  ini  merupakan  proses  yang dilakukan oleh CRC encoder pada sisi pengirim. Dari proses ini dapat dilihat bahwa untuk k -bit data, pengirim akan  mentransmisikan n -bit codeword ( k -bit dataword ditambah n - k bit checksum )  sehingga  terdapat n - k redundant bit yang ditransmisikan bersama dengan data. Dari redundant bit inilah, penerima dapat mendeteksi error pada data yang diterima. Analisis pada kode siklik seperti CRC umumnya akan lebih mudah dipahami jika data  direpresentasikan  sebagai  suatu  polynomial  dalam binary  field GF(2).  Dengan  menggunakan  representasi polynomial,  data  biner  dapat  ditulis  sebagai  polynomial  dengan  koefisien  0  dan  1.  Sebagai  contoh,  data  8-bit 11011101  direpresentasikan  dengan  polynomial 𝑥 7 + 𝑥 6 + 𝑥 4 + 𝑥 3 + 𝑥 2 + 1 .  Secara  matematis,  proses pengkodean ( encoding ) CRC diformulasikan sebagai berikut (dalam representasi polynomial).
𝑟(𝑥) = (𝑥 𝑛−𝑘 𝑑(𝑥))mod 𝑔(𝑥)
(1)
dan
𝑐(𝑥) = 𝑥 𝑛−𝑘 𝑑(𝑥) +  𝑟(𝑥) (2)
di  mana 𝑐(𝑥) adalah n -bit codeword yang  akan  ditransmisikan  oleh  pengirim  ( transmitter atau sender ), 𝑚(𝑥) adalah k -bit dataword , 𝑟(𝑥) = n - k bit checksum (nilai CRC), dan 𝑔(𝑥) adalah generator polynomial. Nilai

## JURNAL MEDIA INFORMATIKA BUDIDARMA
ISSN 2614-5278 (media cetak), ISSN 2548-8368 (media online) Available Online at https://ejurnal.stmik-budidarma.ac.id/index.php/mib DOI: 10.30865/mib.v6i3.4366
n - k sama dengan derajat dari generator polynomial 𝑔(𝑥) . Semua perhitungan dilakukan menggunakan aritmetika polynomial  dalam binary  field GF(2)  di  mana  operasi  penjumlahan  ekivalen  dengan  operasi  logika  XOR  dan operasi  perkalian  ekivalen  dengan  operasi  logika  AND.  Dapat  dilihat  bahwa  perhitungan checksum dilakukan dengan pembagian polynomial antara data (yang telah ditambah dengan n - k bit ‘0’) dengan generator polynomial 𝑔(𝑥) . Selanjutnya, sisa hasil pembagian ( remainder , 𝑟(𝑥) ) diambil sebagai checksum . Pada sisi penerima, decoder melakukan pembagian antara polynomial codeword 𝑐(𝑥) dengan generator polynomial 𝑔(𝑥) sebagai berikut.
𝑟′(𝑥) = 𝑐(𝑥) mod 𝑔(𝑥)
(3)
Jika sisa hasil pembagian ( 𝑟′(𝑥) ) sama dengan nol, maka dapat dikatakan bahwa tidak terdapat error pada data. Sebaliknya, jika sisa hasil pembagian tidak sama dengan nol, maka terdapat error pada data dan penerima akan membuang data yang diterima.
Perhitungan  nilai  CRC  dapat  implementasikan  secara  serial,  paralel,  atau  menggunakan  tabel lookup ( lookup table ). Pada implementasi secara serial, input data diberikan kepada encoder secara serial (bit per bit) dan umumnya encoder diimplementasikan  menggunakan linear  feedback  shift  register (LFSR)  seperti  yang ditunjukkan pada Gambar 2.  Implementasi CRC encoder secara paralel menerima input data dalam bentuk blok bit  atau  byte.  Pada  komputasi  CRC  yang  menggunakan lookup  table ,  nilai  CRC  dihitung  terlebih  dahulu  dan disimpan pada tabel. Encoder kemudian melakukan perhitungan nilai CRC dengan memanfaatkan atau melakukan operasi matematika terhadap nilai-nilai yang disimpan pada tabel tersebut.
Gambar 2. Arsitektur CRC encoder secara umum menggunakan LFSR
Pada  arsitektur  yang  ditunjukkan  pada  Gambar  1,  jumlah  register  dan  operasi  XOR  yang  digunakan bergantung pada jenis CRC yang akan diimplementasikan (CRC-4, CRC-8, CRC-16 dan seterusnya) dan generator polynomialnya.

## 3. HASIL DAN PEMBAHASAN
Pada bagian ini dijelaskan hasil dari perancangan dan implementasi CRC-8 encoder . Seperti yang telah disebutkan sebelumnya, komputasi  nilai  CRC dapat  dilakukan secara serial, paralel, atau menggunakan tabel lookup . Pada penelitian  ini, encoder yang  diimplementasikan  menghitung  nilai  CRC  secara  serial  dan  menggunakan  tabel lookup . Implementasi encoder dilakukan pada perangkat Arduino Uno R3 [19].

## 3.1 Implementasi Perangkat Lunak
Seperti  yang  telah  disinggung  sebelumnya,  perhitungan  nilai  CRC-8  yang  dilakukan  oleh encoder pada  sisi pengirim pada dasarnya adalah operasi pembagian ( division ) antara dataword yang telah ditambahkan dengan 8- bit ‘0’ dengan suatu generator polynomial. Untuk CRC-8 dengan generator polynomial 𝑥 8 + 𝑥 2 + 𝑥 + 1 , LFSR pada Gambar 2 menjadi seperti yang ditunjukkan pada Gambar 3.
Gambar 3. CRC-8 encoder menggunakan LFSR untuk Generator Polynomial 𝑥 8 + 𝑥 2 + 𝑥 + 1

## JURNAL MEDIA INFORMATIKA BUDIDARMA
ISSN 2614-5278 (media cetak), ISSN 2548-8368 (media online) Available Online at https://ejurnal.stmik-budidarma.ac.id/index.php/mib DOI: 10.30865/mib.v6i3.4366
Operasi shift register dan XOR dapat diimplementasikan menggunakan perangkat lunak maupun perangkat keras.  Langkah-langkah  perhitungan  nilai  CRC-8  secara  serial  (bit  per  bit)  menggunakan  shift  register  adalah sebagai berikut.
a. Inisialisasi register/variabel yang digunakan untuk menyimpan nilai CRC (semua bit pada register = ‘0’).
b. Baca input (per bit) dari data atau pesan yang dimasukkan oleh user ke register. Lakukan operasi XOR antara input data dengan register.
c. Periksa most significant bit (MSB) dari register. Jika MSB = ‘1’, geser register (juga input data) sebanyak satu bit ke kiri ( left shift ), kemudian XOR-kan hasilnya dengan generator polynomial yang digunakan (di sini 𝑥 8 + 𝑥 2 + 𝑥 + 1 = 0x07 dalam heksadesimal). Sebaliknya, jika MSB = ‘0’, geser register (juga input data) sebanyak satu bit ke kiri ( left shift ).
d. Jika masih terdapat bit dari input data yang belum diproses, kembali ke langkah 2. Proses ini dilakukan untuk setiap bit hingga keseluruhan bit pada input data diproses.
Berbeda dengan algoritma di atas yang menghitung nilai CRC dengan cara memproses bit per bit, algoritma untuk komputasi nilai CRC-8 yang menggunakan tabel lookup memproses input data satu byte pada setiap iterasi saat  perhitungan CRC (byte per byte). Dalam proses ini, satu  operasi lookup dilakukan untuk  setiap input byte yang  diproses  pada  suatu  iterasi.  Nilai  yang  disimpan  pada  tabel  merupakan  nilai  yang  telah  dihitung  terlebih dahulu  sebelum  digunakan  dan  untuk  CRC-8  terdapat  256  nilai  yang  disimpan  pada  tabel  ini  seperti  yang ditunjukkan pada Gambar 4.
Gambar 4. Tabel untuk perhitungan nilai CRC-8 dengan Generator Polynomial 𝑥 8 + 𝑥 2 + 𝑥 + 1
Langkah-langkah  yang  dilakukan  untuk  proses  perhitungan  menggunakan  tabel lookup adalah  sebagai berikut. a. Inisialisasi register/variabel yang digunakan untuk menyimpan nilai CRC (semua bit pada register = ‘0’).
b. Baca input (satu byte) dari data atau pesan yang dimasukkan oleh user .
c. Lakukan operasi XOR antara isi register dengan input yang dibaca pada langkah 2.
d. Gunakan hasil dari  operasi  XOR ini untuk mengindeks tabel lookup . Ambil nilai dari tabel  dan simpan ke register.
e. Jika masih terdapat byte dari input data yang belum diproses, kembali ke nomor 2. Proses ini dilakukan untuk setiap bit hingga keseluruhan byte pada input data diproses.
Pada implementasi menggunakan perangkat lunak, user memasukkan data dalam bentuk karakter (ASCII). Saat semua bit (untuk perhitungan secara bitwise ) atau byte (untuk perhitungan menggunakan tabel lookup ) pada input data  telah diproses, isi dari register/variabel merupakan nilai CRC-8 dari  input data yang merupakan sisa hasil bagi ( remainder ) dari proses pembagian yang dilakukan. Hasil implementasi yang dilakukan menggunakan Arduino  ditunjukkan  pada  Gambar  5.  Pada  implementasi  ini, user memasukkan  data  yang  akan  dihitung  nilai CRC-nya melalui Serial Monitor pada Arduino  IDE. Sebagai  contoh  pada Gambar 5, user memasukkan string “13” dan “135”. Nilai CRC-8 dari kedua input tersebut masing-masing adalah 75 dan C7 dalam heksadesimal. Suatu string yang panjang juga dapat diberikan sebagai input untuk dihitung nilai CRC-nya. Untuk input “test crc arduino”, nilai CRC-nya adalah C1. Selain implementasi pada Arduino, implementasi encoder juga dilakukan pada komputer  untuk  membandingkan  hasil  perhitungan  CRC-8  yang  diperoleh.  Implementasi  pada  komputer menggunakan bahasa pemrograman C++ dan berjalan pada sistem operasi Linux Ubuntu 20.04 LTS seperti yang

## JURNAL MEDIA INFORMATIKA BUDIDARMA
ISSN 2614-5278 (media cetak), ISSN 2548-8368 (media online) Available Online at https://ejurnal.stmik-budidarma.ac.id/index.php/mib DOI: 10.30865/mib.v6i3.4366
ditunjukkan pada Gambar 6. Selanjutnya, Gambar 7 dan Gambar 8 masing-masing menunjukkan perhitungan nilai CRC  secara  manual  untuk  input  data  “13”  dengan  pembagian  ( bitwise )  dan  menggunakan  tabel lookup .  Hasil perhitungan ini sesuai dengan hasil yang ditunjukkan pada Gambar 5 dan Gambar 6.
Gambar 5. Tampilan perhitungan CRC-8 pada Serial Monitor Arduino IDE
Gambar 6. Tampilan perhitungan CRC-8 pada Linux Ubuntu
Gambar 7. Perhitungan nilai CRC-8 untuk input “13” dengan proses pembagian

## JURNAL MEDIA INFORMATIKA BUDIDARMA
ISSN 2614-5278 (media cetak), ISSN 2548-8368 (media online) Available Online at https://ejurnal.stmik-budidarma.ac.id/index.php/mib DOI: 10.30865/mib.v6i3.4366
Gambar 8. Perhitungan nilai CRC-8 untuk input “13” menggunakan Tabel Lookup

## 3.2 Implementasi pada Perangkat Keras
Implementasi pada perangkat keras menggunakan dua board , yaitu Arduino Uno R3 dan DFRduino Duemilanove 328  seperti  yang  ditunjukkan  pada  Gambar  9.  Satu board berfungsi  sebagai  pengirim  dan board yang  lainnya sebagai  penerima.  Komunikasi  serial  antar board diimplementasikan  menggunakan library  SoftwareSerial di mana pin 6 dan pin 7 masing-masing digunakan sebagai pin Rx dan pin Tx. Selain itu, pada board pengirim juga digunakan  sebuah Liquid  Crystal  Display (LCD) untuk  menampilkan  data  yang  dimasukkan  oleh user melalui Serial  Monitor pada  Arduino  IDE  dan  hasil  perhitungan  nilai  CRC  dari  data  tersebut.  Untuk  input  data  yang panjangnya  melebihi  11  karakter,  hanya  hasil  perhitungan  CRC-nya  saja  yang  ditampilkan  pada  LCD.  Setelah nilai  CRC  dihitung, codeword yang  akan  ditransmisikan  kemudian  dibentuk  dengan  menggabungkan  data  dan nilai CRC-nya sesuai dengan persamaan (2). Sebagai contoh untuk input data “13”, maka data yang ditransmisikan adalah “13u” dalam ASCII atau “313375” dalam heksadesimal.
Gambar 9. Hasil implementasi pada perangkat keras

## 3.3 Pengujian
Pengujian terhadap hasil implementasi CRC-8 encoder pada Arduino dilakukan dengan membandingkan waktu yang dibutuhkan untuk menghitung nilai CRC dari suatu input data dan  ruang penyimpanan program ( program storage space ) yang digunakan oleh kedua implementasi algoritma. Tabel 2 menunjukkan spesifikasi board yang digunakan  untuk  proses  pengujian  CRC-8 encoder yang  telah  diimplementasikan.  Perbandingan  ruang penyimpanan program yang digunakan oleh kedua implementasi ditunjukkan pada Tabel 3. Dapat dilihat bahwa implementasi yang menggunakan perhitungan CRC secara bitwise dan menggunakan tabel lookup masing-masing membutuhkan 27% dan 28% dari total ruang penyimpanan. Dengan demikian, masih terdapat ruang penyimpanan yang  cukup  jika board akan  digunakan  untuk  mengimplementasikan  fungsi-fungsi  yang  lain  (misalnya, mengontrol relay , mengontrol motor servo , dan membaca data dari sensor). Penggunaan ruang penyimpanan ini dapat dikurangi jika program atau perangkat keras tidak membutuhkan keluaran pada LCD untuk menampilkan hasil perhitungan CRC. Selain itu, waktu yang diperlukan untuk melakukan encoding oleh kedua algoritma untuk panjang  input  2  karakter  dan  128  karakter  juga  ditunjukkan  pada  Tabel  3.  Hasil  ini  menunjukkan  bahwa perhitungan  menggunakan  tabel lookup lebih  cepat  dibandingkan  dengan  cara  konvensional  ( bitwise ),  tetapi membutuhkan memori yang lebih banyak. Sebaliknya, perhitungan dengan cara konvensional menggunakan lebih sedikit memori, tetapi waktunya lebih lama. Untuk implementasi CRC-8 decoder pada penerima ( board DFRduino Duemilanove 328), kapasitas ruang penyimpanan program yang digunakan adalah 5694 dari 30720 bytes (18%).

## JURNAL MEDIA INFORMATIKA BUDIDARMA
ISSN 2614-5278 (media cetak), ISSN 2548-8368 (media online) Available Online at https://ejurnal.stmik-budidarma.ac.id/index.php/mib DOI: 10.30865/mib.v6i3.4366
Tabel 2. Board yang digunakan dalam pengujian Resource Arduino Uno R3 DFRduino Duemilanove 328 Microcontroller Atmel ATmega328 16 MHz Atmel ATmega328 16 MHz Digital I/O pin 14 (6 PWM output) 14 (6 PWM output) Analog Input pin 6 6 Flash memory 32 KB, 512 bytes untuk bootloader  32 KB, 2 KB untuk bootloader SRAM 2 KB 2 KB EEPROM 1 KB 1 KB
Tabel 3. Penggunaan ruang penyimpanan program dan waktu encoding untuk kedua algoritma
Bitwise Tabel lookup Encoder (pada Arduino Uno R3) 8796 dari 32256 bytes (27%)  9042 dari 32256 bytes (28%) Waktu (input: 2 karakter) 48 mikrodetik 16 mikrodetik Waktu (input:128 karakter) 2.37 milidetik 0.5 milidetik
Pada  proses  pengujian  juga  dilakukan  verifikasi  untuk  memastikan  kebenaran  ( correctness )  hasil perhitungan  nilai  CRC  yang  diperoleh  dari encoder yang  diimplementasikan  dengan  hasil  perhitungan menggunakan kalkulator CRC daring [20]. Berdasarkan hasil pengujian ini didapatkan bahwa perhitungan CRC- 8 yang diimplementasikan sudah tepat dan sama dengan hasil dari kalkulator tersebut. Pengujian juga dilakukan untuk  input  data  dengan  panjang  yang  bervariasi  dan  hasilnya  sesuai  dengan  persamaan  matematis  untuk menghitung CRC-8. Pengujian berikutnya adalah pengujian transmisi data untuk mengetahui apakah decoder pada penerima  dapat  mendeteksi error pada  data.  Pengujian  pertama  dilakukan  dengan  mentransmisikan  data  yang benar (tanpa error )  seperti yang ditunjukkan pada Gambar 10.  Data atau codeword yang ditransmisikan adalah “13u” atau dalam notasi biner adalah 001100010011001101110101. Pada sisi penerima, decoder akan melakukan proses  pembagian  antara  data  yang  diterima  dengan  generator  polynomial  yang  digunakan.  Setelah  itu  akan diperiksa  sisa  hasil  pembagiannya.  Jika  sisa  hasil  pembagian  adalah  0,  maka  dapat  disimpulkan  bahwa  tidak terdapat error pada data yang ditransmisikan. Sebaliknya, maka terdapat error pada data seperti yang ditunjukkan pada Gambar 11.  Untuk simulasi  pengujian dengan error pada data, dilakukan perubahan dua bit terakhir pada data yang ditransmisikan sehingga menjadi “13v” atau dalam notasi biner adalah 0011000100110011011101 10 .
Gambar 10. Pengujian transmisi data (tanpa error ): (a) pengirim, (b) penerima
Gambar 11. Pengujian transmisi data (dengan error ): (a) pengirim, (b) penerima

## 4. KESIMPULAN
Penelitian  ini  membahas  perancangan  dan  implementasi  kode  pendeteksi error CRC-8  pada  perangkat  IoT (Arduino).  Perancangan  dan  implementasi  difokuskan  pada encoder di  sisi  pengirim  ( transmitter )  dengan menerapkan  dua  algoritma  yang  berbeda  untuk  menghitung  nilai  CRC-8. Decoder pada  penerima diimplementasikan dengan cara yang serupa dengan encoder . Berdasarkan hasil implementasi dan pengujian yang telah  dilakukan,  algoritma  komputasi  CRC  menggunakan  tabel lookup memiliki  waktu  perhitungan  yang  lebih cepat  dibandingkan  perhitungan  CRC  secara bitwise .  Namun,  dari  sisi  ruang  penyimpanan  atau  memori  untuk implementasi program, algoritma yang menggunakan tabel lookup membutuhkan memori yang lebih besar. Pada pengujian  dengan input data sepanjang 128 karakter, encoder dengan bitwise membutuhkan waktu perhitungan sebesar  2.37  milidetik,  sedangkan encoder dengan  tabel lookup membutuhkan  waktu  perhitungan  sebesar  0.5

## JURNAL MEDIA INFORMATIKA BUDIDARMA
ISSN 2614-5278 (media cetak), ISSN 2548-8368 (media online) Available Online at https://ejurnal.stmik-budidarma.ac.id/index.php/mib DOI: 10.30865/mib.v6i3.4366
milidetik.  Dari  sisi  penggunaan  memori, encoder dengan bitwise membutuhkan  memori  sebesar  8796  byte, sedangkan encoder dengan tabel lookup membutuhkan memori  sebesar 9042 byte.  Verifikasi  untuk memeriksa kebenaran  hasil  perhitungan  oleh encoder dilakukan  dengan  membandingkan  hasil  tersebut  dengan  hasil perhitungan  secara  manual  dan  hasil  perhitungan menggunakan  kalkulator  daring.  Selanjutnya,  pada  pengujian transmisi  data  diperoleh  bahwa  implementasi  sistem  pendeteksi error menggunakan  CRC-8  ini  dapat  berjalan dengan  baik. Decoder pada  sisi  penerima  dapat  mendeteksi  adanya error atau  perubahan  bit  pada  data  yang ditransmisikan. Untuk pengembangan penelitian ini lebih lanjut, dapat dibuat suatu library untuk komputasi nilai CRC yang bervariasi sesuai dengan kebutuhan, misalnya untuk menghitung nilai CRC-16, CRC-24, dan CRC-32. CRC-24 merupakan kode pendeteksi error yang digunakan pada Bluetooth Low Energy (BLE) yang merupakan salah  satu  teknologi  yang  digunakan  untuk  aplikasi  IoT.  Selain  itu  dapat  juga  diimplementasikan  jenis  kode pendeteksi error selain CRC, misalnya kode Hamming, maupun kode pengoreksi error .

## REFERENCES
[1] W. Stallings, Data and Computer Communications , 10th ed. Pearson, 2014.
[2] T. Moon, Error Correction Coding: Mathematical Methods and Algorithms , 2nd ed. Wiley, 2020.
[3] Y. Cai, S. Ghose, E. F. Haratsch, Y. Luo, and O. Mutlu, “Error Characterization, Mitigation, and Recovery in Flash- Memory-Based  Solid-State  Drives,” Proc.  IEEE ,  vol.  105,  no.  9,  pp.  1666–1704,  Sep.  2017,  doi: 10.1109/JPROC.2017.2713127.
[4] N. Sridevi, K. Jamal, and K. Mannem, “Implementation of Cyclic Redundancy Check in Data Recovery,” Proc. 2nd Int. Conf. Electron. Sustain. Commun. Syst. ICESC 2021 , pp. 17–24, Aug. 2021, doi: 10.1109/ICESC51422.2021.9532802.
[5] W. W. Peterson and D. T. Brown, “Cyclic Codes for Error Detection,” Proc. IRE , vol. 49, no. 1, pp. 228–235, 1961, doi: 10.1109/JRPROC.1961.287814.
[6] B. Forouzan, Data Communications and Networking , 5th ed. McGraw-Hill, 2013.
[7] L. A. Zhou and Z. L. Nie, “An Enhanced Decision-Making Fault Detection Model in Medical IoT Embedded Systems,” Wirel. Pers. Commun. , 2021, doi: 10.1007/S11277-021-08759-8.
[8] H. Liu, Z. Qiu, W. Pan, J. Li,  L.  Zheng, and Y. Gao,  “Low-Cost and Programmable CRC Implementation Based on FPGA,” IEEE  Trans.  Circuits  Syst.  II  Express  Briefs ,  vol.  68,  no.  1,  pp.  211–215,  Jan.  2021,  doi: 10.1109/TCSII.2020.3008932.
[9] M.  M.  Arifin,  M.  T.  Hasan,  M.  T.  Islam,  M.  A.  Hasan,  and  H.  S.  Mondal,  “Design  and  Implementation  of  High Performance Parallel CRC Architecture for Advanced Data Communication,” 2019 4th Int. Conf. Electr. Inf. Commun. Technol. EICT 2019 , Dec. 2019, doi: 10.1109/EICT48899.2019.9068750.
[10]  X. Zhang and Y. J. Tang, “Low-complexity parallel cyclic redundancy check,” Proc. - IEEE Int. Symp. Circuits Syst. , vol. 2021-May, 2021, doi: 10.1109/ISCAS51556.2021.9401679.
[11]  “Arduino.” https://www.arduino.cc/ (accessed Jun. 17, 2022).
[12]  A. R. Saleh and S. A. Sudiro, “CRC 8-bit Encoder-Decoder Component in FPGA using VHDL,” ELKOMIKA J. Tek. Energi Elektr. Tek. Telekomun. Tek. Elektron. , vol. 8, no. 1, p. 58, Jan. 2020, doi: 10.26760/elkomika.v8i1.58.
[13]  G.  Natalia,  S.  Suwadi,  and  T.  Suryani,  “Implementasi  Encoder  dan  Decoder  Cyclic  Redundancy  Check  Pada TMS320C6416T,” J. Tek. ITS , vol. 3, no. 1, pp. A92–A97, Mar. 2014, doi: 10.12962/j23373539.v3i1.5504.
[14]  “Simulink - Simulation and Model-Based Design - MATLAB & Simulink.”
https://www.mathworks.com/products/simulink.html (accessed Jun. 05, 2022).
[15]  A. S. Panda and G. L. Kumar, “Comparison of serial data-input CRC and parallel data-input CRC design for CRC-8 ATM  HEC  employing  MLFSR,” 2014  Int.  Conf.  Electron.  Commun.  Syst.  ICECS  2014 ,  2014,  doi: 10.1109/ECS.2014.6892739.
[16]  A. H. Saleh, K. M. Saleh, and S. Al-Azawi, “Design and simulation of CRC encoder and decoder using VHDL,” 1st Int. Sci.  Conf. Eng.  Sci.  - 3rd  Sci.  Conf.  Eng. Sci.  ISCES  2018  -  Proc. ,  vol.  2018-January,  pp.  221–225,  Apr.  2018,  doi: 10.1109/ISCES.2018.8340557.
[17]  R. Novaldi, S. Akbar, and P. Rakhmadhany, “Implementasi Error Detection System Pada Komunikasi Serial Arduino Menggunakan Metode Cyclic Redundancy Check (CRC),” J. Pengemb. Teknol. Inf. dan Ilmu Komput. , vol. 3, no. 2, pp. 1480–1485, 2018, [Online]. Available: https://j-ptiik.ub.ac.id/index.php/j-ptiik/article/view/4412.
[18]  J. Kurose and K. Ross, Computer Networking A Top-Down Approach , 8th ed. Pearson, 2020.
[19]  “Arduino UNO R3.” https://docs.arduino.cc/hardware/uno-rev3 (accessed Jun. 11, 2022).
[20]  “Online CRC-8 CRC-16 CRC-32 Calculator.” https://crccalc.com/ (accessed Jun. 22, 2022).