ロボットとか
ロボットとかのブログ
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
マイコンとPC間のシリアル通信にバイトチェックをつけてもらいたいとの依頼を受けたもののバイトチェックとは何ぞや? な状態。
早速Google先生に質問してみるとなにやら歯医者関係の話と一緒にチェックサムなるものが出てきた。
チェックサムとは、誤り検出符号の一種で他の方法と比べると信頼性は低いもののそれでも99.5%は信頼できるらしい。
それでいてアルゴリズムが簡単であることから、簡易的な検出に多用されるとのこと。
また、あまりに一般的なためか、他の誤り検出符合もチェックサムと呼ばれることも多いらしい。
ゲーム機を何でもファミコンというようなものか…。
以下ほとんどWikipediaからの引用だけど、
もっとも単純なアルゴリズムは、ワード列(ワードデータの集まり)の個々のワードの合計の下位1ワードをそのまま符号値とするもの。
1ワードが何ビットかは実装によって異なるらしい。
例えば、8ビットのワード列「00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F」の総和は「78」であるので、そのチェックサムは「78」。
つまり、送る側は、送るデータ列の合計を出しておいて、データ列と一緒にチェックサム(合計に-1をかけたもの)も送る。
データ列を送られてきた側は、データ列をチェックサムに足していってチェックサムが最終的に0になればエラーなくデータ列が送られてきたとわかる。
まあ、上記のようなことらしい。
これをマイコンとPC間の通信に使うとなると、
ということになるだろう。
ここで問題になるのが、「どうやって送られてきたデータとチェックサムの比較をするか?」のかということと「どうやって1回の入力で2回同じデータを送信するか?」ということ。
後者は2回同じデータを人間が送れば何とかなるけど面倒だし、前者は少なくともSimpleTermとかだけじゃできない。
どうにかしてPC側でポートからのデータを受けとって処理させる必要がある。
そこでまたGoogle先生に聞きに行ったら、電子工作室(http://www.picfun.com/serial00.html)というサイトを見つけた。
ここによるとVBでMSCommかC++でWindowsAPIを使う方法があるらしい。
今はどっちもからっきしなので今日はここまで。
とりあえず、VBを使うほうを何とかやってみるとしよう。
ちなみにチェックサムを調べていて初めてワードを真剣に考えたので、ワードについても覚書程度に書いとく。
データの最小単位はビット、データ容量の最小単位はバイト(8ビット)だけども、ワードは必ずしも特定の容量をあらわしているわけではなく、データ自体ともいえる。
例を挙げると、マイコンのIOポートの設定で、1ポートごとに設定するときは「~.bit.~ = 0 or 1」と指定した。
ここでは、1ポートごとに0か1で指定するからビットアクセスなんだと思う。
一方で、「~.word.~ = 0x11」と指定すると複数のポートをまとめて指定できた。
ここではビットアクセスをまとめてアクセスするからワードなのだろう。
ただし、実際の実装ではワードは12ビットや16ビット、32ビット単位であることが多い。
早速Google先生に質問してみるとなにやら歯医者関係の話と一緒にチェックサムなるものが出てきた。
チェックサムとは、誤り検出符号の一種で他の方法と比べると信頼性は低いもののそれでも99.5%は信頼できるらしい。
それでいてアルゴリズムが簡単であることから、簡易的な検出に多用されるとのこと。
また、あまりに一般的なためか、他の誤り検出符合もチェックサムと呼ばれることも多いらしい。
ゲーム機を何でもファミコンというようなものか…。
以下ほとんどWikipediaからの引用だけど、
もっとも単純なアルゴリズムは、ワード列(ワードデータの集まり)の個々のワードの合計の下位1ワードをそのまま符号値とするもの。
1ワードが何ビットかは実装によって異なるらしい。
例えば、8ビットのワード列「00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F」の総和は「78」であるので、そのチェックサムは「78」。
1. IPヘッダのチェックサムフィールドにゼロをセット
2. IPヘッダを16ビット単位で加算
3. 総計の下位16ビットの補数をIPヘッダのチェックサムフィールドへセット
4. 送信
5. 受信したらIPヘッダを16ビット単位で加算
6. 総計がゼロなら正常(チェックサムフィールドにはチェックサムフィールドがゼロの場合のチェックサムの補数がセットされているので、総計=チェックサムフィールド以外のチェックサム+チェックサムフィールド以外のチェックサムの補数=ゼロになれば正しい
つまり、送る側は、送るデータ列の合計を出しておいて、データ列と一緒にチェックサム(合計に-1をかけたもの)も送る。
データ列を送られてきた側は、データ列をチェックサムに足していってチェックサムが最終的に0になればエラーなくデータ列が送られてきたとわかる。
まあ、上記のようなことらしい。
これをマイコンとPC間の通信に使うとなると、
マイコン→PCでは、マイコン側で送るデータの総計を計算してチェックサムとしてPC側に送信。
PC側では、送られてきたデータの総計とチェックサムが一致ないし、計算して0になればデータはエラーなく送られてきたのでOK。
PC→マイコンでは、PC側から送るデータを2回送信。
マイコン側では送られてきたデータを比較して一致すればエラーなく送られてきたということでOK。
ということになるだろう。
ここで問題になるのが、「どうやって送られてきたデータとチェックサムの比較をするか?」のかということと「どうやって1回の入力で2回同じデータを送信するか?」ということ。
後者は2回同じデータを人間が送れば何とかなるけど面倒だし、前者は少なくともSimpleTermとかだけじゃできない。
どうにかしてPC側でポートからのデータを受けとって処理させる必要がある。
そこでまたGoogle先生に聞きに行ったら、電子工作室(http://www.picfun.com/serial00.html)というサイトを見つけた。
ここによるとVBでMSCommかC++でWindowsAPIを使う方法があるらしい。
今はどっちもからっきしなので今日はここまで。
とりあえず、VBを使うほうを何とかやってみるとしよう。
ちなみにチェックサムを調べていて初めてワードを真剣に考えたので、ワードについても覚書程度に書いとく。
データの最小単位はビット、データ容量の最小単位はバイト(8ビット)だけども、ワードは必ずしも特定の容量をあらわしているわけではなく、データ自体ともいえる。
例を挙げると、マイコンのIOポートの設定で、1ポートごとに設定するときは「~.bit.~ = 0 or 1」と指定した。
ここでは、1ポートごとに0か1で指定するからビットアクセスなんだと思う。
一方で、「~.word.~ = 0x11」と指定すると複数のポートをまとめて指定できた。
ここではビットアクセスをまとめてアクセスするからワードなのだろう。
ただし、実際の実装ではワードは12ビットや16ビット、32ビット単位であることが多い。
PR
この記事にコメントする
この記事へのトラックバック
この記事にトラックバックする:
プロフィール
名前:H238/ながつき |
このブログについて: |
ロボットについての勉強などを中心に勝手に書いていきます.あくまで本人のメモなので期待しないように. ちなみにブログデザインは趣味. |
ブログ内検索
[活動101] [活動102] [活動103]
[SH2] [マイコン]
[電子回路]
[プログラム] [VS] [OpenCV]
[知能ロボ]
[プレゼン] [CAD]
カレンダー
カテゴリー
最新記事
最新CM
[11/13 SLT-A65]
[12/01 siawase]
[05/01 H238]
[05/01 H238]
[05/01 ねこう]
アーカイブ