2010-11-20 6 views
4

私たちの会社は、C#.netで書いたアプリケーションを使ってPCと通信する多くの組み込み機器を作ります。私は、PCアプリケーションをデバイスの現在の状態(場合によっては絶えず変化している)とより簡単に同期できるように、データ転送を改善するさまざまな方法を検討してきました。埋め込みデバイスからのデータをxml形式で出力するのは賢明ですか?

私は、デバイスがシリアルポート、USB、イーサネットソケットなどのいずれかに送信する前に、デバイスの説明と状態メッセージをxml形式のメッセージにフォーマットするアプローチについて考えていました。このデータを私のC#クラスにもっとシンプルにすることができます。

代替私は素晴らしいを持っていないなど、ホストアプリケーションがGETSTATUSようなコマンドを送信し、デバイスは、バイトの配列で応答する、異なる特性を表す各センサ読み取りアプローチ

ありますxmlを使った経験はありますが、私が見たことから、XMLへのLINQを使って行うことができます。それは良い考えかもしれないようです。皆さんはどう思いますか?これは一般的に行われていることですか?それはひどい考えですか?

答えて

4

最初に、どのような方法をとっても、返されたデータにバージョン番号が埋め込まれていることを確認して、データ構造を変更できるようにしてください。

どちらもオプションですか?真剣に言えば、より読みやすい形式でデータを送信する方が望ましい状況や、より密集した表現が最も優れている状況があります(これはほとんどの人が思うよりも少ないですが、宗教戦争を開始したくありません)。人々は、異なるものに対して最適化しているので、両方に対して情熱的に主張するだろう。両方のオプションを提供することで、両方のキャンプを満足させることができます。

素敵で明確なXMLステータスは、あなたのデバイスで作業を始めている人のためのバーを確実に下げることができます。また、返されるバイナリデータから逆シリアル化できるC#オブジェクトを構築することもできます。

+0

洞察をいただきありがとうございます – PICyourBrain

+1

+1のバージョン管理 –

2

恐ろしいアイデアではありませんが、おそらくオーバーデザインです。私は組み込みデバイスがより簡単かつ迅速に生成するフォーマットを使用することを好むでしょう。次にPC側では、便利な形式に変換するレイヤーを挿入します。オブジェクトでLINQを使用することもできます。バイナリ形式または単純なASCIIプロトコルでデータを送信し、それをC#オブジェクトに変換するのはなぜですか? LINQを使用してデータにアクセスできます。私の意見では、この場合XMLは不要な複雑さをもたらします。

1

どちらの方法でもトレードオフがあるため、適切な選択はアプリケーション、デバイスのパワフルさ、および誰がこのプロトコルを使用するのかによって異なります。

この代替方法は、バイナリシリアル化された要求応答アプローチです。私は、直列化形式(バイナリまたはXML)と通信スタイルの2つの次元があると思います。プッシュプロトコルまたはリクエスト/レスポンスプロトコルのいずれのシリアル化フォーマットでも使用できます。あなたはXMLは自己記述する傾向があるため、異なる特性を有する異なるデバイスを持っている場合、デバイス間のばらつきは、すなわちがある場合

  • 可読性が
  • 重要である場合

    XMLは良い選択かもしれません。

  • また、デバイスのデータをインターネットに公開する場合は、

もちろん、XMLは冗長であり、バイナリプロトコル(例:タグ付き値を使用してバイナリプロトコルをよりわかりやすくする)で上記のすべてを達成する方法は確かにあります。

0

この非常にサイトの創設者の一人は、私がXMLフォーマットを使用して、マイクロプロセッサの通信にPCと以前のデザインに非常によく似た何かをしたXML: The Angle Bracket Tax

0

にXMLにいくつかの正気と愉快な意見を持っています。 Adobe Flex(私たちが使っていたもの)がXMLを非常に簡単に解釈できるようになって以来、PC側ではうまく機能していました.Netは同じことを非常に簡単に行うことができます。

さらに複雑な部分がマイクロプロセッサ側にありました。 XML解析は手作業で行う必要がありましたが、実際にはそれほど複雑ではありませんでしたが、時間がかかるだけでした。 XML文字列を作成することは、あなたがやっていることに応じてかなりのコードになる可能性があります。

全体 - 私がもう一度やり直す必要があったとしても、XMLは非常に柔軟なプロトコルなので、良い選択だと思う。 RAMはマイクロプロセッサ側のFIFOバッファにいくつかのパケットを格納することに関してそれほど問題ではありませんでしたが、それはアプリケーションで考慮すべきことかもしれません。

0

XMLファイルを生成して送信するには、貴重なCPU時間が浪費されます。代わりに、データを表すバイナリバイトの配列を使用しますが、データの解釈に役立つ構造体を使用します。 C#の構造体機能は、バイト配列を意味のあるデータとして簡単に解釈できるようにします。ここでは例です:そして、あなたは、この構造体へのバイトのあなたの配列を変換する関数だろう

[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, 
} 

:XMLと比較すると

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

を、この方法は、デバイス上と上のCPU時間を節約しますXMLファイルを構築および解析するための補完的な機能を備えた、XMLスキーマよりも保守が容易です。エンベッドされたデバイスの構造体と列挙型の定義がC#コードの定義と同じであることを確認するだけで、C#プログラムとデバイスは使用するプロトコルに合致します。

C#と埋め込み側の両方で "packed"属性を使用して、すべての構造要素が予測可能な方法で配置されるようにします。

関連する問題