2010-11-20 7 views
4

Şirketimiz, C# .net'de yazdığım uygulamalar aracılığıyla bilgisayarla iletişim kuran çok sayıda yerleşik cihaz yapmaktadır. Veri aktarımını geliştirmenin farklı yollarını düşünmekteyim, böylece PC uygulaması cihazların mevcut durumuyla (bazı durumlarda sürekli olarak değişiyor) daha kolay senkronize edilebilir.Gömülü cihazdan xml formatında veri çıkışı akıllıca mı?

Cihazın, seri bağlantı noktası, USB, Ethernet Soketi vb. Üzerinden göndermeden önce, açıklamanın biçimi ve durum iletilerini xml biçimlendirilmiş bir iletide biçimlendirdiği bir yaklaşım hakkında düşünüyordum. İşlemi gerçekleştirebileceğini düşünüyordum. Bu verilerin tümünü C# sınıflarım içine almanın daha basit bir yolu.

alternatif ana uygulama getStatus gibi bir komut gönderen bir yaklaşımdır ve cihaz bir bayt dizisi ile yanıt verir, farklı bir özellik, sensör okuma vb

temsil eden her bir büyük yok xml ile deneyimin anlaşılması, ancak gördüğüm şeyden LINQ-XML ile yapılabilir, iyi bir fikir gibi görünebilir. Siz ne düşünüyorsunuz? Bu yaygın olarak yapılan bir şey mi? Bu korkunç bir fikir mi?

cevap

4

İlk olarak, hangi yoldan giderseniz, veriyi gözden geçirebilmeniz için döndürülen verilerin katıştırılmış bir sürüm numarası olduğundan emin olun.

Her iki seçenek de var mı? Cidden, her zaman daha okunabilir bir formda veri göndermenin tercih edildiği durumlar ve daha yoğun bir temsilin en iyi olduğu diğerleri (bunlar çoğu insanın düşündüğünden daha azdır, fakat bu konuda bir din savaşı başlatmak istemiyorum). İnsanlar her ikisi için tutkuyla tartışacaklar çünkü farklı şeyler için optimizasyon yapıyorlar. Her iki seçeneği de sağlamak, her iki kampı da tatmin ederdi.

Güzel, anlaşılır bir XML durumu, aygıtlarınızla çalışmaya başlayan kişiler için çubuğu kesinlikle düşürebilir. Ayrıca, döndürülen ikili verilerden serileştirilebilen bir C# nesnesi de oluşturabilirsiniz.

+0

Versiyonlama için – PICyourBrain

+1

+1 içgörü için teşekkürler –

2

Bu çok da kötü bir fikir değil, ama muhtemelen bir aşırı tasarım. Yerleşik cihazın daha kolay ve daha hızlı üreteceği bir format kullanmayı tercih ederim. Daha sonra PC tarafında, uygun bir formata dönüştürmek için bir katman yerleştirirdim. LINQ'yi nesnelerle de kullanabilirsiniz. Verileri neden ikili formda veya basit bir ASCII protokolünde göndermiyorsunuz ve sonra C# nesnelerine dönüştürüyoruz? Verilere erişmek için LINQ kullanabilirsiniz. Benim düşünceme göre, bu durumda XML gereksiz bir karmaşıklık sunuyor.

1

Her iki şekilde de birtakım yollar var, dolayısıyla doğru seçim uygulamanıza, cihazınızın ne kadar güçlü olduğuna ve bu protokolü kimin kullanacağına bağlıdır.

Bu alternatifin ikili seri hale getirilmiş, istek-yanıtı yaklaşımı olduğunu belirtiyorsunuz. Burada iki ayrı boyut olduğunu düşünüyorum: serileştirme formatı (ikili veya XML) ve iletişim tarzı. Bir push protokolünde veya bir istek-cevap protokolünde istediğiniz serileştirme formatını kullanabilirsiniz. XML kendini açıklayan olma eğilimindedir, çünkü farklı özelliklere sahip farklı cihaz varsa cihazlar arasında varyasyon, yani varsa

  • Okunabilirlik
  • önemliyse

    XML iyi bir seçim olabilir.

  • Veya cihazınızın verilerini İnternet’te yayınlamak isterseniz.(Örneğin Etiketlenmiş değerlerle ikili protokol daha açıklayıcı hale getirmek için kullanılabilir) Elbette

XML ayrıntılı ve ikili protokol ile yukarıda tümünü gerçekleştirmek için yollar kesinlikle vardır. Bu çok sitenin kurucularından

0

XML bazı aklı başında ve eğlenceli görüşler vardır. Adobe Flex'in (ne kullandığımız) XML'yi çok kolay yorumlayabildiğinden ve şüphelendiğimden beri PC tarafında çok iyi çalıştı. Net aynı şeyi çok kolay bir şekilde yapabilir.

Daha karmaşık olan kısmı mikroişlemci tarafındaydı. XML ayrıştırma işleminin elle yapılması gerekiyordu, ki bu gerçekten karmaşık değildi, ama sadece zaman yoğun. XML dizgisini oluşturmak, yaptığınız şeye bağlı olarak da oldukça fazla kod olabilir.

Genel - Eğer bir daha yapmam gerekirse, XML'in iyi bir seçim olduğunu düşünüyorum çünkü bu çok esnek bir protokol. RAM, mikroişlemci tarafında FIFO arabelleğimizde birkaç paketin saklanmasıyla ilgili bir sorun değildi, ancak bu sizin uygulamanızda göz önünde bulundurulması gereken bir şey olabilir.

0

XML dosyalarını oluşturmak ve iletmek için değerli gömülü CPU zaman kaybıdır. Bunun yerine, veriyi temsil eden bir ikili bayt dizisi kullanırdım, ancak verileri yorumlamaya yardımcı olmak için yapıları kullanırdım. C# yaprağının özelliği, bir bayt dizisini anlamlı veriler olarak kolayca yorumlayabilmenizi sağlar.

[StructLayout(LayoutKind.Sequential, Pack = 1)] 
public struct DeviceStatus 
{ 
    public UInt16 position; // Byte 0 and 1 
    public Byte counter;  // Byte 2 
    public Fruit currentFruit; // Byte 3 
}; 

enum Fruit : Byte 
{ 
    Off = 0, 
    Apple = 1, 
    Orange = 2, 
    Banana = 3, 
} 

Sonra bu yapı için bayt dizinizi dönüştüren bir işlev olurdu: İşte bir örnek

public unsafe DeviceStatus getStatus() 
{ 
    byte[] dataFromDevice = fetchStatusFromDevice(); 
    fixed (byte* pointer = dataFromDevice) 
    { 
     return *(DeviceStatus*)pointer; 
    } 
} 

XML ile karşılaştırıldığında, bu yöntem cihazda ve CPU zaman kazandıracak PC ve XML dosyasının oluşturulması ve ayrıştırılması için tamamlayıcı işlevlerle bir XML şemasından daha kolaydır. Tüm yapmanız gereken, gömülü aygıtınızdaki yapı ve numara tanımlarının C# kodunuzdaki tanımlarla aynı olduğundan emin olmanız, böylece C# programının ve aygıtın kullanılacak protokolde anlaştığından emin olmanızdır.

Muhtemelen C# ve gömülü taraftaki "paketlenmiş" özelliğini kullanmak istediğinizde, tüm yapı öğelerinin öngörülebilir bir şekilde konumlandırılmasını sağlayabilirsiniz.