忍者ブログ

ロボットとか

ロボットとかのブログ

entry_top_w.png
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

entry_bottom_w.png
entry_top_w.png
マイコンと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. 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ビット単位であることが多い。

拍手[0回]

PR
entry_bottom_w.png
entry_top_w.png
for文は普通、for(初期値; ループの条件; 変数の増減)ってかんじに書くけど、この「ループの条件」の豆知識をひとつ。

例えばx=0で一回のループごとに1ずつ増やしていって、100でループを抜けるようなfor文を書くとしよう。

for(x=0; x==100; x++){
実行内容
}


とまあこう書けば、xが100になった時でループを抜けるプログラムが書けたわけだわけだ。
けれども、この書き方だと絶対確実とはいえない。
どうしてかというと、まれにxが100で止まらずに101とかになることがあるからだ。
ループを抜ける条件は「xが100の時」だから、101では抜けられない。
そこで、確実に動作するプログラムにするため次のように書き換える。

for(x=0; x<=100; x++){
実行内容
}


こう書くとxが100を超えたらループを抜けるから、もしもxが101になった時でもちゃんとループを抜けてくれる。
より確実に動作するプログラムを書くための一工夫。

拍手[0回]

entry_bottom_w.png
plugin_top_w.png
プロフィール
名前:H238/ながつき
このブログについて:
ロボットについての勉強などを中心に勝手に書いていきます.あくまで本人のメモなので期待しないように.
ちなみにブログデザインは趣味.
plugin_bottom_w.png
plugin_top_w.png
ブログ内検索
タグ一覧(追加中)
[活動101] [活動102] [活動103]
[SH2] [マイコン]
[電子回路]
[プログラム] [VS] [OpenCV]
[知能ロボ]
[プレゼン] [CAD]
plugin_bottom_w.png
plugin_top_w.png
カレンダー
10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
plugin_bottom_w.png
plugin_top_w.png
最新CM
[11/13 SLT-A65]
[12/01 siawase]
[05/01 H238]
[05/01 H238]
[05/01 ねこう]
plugin_bottom_w.png
plugin_top_w.png
バーコード
plugin_bottom_w.png
Copyright ロボットとか by ひなたまる All Rights Reserved.
Template by テンプレート@忍者ブログ
忍者ブログ [PR]