seri porttan gelen data

Başlatan fofo, 02 Nisan 2016, 17:17:08

fofo

Merhaba seri portttan gelen uzunluğu belirsiz verileri işlemek için protonda nasıl bir yol izlemeliyim.  Gelen veri örnek  "ABCD"  "BBBBBBB"  "124" gibi
seri porttan   "BBBBBBB" gelmişse  portb.1=1   "ABCD"  gelmişse portb.1=0  gibi

zengdai

Bu sıkıntıyı bende yaşamıştım. İyi hatırlamamakla beraber, gelen veri için kullandığımız pic lerin 2 veya 4 baytlık buffer limiti vardır.Yani gelen verinin 2 baytı bu tamponu doldurur bir süre kalır ve sonra gelen yeni veriyi doldurur. Bu sürede siz okumazsanız silinip gider. Büyük ifadeleri okuyabilmek için yanılmıyorsam circular buffer denilen bir teknik olacaktı.
Dua etmeyi unutmayın.     

ferdem

Belirsizlikle baş etmek zor, belirli olsun. Haberleşmede kullanılan hazır protokolleri inceleyin veya kendiniz basit bir protokol oluşturup kullanın.
Örneğin her çerçeve özel karakterle başlasın($$ mesela), sonraki karakter çerçevede kaç byte geleceğini söylesin, örnekler:
$,$,3,A,B,C
$,$,2,A,B
$,$,7,A,B,C,D,E,F,G

Alıcı tarafta $$ kontrolü yapılacak, tespit yapıldığında arkasındaki bilgileri kullanarak işlem yapabilirsiniz.

Hadi

Alıntı yapılan: fofo - 02 Nisan 2016, 17:17:08
Merhaba seri portttan gelen uzunluğu belirsiz verileri işlemek için protonda nasıl bir yol izlemeliyim.  Gelen veri örnek  "ABCD"  "BBBBBBB"  "124" gibi
seri porttan   "BBBBBBB" gelmişse  portb.1=1   "ABCD"  gelmişse portb.1=0  gibi

otomata ve biçimsel diller diye bi ders almıştım. o dersi hatırladım. bilmem ama belki yararı olur diye yazayım dedim.


fofo

Alıntı YapBelirsizlikle baş etmek zor, belirli olsun. Haberleşmede kullanılan hazır protokolleri inceleyin veya kendiniz basit bir protokol oluşturup kullanın.
Örneğin her çerçeve özel karakterle başlasın($$ mesela), sonraki karakter çerçevede kaç byte geleceğini söylesin, örnekler:
ferdem
karşıdan gelen veriye işaretçi ekleme imkanı yok, gelen bilgi uzunluğu değişen kelime veya sayı şeklinde. Amaç gelen bilgiyi PIC in hafızasındaki ile karşılaştırmak ve işlemyapmak.

ferdem

Anladım hocam, o zaman karşıdan gelecek en uzun kelime, sayıya göre bir "buffer" tutmalısınız, örneğin en uzun 25 karakterli ise 25 uzunluklu bir dizi tanımlayacaksınız. Her yeni gelen veriyi bu diziye ekleyeceksiniz, veri geldikçe eskiler atılacak. Bu aslında bir "circular buffer" oluyor.
Her veri geldiğinde aşağıdaki gibi bir mantıkla "buffer" dizisi "circular" olarak kullanılır ve kontrol yapılır.

index=index % 25; // mod
buffer[index]=veri;
index++;
received_command=search_in_buffer();

if(received_command==1){ //AAABBB tespit

}
if(received_command==2){ //123 tespit

}

search_in_buffer her veri gedliğinde diziye bakıp komut var mı diye bakacak bir fonksiyon.
Son veri ile 25 elemanlı kelime de gelmiş(tamamlanmış) olabilir, 3 elemanlı kelime de gelmiş olabilir.
Proton bilmeden konuya cevap yazdım, protonda "circular buffer" en kolay nasıl yapılır bilmiyorum, "proton circular buffer" anahtar kelimeleriyle arama yapılabilir.