Seri port algoritma sorusu

Başlatan görkem, 15 Mart 2019, 16:59:30

görkem

Arkadaşlar merhaba,

Seri porttan ReadLine komutu kullanarak string veri çekiyorum 1000 er byte şeklinde verileri pc ye gönderiyorum
fakat 1000 byte ın içinde NewLine karakteride mevcut. 1000 byte olmadan veri alma sonlanıyor doğal olarak. Nasıl bir algoritma kullanmalıyım ki NewLine karekterlerini yoksayabiliyim ?


quarko

ReadLine ile okuyorsan '\n' karakterini görene kadar okur. Onun yerine Read veya ReadExisting komutları olması lazım. Okumayı öyle gerçekleştirirsen, '\n' karakterlerini atlayabilirsin.
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

görkem

o komutlar ile veri kaçırıyor fakat readline ile veri kaçırmıyor işin içinden çıkamadım bir türlü

brandice5

ReceivedBytesThreshold değerini 1000 yap.

görkem

mantığını şu şekilde ayarlamıştım
timer ile veri gelip gelmediğini kontrol ediyorum.ilk bir byte işaret byte ı gönderiyorum pc ye sonra sonsuz döngü içerisinde readline komutunu kullanıyorum  1000 byte veri sağlıklı şekilde alınıyor taki newline karakteri 1000 byte verinin içinde olana kadar.

ben eğer ReceivedBytesThreshold  değerini 1000 yaparsam işaret byte ını kullanamayacağım

açıkcası c# da seriport u hiç verimli kullanamadam usb de sorun yaşamadım  fakat seri port hep sorun çıkarttı bana

stabil haberleşmeyi seri portta asenkron olarak tam manasıyla nasıl yapabiliriz

Endorfin35+

Bir ara benzer bir sorunla ugrasmistim. Gonderdugun verinin sonuna kendi ozel karakterini koysan, pc tarafinda ozel karakterini goresiye kadar okusan, bir kac parca olursa sonradan birlestirsen olur belki...
"İşi bilen yapar, az bilen akıl verir, bilmeyen eleştirir, yapamayan çamur atar."

görkem

Readline haricinde bir türlü veri alamıyorum alabilsem dediğinizi yapabilirim

quarko

Veri gelip gelmediğini timer ile kontrol etmen zaten ilk hatan. DateReceived olayı tetiklenecek şekilde ayarla. O zaman ReadLine a da mecbur kalmazsın. Veri geldiğinde eksiksiz bir şekilde alır, düzgün bir parser yazabilirsen işini halledebilirsin.
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

Gediz1337

Bence de DataReceived kullanmak daha makul bir yöntem ama bir şekilde DataReceived kullanmadan halletmek durumundaysanız farklı bir yolu deneyebilirsiniz. Çok düzgün bir yöntem değil ama, porta ait NewLine propertysini "\n" dışında bir karakter yapmayı denediniz mi?

foseydon

C# seri port uygulamasinda en mantikli yontem polling. bir timer kurun, veriyi orda toplayin. readline'in veri kacirma ile alakasi yok, o sadece veriyi okuma sekli. isterseniz readbyte ile byte olarakta okuyabilirsiniz. veriyi string yerine ham okumak daha mantikli, bir utility class yazin kendinize bu tarz data cevrim isleri icin her zaman kullanirsiniz.

cripple

timer ile kontrol ederek seri port tan data okunduğunda veri kaybı ihtimali yüksektir. Event kullanmak çok daha mantıklı SerialDataReceivedEventHandler fonksiyonu ile event i aktif edebilirsiniz. Daha sonra da ReadLine kullanmak yerine (zaten kelime anlamı satırı oku demek oluyor \n geldiğinde bu fonksiyon durmak üzere yazılmıştır) ReadByte veya ReadChar fonksiyonlarından herhangi birini kullanrak byte byte okuyabilrsiniz. Okuduğunuz bir buffer a alıp parsing işlemleri ile kullanırsınız.