Ada banyak cara untuk menulis protokol serial tergantung pada fungsionalitas apa yang Anda inginkan dan berapa banyak pengecekan kesalahan yang Anda butuhkan.
Beberapa hal umum yang Anda lihat dalam protokol point to point adalah:
Akhir dari pesan
Protokol ASCII paling sederhana hanya memiliki akhir dari urutan karakter pesan, sering \r
atau \n
karena ini adalah apa yang akan dicetak ketika tombol enter ditekan. Protokol biner mungkin menggunakan 0x03
atau byte umum lainnya.
Mulai dari pesan
Masalah dengan hanya memiliki akhir pesan adalah bahwa Anda tidak tahu byte lain apa yang telah diterima ketika Anda mengirim pesan Anda. Bytes ini kemudian akan diawali dengan pesan dan menyebabkannya ditafsirkan secara salah. Misalnya, jika Arduino baru saja bangun dari tidur mungkin ada beberapa sampah di buffer serial. Untuk menyiasatinya, Anda memiliki urutan pesan yang dimulai. Dalam contoh Anda, ^
sering dalam protokol biner0x02
Pemeriksaan Kesalahan
Jika pesan dapat rusak kami perlu memeriksa kesalahan. Ini bisa berupa checksum atau kesalahan CRC atau yang lainnya.
Karakter Escape
Bisa jadi checksum itu menambah karakter kontrol, seperti byte 'awal pesan' atau 'akhir pesan', atau pesan berisi nilai yang sama dengan karakter kontrol. Solusinya adalah memperkenalkan karakter pelarian. Karakter melarikan diri ditempatkan sebelum karakter kontrol yang dimodifikasi sehingga karakter kontrol yang sebenarnya tidak ada. Misalnya, jika karakter awal adalah 0x02, menggunakan karakter escape 0x10 kita dapat mengirim nilai 0x02 dalam pesan sebagai pasangan byte 0x10 0x12 (karakter kontrol XOR byte)
Nomor paket
Jika sebuah pesan rusak, kami dapat meminta pengiriman ulang dengan pesan kosong atau coba lagi, tetapi jika beberapa pesan telah terkirim maka hanya pesan terbaru yang dapat dikirim ulang. Sebaliknya paket tersebut dapat diberi nomor yang berguling setelah sejumlah pesan. Misalnya, jika nomor ini 16, perangkat pengirim dapat menyimpan 16 pesan terakhir yang dikirim dan jika ada yang rusak, perangkat penerima dapat meminta pengiriman ulang menggunakan nomor paket.
Panjangnya
Seringkali dalam protokol biner Anda melihat byte panjang yang memberitahu perangkat penerima berapa banyak karakter dalam pesan. Ini menambahkan tingkat lain pengecekan kesalahan seolah-olah jumlah byte yang benar tidak diterima maka ada kesalahan.
Khusus Arduino
Saat membuat protokol untuk Arduino, pertimbangan pertama adalah seberapa andal saluran komunikasi. Jika Anda mengirim lebih dari sebagian besar media nirkabel, XBee, WiFi, dll, sudah ada built in pengecekan dan coba ulang kesalahan dan dengan demikian tidak ada gunanya menempatkan ini dalam protokol Anda. Jika Anda mengirim lebih dari RS422 selama beberapa kilometer maka itu akan diperlukan. Hal-hal yang akan saya sertakan adalah mulai dari pesan dan akhir karakter pesan, seperti yang Anda miliki. Implementasi khas saya terlihat seperti:
>messageType,data1,data2,…,dataN\n
Membatasi bagian data dengan koma memungkinkan penguraian yang mudah, dan pesan dikirim menggunakan ASCII. Protokol ASCII sangat bagus karena Anda dapat mengetik pesan ke monitor serial.
Jika Anda menginginkan protokol biner, mungkin untuk mempersingkat ukuran pesan, Anda harus menerapkan melarikan diri jika byte data dapat sama dengan byte kontrol. Karakter kontrol biner lebih baik untuk sistem di mana spektrum penuh pengecekan kesalahan dan coba lagi diinginkan. Payloadnya masih bisa ASCII jika diinginkan.