
VB6.0を使用して、画像処理プログラムの開発を行っている者ですが、処理結果を別機器(PLC)へ送信しなければなりません。初めてなのですが、RS232Cでデータ通信を行おうと考えております。
いろいろと書物やWEBを探してみると、サムチェックを行うのが常識とのことです。また、今回扱うデータは6Byteの計測データで、プラスサムチェックを2Byteで行いたいのですが、符号や小数点はサムチェックとして合計するものなのでしょうか?
(0~9までのアスキー文字ならばそのまま合計することは簡単です)あるいはアスキーコード変換してから全てを合計し、合計値の最下位2ビットをサムチェックに使用するのが正しいのでしょうか?
そんなもの常識だろ!と思われる方が多いかと思いますが、ご回答の程よろしくお願い致します。
No.3ベストアンサー
- 回答日時:
> 対象となるバイト列というのは常識的に考えて、STXやETXも含めるのでしょうか?
含めません.STX,ETX,データ長は次に示すように,別の方法でチェックされる
ことになるからです.
#1 の伝送フォーマットに対する受信アルゴリズムの一例は次のようになります.
(1) データを受信し,STX が現れるまで読み飛ばす.
(2) データ長を受信する.データ長自体の長さやフォーマット (10進数字だけを
使うか否か) が決まっている場合,この段階でチェックする (値そのものは
この段階ではチェックできない).エラーならば (8) へ.
(3) データ部を受信する.
途中に ETX が現れればデータ長またはデータ部のエラーなので(8) へ.
(4) チェックサムを受信する.
途中に ETX が現れればデータ長またはチェックサム部のエラーなので(8) へ.
(5) 1バイト受信する.
このバイトが ETX でなければデータ長部のエラーなので (8) へ.
(6) データ部のチェックサムを計算し,受信したチェックサムと照合する.
不一致ならばデータ部またはチェックサム部のエラーなので (8) へ.
(7) レコード受信成功
・成功を送信側に伝えるため ACK (=&H06) を返す.
・受信したデータ部を処理する.
・次のレコードを待つため (1) へ.
(8) エラー処理
・受信失敗を送信側へ伝えるため NAK (=&H15) を返す.
・受信したデータを破棄する.
・次のレコードを待つため (1) へ.
このアルゴリズムからわかるように,STX,ETX,データ長部にエラーがあれば,
そもそも受信されないか,受信してもチェックサムを計算することなく破棄されます.
No.4
- 回答日時:
#3 です.ちょっと訂正します.
・「途中に ETX が現れれば…」をすべて
「途中に STX または ETX が現れれば…」に変更.
また,このチェックを (2) にも適用する.
> (5) 1バイト受信する.
> このバイトが ETX でなければデータ長部のエラーなので (8) へ.
より正確には,「データ長部またはこのバイト (ETX) のエラー」.
No.2
- 回答日時:
★チェックサムの他に CRC もあります。
・チェックサムよりは CRC16、CRC32 の方が正確ですが、かなり複雑で計算時間や
検索するためのテーブルがメモリを占めます。→といっても 1KB ですが…。
・チェックサムは単純にバイト列を加算するのが基本ですが、これだと順序が逆転
しているデータは同じデータとして誤解します。
・つまり、『ABC』という文字列と『CBA』という文字列では両方とも『198』という
数になりますのでデータの誤りの判定できません。→CRC のアルゴリズムなら
判定できますが…。
・そこで、もうちょっと正確にするための『変則チェックサム』がいろいろとあります。
・私が以前に考えたタイプを紹介します。
●サンプル
short FuncCalcCheckSame( const char *string, size_t size )
{
short code;
for ( code = 0x0000 ; size != 0 ; size-- ){
code <<= 1;
code ^= *string++;
}
return( code );
}
最後に:
・『code <<= 1;』のシフト部分を『2』とか『3』にするといろいろと精度などが
変化します。→データによりけりですけど。
・『code ^= *string++;』の部分は足し算の代わりに『排他論理和』を使っています。
・この方が『+』命令よりは高速に計算されます。→アセンブラ・レベルでのお話。
・Visual Basic では『XOR』でしたっけ?→私は C/C++ 言語専門なので上記のサンプル
はその言語のサンプルです。
・上記のは『short』形の 16 ビットですが、『long』型などの 32 ビットにすると
単純に精度がかなり上がります。
・また、上記の方法ならば『ABC』という文字列と『CBA』という文字列(データ)を
正しく誤りと判定できます。
・以上。おわり。
参考URL:http://laputa.cs.shinshu-u.ac.jp/~yizawa/InfSys1 …
ご回答ありがとうございます。
サムチェックと一口に言ってもいろいろとあるのですね。
サンプルまで付けていただいて。。。すみません。
No.1
- 回答日時:
すぐコメントがつくかと思ったのになかなかつかないようなので…
チェックサムは普通,対象となるバイト列のすべてのバイトの値 (0~255) を
単純に加算して,その下位1~2バイト程度を使用します.
そうすることにより,
・送信するデータの形式や内容にかかわらず,どんなデータでも扱うことができる.
→ 将来,データの仕様が変更・拡張されても,チェックサムを計算するプログラムは
変更する必要がない.
・処理が単純なのでソフト開発も簡単.
> 符号や小数点はサムチェックとして合計するものなのでしょうか?
> (0~9までのアスキー文字ならばそのまま合計することは簡単です)
> あるいはアスキーコード変換
そういうことをすると,上で書いたことと正反対に,
・処理が複雑になり,ソフト開発に余分な手間がかかる.
・将来,送信したいデータのフォーマットが増えたり変わったりしたら,
チェックサムプログラムも変更しなければならない.
・通信プログラムの用途 (送信できるデータの種類) を限定してしまう.
という具合に,デメリットしかありません.
開発するソフトを,わざわざ余分な手間をかけて劣ったものにするのは
アホらしいとは思いませんか?
「チェックサム」で Google 検索
http://www.google.co.jp/search?sourceid=navclien …
次に伝送フォーマットの一例を挙げます.
・STX (=&H02)
・データ部のバイト数 … テキスト形式 (10進数字列)
・データ部 (バイト列) … 主にテキストデータ
・チェックサム
・ETX (=&H03)
STX で始まり ETX で終わるフォーマットは,主にテキストデータを送る場合に使われます.
(STX も ETX も ASCII 制御文字です.)
同様の伝送フォーマットを Google 検索 (+チェックサム +STX +ETX)
http://www.google.co.jp/search?sourceid=navclien …
ご回答ありがとうございます。
>対象となるバイト列のすべてのバイトの値 (0~255) を単純に加算して,その下位1~2バイト程度を使用
対象となるバイト列というのは常識的に考えて、STXやETXも含めるのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) プログラミング 処理速度 1 2022/11/25 11:05
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- 統計学 どの統計を使えばいいのか教えてください(EZ-Rを使用) 5 2022/10/11 13:28
- 統計学 統計学、エクセルがわかりません!解答と詳しい解説をお願いします! (1)それぞれの地域別に記述統計量 9 2022/08/21 16:30
- HTML・CSS WEBサイトの構築。表示データとWEBデザインを分離する考え方を専門用語・業界用語では何と言うか? 8 2022/09/27 09:16
- Excel(エクセル) アウトラインの小計のやり方 1 2023/03/20 11:51
- その他(コンピューター・テクノロジー) 50台の織機から回転数を取得・集計しモニターに表示したい 2 2022/11/05 15:48
- Excel(エクセル) ネットワーク上のエクセルとリンクしている時にデータ更新をvbaで、refresh Allで行う場合の 2 2023/04/10 05:39
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・昔のあなたへのアドバイス
- ・字面がカッコいい英単語
- ・許せない心理テスト
- ・歩いた自慢大会
- ・「I love you」 をかっこよく翻訳してみてください
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・はじめての旅行はどこに行きましたか?
- ・準・究極の選択
- ・この人頭いいなと思ったエピソード
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教えて下さい
-
配列でデータが入っている要素...
-
VBA 空白セルを削除ではない方...
-
【エクセル】測定時間がバラバ...
-
Accessで該当データにフラグを...
-
メモ帳(テキストデータ)をExc...
-
ACCESSからEXCELに出力する際、...
-
EXCELVBAでSQLserverからデータ...
-
DataGridViewのデータの引渡し...
-
ActiveReportについて
-
不規則なデータのfft処理
-
ユーザーフォームのテキストボ...
-
Visual Basicによる測定器の制...
-
CString型の文字列連結について
-
パースとはなんですか?
-
多量のSUMIF式を軽くしたい
-
VBAを使ってOutlookメール本文...
-
VBにおいてフォーム間の変数の...
-
C# ソケット通信でデータ受信時...
-
チェックサムの実装方法について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教えて下さい
-
配列でデータが入っている要素...
-
【エクセル】測定時間がバラバ...
-
メモ帳(テキストデータ)をExc...
-
ブレーカー落ちで壊れたりしな...
-
VBA 空白セルを削除ではない方...
-
特定のデータの抽出方法を教え...
-
この行は既に別のテーブルに属...
-
二分探索の平均探索回数
-
ユーザーフォームのテキストボ...
-
EXCELVBAでSQLserverからデータ...
-
CString型の文字列連結について
-
多量のSUMIF式を軽くしたい
-
S9タイプからXタイプにデータ...
-
Excel VBAでのオートフィルター...
-
ACCESSからEXCELに出力する際、...
-
[C言語] コメント文字列を無視...
-
C# ソケット通信でデータ受信時...
-
カンマからスラッシュに
-
アクセス2000で画像データ...
おすすめ情報