From Friday, April 19th (11:00 PM CDT) through Saturday, April 20th (2:00 PM CDT), 2024, ni.com will undergo system upgrades that may result in temporary service interruption.

We appreciate your patience as we improve our online experience.

NI Ürünleri İle İlgili Tartışmalar

cancel
Showing results for 
Search instead for 
Did you mean: 

Seri haberleşme esnasında bağlantı koptuktan sonra tekrar gelmesi halinde programın stabil çalışmama sorunu

Solved!
Go to solution

Öncelikle merhabalar,

 

Sorunumu anlatmadan programı tanıtacak olursam eğer, tasarlamış olduğum ve üzerinde sensörler, mikroişlemci bulunan bir devre üzerinden seri haberleşme ile (Xbee RF modülü ile) kablosuz veri okuma ve .csv dosyası olarak kaydetme üzerine bir vi oluşturdum. Program mikroişlemci üzerinden gelen sensör datalarını görüntüleyip, kaydederek görevini tamamlamaktadır. Sorun şu ki Xbee modülleri kapsama alanı dışında kaldığında ve veri iletimi bir süreliğine kesildiğinde tekrar kapsama alanı içerisine girse bile program stabil bir şekilde çalışmıyor. Yani datalar atlayarak ve eksik geliyor. (Mikroişlemci üzerinden gönderilen örnek : "aBASINÇbSICAKLIKcYÜKSEKLİKdGPSeHIZ...) Labview üzerinden okuma yaparken gelen bu örnek string paketini parçalayarak yazdırıyorum. Bağlantı koptuktan sonra tekrar geldiği esnada gelen string verileri bu sırada düzenli bir şekilde gelmiyor. Bazen sadece stringin sonu geliyor bazen ise ortasından kesilmiş ve baştan tekrar eklenmiş şekilde geliyor. Sanki bi senkronizasyon sıkıntısı var gibi oluyor. Program kasıyor gibi bir hal alıyor. Stop tuşuna bastığım zaman hemen kapanmıyor bir süre sonra kapanıyor.  Tekrar vurguluyorum program bağlantı kesilene kadar çok stabil çalışıyor. Tüm her şey bağlantı kesildikten ve tekrar geldikten sonra oluyor. Sorunun nerede olduğunu tam olarak anlayamadım. Yardımcı olabilirseniz sevinirim. Teşekkürler. Vİ dosyası ektedir.

Download All
0 Kudos
Message 1 of 7
(4,556 Views)

Vi dosyasını göndermeyi unutmuşum pardon. Ekte bulabilirsiniz

0 Kudos
Message 2 of 7
(4,554 Views)

Selamlar,

PC de labview yüklü olmadığı için programınızı inceleyemiyorum. Fakat tecrübelerime dayanarak şöyle bir yorum yapabilirim,

Kapsama alanı içerisinde gelen/giden verilerde kayma olmaması beklenen durum. Kapsama alanı dışındayken ise verileriniz düzgün şekilde yada hiç iletilemez. Kapsama alanı sorununu çözemeyeceğinize göre yazılımda iyileştirme yaparak bu sıkıntının operasyonunuzu engellemesini sağlayabilirsiniz.

Yapmanız gereken string veri paketinize başlama ve bitiş bitleri eklemek ve paketinizin iletimini bu başlama-bitiş bitleri üzerinden kontrol ettikten sonra sisteminize uygulamak. Örneğin AAxSıcaklıkxNemxBB gibi bir veripaketi hazırlarsanız (burada özellikle belirtmekte fayda var sıcaklık ve nem verilerini kaynaktan okurken boyutunu sabitlemeniz gerekiyor. Yani ilkinde 15 derece okunan sıcaklık 2. kez 15.1 okunursa buda paketinizde kaymaya sebep olacaktır. O yüzden bütün değerlerin boyutunu baştan ayarlamanız faydalı olacaktır) AA ve BB bitlerini sorguladığınızda, sorgunuz başarılı ise paketinizde kayıp yoktur ve okumada kayma yaşamazsınız. Kayıp olan durumlar için ise basit bir döngü hazırlayarak yada tam paket gelene kadar bekle diyerek bu sorunun üstesinden gelebilirsiniz.

 

İyi çalışmalar.

 

0 Kudos
Message 3 of 7
(4,525 Views)

Merhabalar yukarıdaki yorumların hepsine katılıyorum. Birkaç eklemem olacak sadece. Kapsama alanı içerisinde dahi, çeşitli sebeplerden dolayı bu tarz kaymalar meydana gelebilir. Yukarıdaki yorumları dikkate alarak yazılımsal iyileştirmeleri yaptığınız taktirde sağlıklı veri transferi yapabileceksiniz. Ek bir çözüm olarak ise soru cevap şeklinde bir haberleşme yöntemi kullanarak senkronizasyonu sağlayabilirsiniz.

 

Saygılarımla...

Himmet GENCER
Software Development Coordinator at TDG
himmetgencer@gmail.com

View Himmet Gencer's profile on LinkedIn

View on Instagram
0 Kudos
Message 4 of 7
(4,521 Views)

Tekrar merhabalar,

 

Öncelikle bahsettiğiniz durumu anladım. Ama şöyle bir sıkıntı daha mevcut. Mesela basınç değerim 1000.19, yükseklik değerim 35.29 olsun. Bir sonraki yükseklik ve basınç değerim ise 1000.40 a 35.40 olsun.Program normal akışında iken ilk stringte "a35.29b1000.19c.." verisi gelirken kesilip tekrar bağlantığı anda "a35.29b100a35.40b1000.40c...d.." olarak da gelebiliyor. Program içerisinde gelen stringleri read operatörü ile okuduğumda bu tarz bir yapının da geldiğini gördüm. Yani örnekteki gibi basınç değerinin yarısını okumadan üzerine yeniden başlatıyor. Bu şekil bir veri geldiğinden basınç değerini 100 olarak okuyor. Bu da yanlış veri gelmesine sebep oluyor. Bazen de sadece başlangıcı ve sonu geliyor, ara değerler olmuyor. ("a35.29b1000.45n29.45o") Bu durumda başlangıç ve bitiş bitleri kontrolü yapmam ne derece düzgün veri almamı sağlar? İkincisi ise yani bu veri akışı hiç düzelmiyor. True false döngüsünde başlangıç a bitiş o ise döngüye girip okumaya başla desem bu sefer veri öyle gelmeyeceği için okumayı tamamen bırakacak ve program beklemeye alacak diye düşünüyorum. Çünkü bağlantı yeniden geldikten sonra düzgün bir şekilde geldiğini hiç görmedim. Ancak ve ancak kesilme çok kısa süreli ise yeniden düzgün bir şekilde geliyor. Uzun süreli bağlantı kopmalarının ardından string senkronizasyonu bozuluyor. Bu sorun kullandığım haberleşme modülünün senkronizasyonu ile de ilgili olabilir mi? Teşekkürler

0 Kudos
Message 5 of 7
(4,517 Views)

Merhabalar, herhangi bir zamanda bahsettiğiniz hatalardan herhangi birisi oluştuğu zaman "VISA Flush I/O Buffer" komutu ile receive buffer'ı boşaltınız (Timeout'a uğradığında, başlangıç ve bitiş bitlerine bakarak check edemediğiniz durumda). Ayrıca arduino tarafından gönderilen veri paketinin başına kaç byte veri olduğunu ilk 4 byte' a yerleştirirseniz bilgisayar tarafında okurken ne kadar paketlik bir veri olduğunu ilk 4 byte'ı okuyarak öğrenebilirsiniz. Örneğin 520 karakterlik bir veriniz var, bu 520 sayısını 4 byte olarak ifade edip peşinede veriyi ekleyip pc tarafına gönderin.

 

TÜM VERİ = 4byte DataSize + Data  (Arduino Tarafı)

 

İlk 4 byte 'ı oku -> dataSize'a geç -> dataSize kadar tekrar veri oku.

 

Ayrıca soru cevap şeklinde bir iletişim kullanırsınız kontrol daha çok sizde olabilir. Bunuda kısaca özetlemek gerekirse:

 

Labview tarafında temel işlevler aşağıdaki gibi:

 

writeSerial(0x01) 

readSerial(4byte)

Eğer timeout'a uğrarsa veya herhangi bir error oluşursa->VISA Flush I/O Buffer komutu yolla.

dataSize=typeCast(4byte) 4byte'tan dataSize'a dönüştür

readSerial(dataSize)

Eğer timeout'a uğrarsa veya herhangi bir error oluşursa->VISA Flush I/O Buffer komutu yolla.

Herhangi bir hata yoksa zaten diğer işlemlerinizi yapınız.

 

Saygılarımla...

 

Himmet GENCER
Software Development Coordinator at TDG
himmetgencer@gmail.com

View Himmet Gencer's profile on LinkedIn

View on Instagram
0 Kudos
Message 6 of 7
(4,507 Views)
Solution
Accepted by topic author efkean

Yeniden merhabalar,

 

Öncelikle verdiğiniz bilgiler için teşekkürler. Sorunu kendi imkanlarımla halletmeye çalıştım. Bağlantı koptuktan sonra gelen eksik dataları tekrar yer istasyonundan sistem içerisine reset komutu yollayıp data göndermeyi bir süreliğine bekleterek tekrar başlattım. böylece sorun çözülmüş oldu tekrardan düzenli bir şekilde tüm veriler gelmeye başlıyor. İlginize teşekkürler.

0 Kudos
Message 7 of 7
(4,487 Views)