
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も見ています
-
これまでで一番「情けなかったとき」はいつですか?
これまでの人生で一番「情けない」と感じていたときはいつですか? そこからどう変化していきましたか?
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
もし10億円当たったら何に使いますか?
みなさんの10億円プランが知りたいです!
-
テレビやラジオに出たことがある人、いますか?
テレビやラジオに取材されたり、ゲスト出演したことある方いますか?
-
「これいらなくない?」という慣習、教えてください
現代になって省略されてきたとはいえ、必要性のない慣習や風習、ありませんか?
-
チェックサムの実装方法について
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教えて下さい
-
【エクセル】測定時間がバラバ...
-
メモ帳(テキストデータ)をExc...
-
配列でデータが入っている要素...
-
VBA 毎日取得するデータを順番...
-
ユーザーフォームのテキストボ...
-
ACCESSからEXCELに出力する際、...
-
GETはできるがPOSTができない、...
-
外部データの更新がうまくでき...
-
リングバッファって何ですか
-
ブレーカー落ちで壊れたりしな...
-
EXCELVBAでSQLserverからデータ...
-
ページ数を求めたい
-
Sheet2の日付をキーにオートフ...
-
【VBA】データを入力後に,同一...
-
MSCommを用いたRS-232-Cデータ転送
-
特定のデータの抽出方法を教え...
-
二分探索の平均探索回数
-
VB6でCSVの取込をする
-
複数のブックのデータを集めて...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教えて下さい
-
【エクセル】測定時間がバラバ...
-
VBA 空白セルを削除ではない方...
-
メモ帳(テキストデータ)をExc...
-
配列でデータが入っている要素...
-
ブレーカー落ちで壊れたりしな...
-
特定のデータの抽出方法を教え...
-
EXCELVBAでSQLserverからデータ...
-
エクセルで2つの時系列のデー...
-
VBAを使ってOutlookメール本文...
-
Accessで該当データにフラグを...
-
この行は既に別のテーブルに属...
-
[C言語] コメント文字列を無視...
-
ユーザーフォームのテキストボ...
-
二分探索の平均探索回数
-
Excel VBAでのオートフィルター...
-
多量のSUMIF式を軽くしたい
-
カンマからスラッシュに
-
CString型の文字列連結について
-
C# でDataTableの更新を高速化...
おすすめ情報