Yüksek Hızlı Veri aktarımında Algoritma İhtiyacı.

Mucit23

Yeni Üye
Katılım
7 Ekim 2022
Mesajlar
33
Selamlar

Yazılımla uğraşan arkadaşlara bir sorum olacak.

Bir sistem geliştiriyorum. Değişken periyotlarla gelen ADC verisini Kayıp olmadan STM32'de USB CDC üzerinden PC ye göndermem gerekiyor. Veri gelme sıklığı Min 50ms Max 1ms.

50ms aralıklarla gelen veriyi kayıpsız olarak göndermek kolay. Ama 1ms aralıklara gelen veriyi tampon bellek olmadan bufferlamadan göndermek çok zor. Ben bunun için ilk başta 100 elemandan oluşan bir buffer belirledim. Her 100ms de bir Gelen veriyi biriktirip paket olarak gönderiyordum. 1ms de bir gelen veri için 100ms boyunca gelen örnekleri toplayınca zaten 100 elemanlı buffer dolmuş oluyor. Bunu çapraz bir tampon bellek ile gönderiyorum. Eğer 50ms aralıklarla yeni veri geliyorsa teorik olarak 100ms'de en fazla 2 adet ADC datası gönderirim. Gönderdiğim verinin 2 olduğunu bildiğim için burada da sorun yok. Paket başunda gelen örnek sayısınıda gönderiyorum.

Bu yöntemi pek verimli çalıştıramadım. Daha oturaklı bir sistem kurmam gerekiyor kafam durdu.

Temel ihtiyaçlarım şunlar.
  1. Gelen ADC hızından bağımsız olarak Gecikme yaşanmaması için 100ms aralıklarla veri göndermem gerek.
  2. ADC den okuduğum verilerin kayıpsız bir şekilde göndermem gerekiyor.
  3. 100mS aralıklarla Seri port üzerinden yada USB CDC ile gönderirken verinin kayıpsız bir şekilde gönderilmesi gerekiyor.
Gelen verileri c# üzerinde serialport nesnesi ile alıyorum. Paket uzunluğum sabit olduğu için serialPort1.Read(RxBuffer, 0, ReadLenght); gibi bir komut ile veriyi alıyorum. Ama veri aktarımında bu yöntem de aklıma yatmıyor. Burada sanki arada veri kaybı olduğunu hissediyorum.

Sorularım şunlar.

C# da PC ye veri aktarırken veri boyutunun sabit olduğunu düşünürsek en sağlıklı veri aktarım yöntemi hangisidir? Yada serialport sınıfını daha sağlıklı bir şekilde kullanmanın yolu varmıdır?

Ek olarak USB CDC de veri aktarım hızı baudrateden bağımsız olarak 1Mbitlerin üstünde. Dolayısıyla belki Seri porttan 1ms aralıklarla veri göndermem de sorun olmayacak ama PC tarafında sürekli serialportDataRecieved olayı tetiklendiği için program kasılacak. Bunu istemiyorum. Burada nasıl bir algoritma nasıl bir yapı kurmam gerektiği hakkında önerilere ihtiyacım var.

Donanım ile PC arasında yüksek hızlı veri transferinde kullanılan algoritmaları öğrenmek istiyorum.
 
Windows programının "kasılması", thread kullanımını anlamamak veya başaramamak nedeniyle olur. USB, Seri port cdc, hid fark etmez. Thread içinde biriken veriyi incitmeden dışarıya almak mümkündür. Aslında veri "kayıpsız" olarak Windows sürücülerine ulaşır. Orada bir yerde depolanır. Windows içinde zaten buffer vardır. Mesela 1sn boyunca okuma yapılamamışsa işte o zaman kopma olur. Büyük bir buffer mümkün.

USB yüksek hızlı transfer için Bulk yöntemi iyi. CDC de bulk transfer kullanır. Kayıpsız gönderir. isochronous transfer, daha yüksek hızları destekler. Ses gibi kopmanın önemsiz olduğu işlerde tercih edilir. Mutabakat garantili transfer isochronous için iddia edilemez.

Büyük ihtimalle başarılı işlem için özel DLL gerekir. Aslında DLL, veriyi Windows tan alarak sizin programa iletecek. İçinde thread çalışacak. C# kullanan gelişirici bu derin işlerle meşgul olmak istemeyebilir. DLL iyidir. Çok severim. Yaptım kullanıyorum. Donanım ile birlikte veriyorum.

Stm32 USB scope projesi varsa, büyük ihtimalle istediğiniz işi yapıyor demektir
 
Son düzenleme:
USB "bulk endpoint" kullanarak çok yüksek transfer hızları elde edilebilir. Ama senin sorun yüksek bant genişliğinden ziyade çok düşük tepki süresi diye anlıyorum. Bir windows makinada da bu konuda yapılacak şeyler kısıtlıdır. Kötü bir driver yüklenmiştir, işlemciyi meşgul eder ve USB portları yeterince hızlı servis edilemez windows tarafından ...
 
Aslında Çapraz bufferleme ile güzel bir alogirtma kurmuşum fakat transfer aşamasında problem yaşıyorum. Bu yüzden Veri bufferleme algoritmamı bozmadan Veriyi gönderirken string olarak göndermeye karar verdim. Bu şekilde PC ye gönderdiğim Veriyi herhangi bir terminal yazılımı ile görselleştirip sorunu anlamaya çalışacağım.
 

Çevrimiçi üyeler

Forum istatistikleri

Konular
8,586
Mesajlar
140,422
Üyeler
3,407
Son üye
Ramazan

Son kaynaklar

Son profil mesajları

Abdullah karaoglan falcon_browning Abdullah karaoglan wrote on falcon_browning's profile.
selamın aleyküm ses sistemindeki cızırtıyı hallettınızmi
"Araştırma, ne yaptığını bilmediğinde yaptığın şeydir." - Wernher von Braun
“Kendi yolunu çizen kişi, kimsenin izinden gitmez.” – Nietzsche
Kim İslâm’da güzel bir çığır açarsa (güzel bir alışkanlık başlatırsa), onun sevabı ve kendisinden sonra ona uyanların sevapları, onların sevaplarından hiçbir şey eksilmeksizin ona da yazılır.
erdemtr55 taydin erdemtr55 wrote on taydin's profile.
Merhaba Taydin bey,
Gruba spms serisi yapıcak mısınız?
ben 3 sargılı toroid ile 2 adet flyback sürücek bir devre yapmayı düşünüyorum.size soracak sorularım vardı?
Back
Top