あるシステムで9bitのRS-485通信という記載があり、
よくわからんし、マイコンでそういう設定できるんだっけ?
と思っていたが、サンプルプログラムを見てなるほどとなった。
RS-485は調歩同期式のシリアル通信の伝送方式の1つで、マイコンにとってはUARTってことですね。
RS-485の特色として2線のバスに複数の機器をぶら下げることができるというのがある。
どうもそこと関係がある話のようである。
というのも通信の先頭ではMSB=1にしてアドレスを伝達、
それ以降の通常のデータはMSB=0としてデータを伝達することで、
アドレスとデータ本体の識別を容易にするための方式だからである。
RS-232のような1対1通信の場合はそもそもこういう方法が必要ないと。
マイコンの開発ツールでUARTの設定をするときに9bitって設定がなくて、
あれ? と思ったのだが、ちゃんとマニュアルを見たら9bitってのはあった。
この9bit通信というのは8bit+パリティのパリティに相当する部分をアドレス識別用に使うというものである。
というのもUARTは通常LSBファーストで伝送され、最終ビット=MSBの次にパリティを付ける場合がある。
ということは9bit通信のMSBは8bit通信にパリティを付けた場合のパリティの位置である。
このあたりの言い方はマイコンにより差があるかもしれない。
RS-485通信をモニタリングする機器を取り付けていたのだが、
こちらでは8bit通信でパリティビットを任意設定できる設定にすることで、9bit通信に対応できるようだ。
さらにこのMSB=1でアドレスを伝達することに特化した機能をハードウェアレベルで備えていて、
というのも、指定のアドレスデータのみを受信するという設定が可能なためである。
これは今まで使ったことがなかったので全然知らなかったのだが、
他のマイコンでもこういう機能はわりと備えているようである。
アドレス0x5Aの機器は普段は 0x15A の9bitデータ以外は無視する設定にしておく。
こうすると{0x123,0x030,0x04A,0x05A,0xFF} のような通信には一切反応しない。
データ本体に0x5Aを含んでいても、MSB=0なのでアドレスではないと容易に識別できる。
その上で {0x15A,0x020,0x043,0x091,0x070}という通信が来た場合、
0x15Aというデータを受信した時点で割り込みが入るようにしておけば、
ここでアドレスデータのみ受信する設定を一旦解除する。
すると後続の{0x020,0x043,0x091,0x070}を受信できるようになる。
所望のデータを受信できたら元の設定に戻して、自分のアドレス以外の通信を無視するようにする。
こうすれば無駄な受信処理が発生しないというわけである。
そんなことできるのか。
というわけでわりと理にかなった機能だったらしい。
なんでマイコンの開発ツールで9bit設定が見えなかったのかわからないけど、
レジスタに適切な設定をすればちゃんとそのように動作していた。
さっきも書いたように1対1通信ではそもそもいらない機能なので、
代表的な設定ではないということで除けられたのかもしれない。
実際の製品では直接レジスタ操作で設定するので特に問題ないですが。