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も見ています
-
これまでで一番「情けなかったとき」はいつですか?
これまでの人生で一番「情けない」と感じていたときはいつですか? そこからどう変化していきましたか?
-
歳とったな〜〜と思ったことは?
歳とったな〜〜〜、老いたな〜〜と思った具体的な瞬間はありますか?
-
自分独自の健康法はある?
こうしていると調子がいい!みたいな自分独自の健康法、こだわりはありますか?
-
AIツールの活用方法を教えて
みなさんは普段どのような場面でAIツール(ChatGPTなど)を活用していますか?
-
【選手権お題その2】この漫画の2コマ目を考えてください
サッカーのワンシーンを切り取った1コマ目。果たして2コマ目にはどんな展開になるのか教えてください。
-
チェックサムの実装方法について
Visual Basic(VBA)
-
rs232cでの受信データ(mscomm)の受信方法VB6
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教えて下さい
-
ブレーカー落ちで壊れたりしな...
-
VBA 空白セルを削除ではない方...
-
python, 空のタプルの必要性
-
マクロVBAについて
-
メモ帳(テキストデータ)をExc...
-
マクロで同じフォルダにある画...
-
この行は既に別のテーブルに属...
-
Accessで該当データにフラグを...
-
バーコードリーダーの読込デー...
-
VBA 円グラフ 特定条件に一致し...
-
ページ数を求めたい
-
【エクセル】測定時間がバラバ...
-
StringTokenizerで連続するデリ...
-
携帯電話を水につけるとデータ...
-
Excel VBAでのオートフィルター...
-
ACCESSからEXCELに出力する際、...
-
send-recvで複数データの送受信
-
エクセルで特定の列が0表示の場...
-
Excel マクロ VBA プロシー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教えて下さい
-
【エクセル】測定時間がバラバ...
-
多量のSUMIF式を軽くしたい
-
VBA 空白セルを削除ではない方...
-
配列でデータが入っている要素...
-
メモ帳(テキストデータ)をExc...
-
ブレーカー落ちで壊れたりしな...
-
特定のデータの抽出方法を教え...
-
この行は既に別のテーブルに属...
-
EXCELVBAでSQLserverからデータ...
-
CString型の文字列連結について
-
[C言語] コメント文字列を無視...
-
Accessで該当データにフラグを...
-
エクセルで2つの時系列のデー...
-
S9タイプからXタイプにデータ...
-
プログラミング python pandas ...
-
ユーザーフォームのテキストボ...
-
カンマからスラッシュに
-
Excel VBAでのオートフィルター...
-
C# でDataTableの更新を高速化...
おすすめ情報