組み込みデバイス上のC89でバイトストリームをパケットストリームに変換する方法[非公開]

StackOverflow https://stackoverflow.com/questions/815029

  •  03-07-2019
  •  | 
  •  

質問

I <!>#8217; mは、rs232(rs232 over USB)を使用してPCに接続されている組み込みデバイスで作業しています。

I <!>#8217;独自のプロトコルの開発を考えています:

<MAGIC><LENGTH><BINARY DATA><CRC>

しかし、私はしない<!>#8217; t車輪を再発明したくない。

注意:それは非常に制限されたデバイスについて考えています:4kbのRAM、カーネルなし、標準Cライブラリ。

これを行うための標準的な方法(オープンソースライブラリかもしれません)について考えていただけますか?

独自のソリューションをコーディングする場合、ベストプラクティスはありますか?

  • パッケージの最後でもMAGICバイトを使用しますか?
  • デリミタの代わりに時間のギャップを使用した方が良いかもしれません
  • ストリームバイナリデータでパッケージの先頭を見つける方法
  • テキストプロトコルを使用した方が良いでしょうか?

更新: 質問をもう一度お読みください。ライブラリを要求するのではなく、良い方法を要求する必要があります。

役に立ちましたか?

解決

この回答をご覧ください。非常によく似た質問シンプルなプロトコルの詳細について。

特定のポイントに対応するには:

  1. <!> quot; Magic <!> quot;パケットの最後のバイトは害を与えませんが、パケットの長さを知っていてCRCを持っている場合は冗長です。
  2. タイムアウト時間を指定するのが賢明な場合があるため、1つのパケット内のバイト間のギャップが大きすぎる場合、エラーにフラグが立てられます。 Modbus を使用したことがありますが、他の場所で時間ベースの区切り文字を使用する価値があるとは思いません。
  3. という意味ですか、<!> quot;どうやってバイナリデータのストリームでパケットの始まりを見つける<!> quot ;?その場合、パケット間の最小ギャップを指定するか、パケットごとに受信者が確認するように要求するか、またはその両方を行います。
  4. デバッグが容易になり、PCに特別なソフトウェアは必要ありませんが、あまり効率的ではありません。もちろん、効率よりもユーザビリティが重要な場合は、テキストベースのシステムが完全に適切です。

他のヒント

既存のソリューションがデバイス上で動作するようになるまでにこのようなことをした場合、ホイールを再発明する方が簡単だったでしょう。

void buffer_packet(unsigned char rx_byte)
{
    static unsigned char byte_count = 0;
    static unsigned char packet[8];

    packet[byte_count++] = rx_byte;
    if (byte_count == 8)
    {
        unsigned char crc = calculate_crc(packet, 8);

        write_uart(0x55);
        write_uart(8);
        while (byte_count--)
        {
            write_uart(packet[7 - byte_count]);
        }
        write_uart(crc);
    }
}

または、私はあなたの問題を過小評価しています。 RS232ビットの生成方法をお探しの場合は、マイクロコントローラーのデータシートをご覧ください。

I / Oプリミティブ以外にあるのは、CRC計算だけです。 こちら。

scroll top