SUMをSTX~ETXの中に入れるかどうか

マイコンからUARTでPCと通信する(PC側はレベルコンバータでRS232Cにする)場合において、 STX,ペイロード部,ETX,SUM という順にパケットを構成しようと思います。 STXは02h、ETXは03h、 SUMはペイロード部とETXの足し算(下位1バイト)で、0~FFhの値をとります。 私はマイコン側のプログラムを担当しているのですが、PC側の担当者から 「SUMはETXの前に入れ、16進ASCII表記2バイトにした方が良いのでは」という意見がありました。 SUMを外に出すことのメリットは、SUM値を1バイトにできる点だと思います。 中に入れると、SUM値がたまたまETXになった場合に問題が発生するので 制御コードを使わずに'0'~'F'で表す必要があり、2バイト使うことになると パケットが1バイト余分に増えることがデメリットだと思います。 PC側の担当者はETXが来たら伝文解析処理を動かせるので、プログラムが書きやすいと 主張していますが、私はSUM値は外に出ていた方がパケット構成上美しいと思います。 上記のどっち派か、またその理由など、お聞かせいただければ幸いです。
Parents
  • beeさん

    STXの後にパケット長を入れるとか色々ありますけども、パケット構成は思想次第ですねー。
    リーズナブルに安定的な通信ができるといいですね。

    SUM,ETXの順がキレイでいいので、ひとつアイデアです。
    SUMの計算をデータの上位4bitと下位4bitに分けて、4bit単位で加算していって、
    SUMを7bitで表現してSUMの最上位bit7を1固定にすれば、80~FFHの値(≠02h)をとるので問題なくなるのかなと思います。
    パリティやチェックサム、CRC付加は、確率論の世界なので、冗長なほどエラー検出力が高くなりますけれども、
    逆にチェックサムが8bitから1bit減って7bitになっても、確率的にはエラー検出力に大きな違いはありません。
    (ただし、8bit単位でサムを取ってbit7を1固定にすると、エラー検出力が著しく落ちてしまうので、注意が必要ですけども)

    これとは別に、パケットとパケット間の空き時間が一定時間を越えたら、受信を仕切り直すとかの処理をいれると、よりロバストになるかと思います。

  • >PC側の担当者から 「SUMはETXの前に入れ、16進ASCII表記2バイトにした方が良いのでは」

    PC側担当者からすればバイナリ可変長はうっとおしい

    出来れば全部アスキーで終了コードはCR

    それが一番簡単で初心者でも出来る

    それなりのベテランでもシリアル通信やったこと無い人がバイナリ通信するとハマル

    最近はPCにシリアルポートが付いてないし

    シリアル通信を知らないプログラマは多い

    DOS時代にはシリアル通信はごく普通にあったけれど

    事務系でもバーコードリーダとかで

    最近のバーコードリーダはUSBだし

    アスキーにすると通信バイト数は増えるが

    よほど高速大容量通信する必要がなければそれほど困る事も無い

    まさか画像データとか送る訳でもなかろう

    計測器とかで計測した数値を送るだけなら

    そもそもですが

    本件でバイナリ通信にしなければならない事情は何でしょう?

    マイコン側メモリが少ないとか?

Reply
  • >PC側の担当者から 「SUMはETXの前に入れ、16進ASCII表記2バイトにした方が良いのでは」

    PC側担当者からすればバイナリ可変長はうっとおしい

    出来れば全部アスキーで終了コードはCR

    それが一番簡単で初心者でも出来る

    それなりのベテランでもシリアル通信やったこと無い人がバイナリ通信するとハマル

    最近はPCにシリアルポートが付いてないし

    シリアル通信を知らないプログラマは多い

    DOS時代にはシリアル通信はごく普通にあったけれど

    事務系でもバーコードリーダとかで

    最近のバーコードリーダはUSBだし

    アスキーにすると通信バイト数は増えるが

    よほど高速大容量通信する必要がなければそれほど困る事も無い

    まさか画像データとか送る訳でもなかろう

    計測器とかで計測した数値を送るだけなら

    そもそもですが

    本件でバイナリ通信にしなければならない事情は何でしょう?

    マイコン側メモリが少ないとか?

Children
  • チェックサムの位置の話ではなく、データをASCIIで送るかバイナリーで送るかのように思えます。たとえば、01abhは、「SUMはETXの前に入れ、16進ASCII表記2バイト」だと02h,30h,31h,41h,42h,30h,32h,03hで、バイナリーなら02h,01h,abh,aah,03hですよね。ASCIIの場合はCRやセミコロン、03hなどでパケットの終了を示せるのでデータ長を変えるのが簡単です。一方で、バイナリーの場合は固定長かデータ長の挿入が必要そうです。私も一度だけですが、ASCII表記の通信をマイコン側で受けたことがあります。ASCII表のマイコン側ソフトウエアはデコードとエンコードともにかなり面倒です。私はVCとWindows前のターボCを少しかじった程度なので良く分かりませんがPC側のソフトウエアにはメリットがあるかもしれません。お客様の要求なので、理由ははっきりと聞けませんでした。データがASCIIならチェックサムもASCIIではないですか? で、ETXの前になります。バイナリーなら、02h(Send Of Message),Data,CheckSum,03h(End Of Message)のように思えます。やっぱり、チェックサムはEOMの前ですね。