İstediğiniz işlevselliğe ve ne kadar hata kontrolüne ihtiyacınız olduğuna bağlı olarak bir seri protokol yazmanın birçok yolu vardır.
Noktadan noktaya protokollerde sık karşılaştığınız bazı şeyler şunlardır:
Mesajın sonu
En basit ASCII protokolleri sadece mesaj sonu dizisine sahiptir, genellikle \r
veya \n
enter tuşuna basıldığında yazdırılan şey budur. İkili protokoller 0x03
veya başka bir ortak bayt kullanabilir.
Mesajın başlangıcı
İletinin sonuna gelmeyle ilgili sorun, iletinizi gönderdiğinizde başka hangi baytların zaten alındığını bilmemenizdir. Bu baytlar daha sonra mesaja önek olarak eklenir ve yanlış yorumlanmasına neden olur. Örneğin, Arduino uykudan yeni uyandıysa, seri tamponda biraz çöp olabilir. Bu sorunu çözmek için bir mesaj dizisi başlangıcı vardır. Örneğinizde, ^
ikili protokollerde sıklıkla0x02
Hata kontrolü
Mesaj bozulabiliyorsa, hata kontrolü yapmamız gerekir. Bu bir sağlama toplamı veya bir CRC hatası veya başka bir şey olabilir.
Kaçış Karakterleri
Sağlama toplamı, 'mesaj başlangıcı' veya 'mesaj sonu' baytı gibi bir kontrol karakterine eklenebilir veya mesaj bir kontrol karakterine eşit bir değer içerebilir. Çözüm bir kaçış karakteri getirmektir. Çıkış karakteri, gerçek kontrol karakterinin bulunmaması için değiştirilmiş bir kontrol karakterinin önüne yerleştirilir . Bir başlangıç karakteri 0x02 ise, 0x10 çıkış karakterini kullanarak mesajdaki 0x02 değerini 0x10 0x12 bayt çifti olarak gönderebiliriz (bayt XOR kontrol karakteri)
Paket numarası
Bir mesaj bozulursa, bir yoklama veya yeniden deneme mesajı ile yeniden gönderme talebinde bulunabiliriz, ancak birden fazla mesaj gönderildiyse yalnızca en son mesaj yeniden gönderilebilir. Bunun yerine pakete belirli sayıda mesajdan sonra dönen bir sayı verilebilir. Örneğin, bu sayı 16 ise, verici cihaz gönderilen son 16 mesajı saklayabilir ve herhangi bir bozulma durumunda alıcı cihaz paket numarasını kullanarak yeniden gönderme talebinde bulunabilir.
uzunluk
Genellikle ikili protokollerde, alıcı cihaza mesajda kaç karakter olduğunu söyleyen bir uzunluk baytı görürsünüz. Bu, doğru sayıda bayt alınmamış gibi başka bir hata denetimi düzeyi ekler, ardından bir hata oluştu.
Arduino'ya özgü
Arduino için bir protokol hazırlarken, ilk düşünce iletişim kanalının ne kadar güvenilir olduğudur. Çoğu kablosuz ortam, XBee, WiFi vb. Üzerinden gönderiyorsanız, zaten hata kontrolü ve yeniden denemelerde yerleşiktir ve bu nedenle bunları protokolünüze koymanın bir anlamı yoktur. Birkaç kilometre boyunca RS422 üzerinden gönderiyorsanız, gerekli olacaktır. İçerdiğim şeyler mesajın başlangıcı ve mesaj karakterlerinin sonu. Benim tipik uygulama şöyle bir şey:
>messageType,data1,data2,…,dataN\n
Veri parçalarının virgülle sınırlandırılması kolay ayrıştırmaya olanak tanır ve mesaj ASCII kullanılarak gönderilir. ASCII protokolleri mükemmeldir çünkü seri monitöre mesaj yazabilirsiniz.
İkili bir protokol istiyorsanız, belki mesaj boyutlarını kısaltmak istiyorsanız, bir veri baytı bir kontrol baytı ile aynı olabiliyorsa kaçmayı uygulamanız gerekir. İkili kontrol karakterleri, tam hata kontrolü ve yeniden deneme spektrumunun istendiği sistemler için daha iyidir. İstenirse taşıma kapasitesi hala ASCII olabilir.