【複数シリアル通信とは】
PICを使ってシリアル通信を行うとき、複数の相手を接続して、異なる通信
速度で送信、受信を同時に行いたいということがよくあります。
単に中継の場合もあるでしょうし、複数のパソコンに接続するような場合も
あります。
しかし現在のPICのミッドレンジデバイスでは複数チャネルのUSARTを持って
いるものは今のところはありません。したがって、複数チャネルのシリアル通信
を行う場合には、1チャネルはUSARTで行い、別のチャネルはプログラムでシリ
アル通信を実現する必要があります。
CCS社のCコンパイラでは、この複数チャネルのシリアル通信を簡単に実現
できるようになっています。
しかも最近のバージョンでは。より簡単に使えるように工夫が加えられました。
【実現方法】
複数チャネルのシリアル通信についてはCCS社のコンパイラではいくつかの
実現方法があります。
(1) 実現方法1
まず以前からサポートされている方法でマニュアルに説明されている方法
による実現例です。 実際には記述例1のようにします。
この場合には#use rs232 というプリプロセッサをうまく使います。
このプリプロセッサは、改めて定義されるまでは、最後に定義したものが有効
になります。従って、下記のようにチャネルを変更する度に#use rs232プリプロ
セッサを定義しなおすことで複数のチャネルのシリアル通信が可能になります。
下記の例では、USART経由で受信した文字データをもうひとつのRB2とRB3
で実現したシリアル通信に転送し、同時にUSARTでエコーバック出力をしてい
ます。
《記述例1》
(2) 実現方法2
次の方法は,上記と同じように#use rs232のプリプロセッサを使うのですが
方法1のように毎回指定し直すのではなく、それぞれの送受信用の関数を
定義してしまう方法です。この方がプログラムとしてはわかり易くなります。
実際には記述例2のようにします。ここでは、最初に#use rs232プリプロ
セッサを使って、各チャネル毎に必要な送受信関数を定義しています。
メインでは、記述例1と同じ動作をするようにしていますが、メイン関数内は
記述例1に比べ非常にすっきりとした記述となっているのが判ります。
《記述例2》
(3) 実現方法3
この方法は新しいバージョンで可能になったもので、よりすっきりとした
記述が可能になっています。 ここではラベルによりチャネルを定義する
ことができるようになっていて、このラベルをデバイス指定として扱うことが
できます。
下記記述例3でstream= となっている部分が追加された機能で、メイン
関数の部分を見れば判るように、fprintf文の拡張した機能が使えるように
なり、非常に簡潔な記述で複数チャネルが可能になっています。
ただしこの機能、記述方法はANSIの規格からは逸脱していますので、
CCS社のPIC用に限定された使い方になります。
《記述例3》
【実際の例】