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 ?
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.
o komutlar ile veri kaçırıyor fakat readline ile veri kaçırmıyor işin içinden çıkamadım bir türlü
ReceivedBytesThreshold değerini 1000 yap.
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
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...
Readline haricinde bir türlü veri alamıyorum alabilsem dediğinizi yapabilirim
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.
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 property (https://docs.microsoft.com/en-us/dotnet/api/system.io.ports.serialport.newline?view=netframework-4.7.2)sini "\n" dışında bir karakter yapmayı denediniz mi?
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.
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.
http://www.sparxeng.com/blog/software/must-use-net-system-io-ports-serialport
https://www.hanselman.com/blog/PerformanceOfSystemIOPortsVersusUnmanagedSerialPortCode.aspx