C言語によるシリアル通信


【CCS Cコンパイラのソフトウェアシリアル通信】

CCS Cコンパイラでは、RS232Cつまりシリアル通信を、どのPICでもサポートするように
するため、USARTとソフト処理シリアル通信の両方を使い分けています。
つまり、PIC16F84の様にUSARTを持たないPICに対しては、ソフト処理でシリアル通信を
組込み、PIC16C73の様に、USARTを持つPICに対しては、USARTハードウェアを使って
より効率的なシリアル通信を生成して組み込みます。この判定はコンパイラが自動で行
います。
さらに両方を一緒に使って複数チャンネルにしたり、ソフト処理だけで複数チャンネルを
組込むことも可能になっています。
しかし、このソフト処理シリアル通信は、割込みは使っていませんので、同時送受信は
出来ません。1チャンネルの場合も半二重通信のみです。

【シリアル通信の設定】

ソフトウェアシリアル通信を組込むためには、下記の関数を使います。


《シリアル通信用プリプロセッサ関数》

プリプロセッサ関数

機能・その他

#USE DELAY(CLOCK=speed) コンパイラに対してクロック速度の基準を与えます。これにより通信速度などのパラメータが決められます。
#USE RS232関数より前に置くこと
#USE RS232(BAUD=baud,
      XMIT=pin, RCV=pin ... )
標準入出力をどのようにするかを指定します。
代表的なオプションには下記があります。
 BAUD:通信速度を指定します。
      (1200〜38400程度まで指定可能)
 XMIT:送信のピンを指定
 RCV:受信のピンを指定
 INVERT:信号の極性を反転する
 PARITY:パリティの指定、N,E,Oのどれか
 BITS:ビット長(5-9)
 
 デフォルトの設定は
   データ長=8ビット
   STOPビット=1ビット
   パリティ=無し
    
  (注)指定速度の設定が指定クロックを使った内部設定で
     3%以内の誤差に出来なければコンパイルエラーとなります。


【シリアル通信回路構成】

ソフトシリアル通信を組み込むための回路構成は下図のようなものでテストしています。
つまり、RS232C用のレベル変換IC(MAX232A)をPICに接続し、そこから直接パソコンの
シリアルポート(大抵はCOM2)に接続します。
下図では送信受信にRA3,4を使っていますが、好みの入出力ピンを使って構いません。
 (但し、PIC16C73のようにUSARTを使う場合には、ピンが特定されます)
レベル変換ICはこれ以外にも何種類かありますのでどれでも構いません。
下図では省略していますが、PICのクロックは10MHzと仮定しています。








【プログラム例】

では実際のプログラムの作り方です。 上図の回路で標準入出力デバイスとして
シリアルポートを動かすためには、下記のようにプログラムします。
例で判るように、#USE関数2個だけでシリアル通信が可能になるというのは、
とても便利なことだと思います。
パソコン側は、ハイパーターミナルなどの通信ソフトを起動しておき、通信速度
パリティなど設定を合わせておきます。

そうして下記のプログラムを起動するとパソコンにCommand= と表示しキーボード
から1文字入力すると、Input=* と入力した文字を表示します。
以下同じことを繰り返します。
簡単なプログラムですが、これをアセンブラで作るのはかなりのステップ数を必要
とします。C言語で簡単に目的を達成することができる良い例です。

この回路でクロックが10MHzの時の通信速度は、最大38400bps
まで可能でしたが、安定に使うには9600bps程度が良いと思います。 

  [実行結果例] (パソコン側ローカルエコーバック付き)
   Command= a    Input= a


《プログラム例》
  漢字を含むのでこのままでは使えません

/////////////////////////////////////////////////
// This program is test program of standard io.
// PIC16F84 is target PIC and drive a LCD.
// The PORT for RS232 is below.
//  送信=RA3 受信=RA4
/////////////////////////////////////////////////
#include <16f84.h>
#use delay(CLOCK=10000000)
#use RS232(BAUD=9600, XMIT=PIN_A3 ,RCV=PIN_A4)
main() {
 int cmnd;            //変数定義
 while(1) {           //永久繰り返し
   printf("\nCommand= ");   //Command=表示  
   cmnd=getc();        //1文字入力
   printf(" Input= ");    //Input=表示
   putc(cmnd);        //入力文字表示
 }
}




【標準入出力関数】

このシリアル通信を使った標準入出力関数には下表のようなものがあります。
標準入出力として使えるということは、出力フォーマットが指定できるということで
これは非常に便利に使えます。
特に数値データを出力するときには、フォーマットさえ指定すれば変換をすべて
コンパイラ側で実行してくれますのでプログラミングが非常に楽になります。

標準入出力関数

機能・その他

GETC()
GETCH()
GETCHAR()
標準入出力デバイスからの入力があるまで待ち、あれば文字を読み込んで返す。
GETS(char *string) 文字を順次入力し文字配列に格納しCRで終了する。配列の最後に0を追加する。
PUTC()
PUTCHAR()
1文字出力する
PUTS(string) 文字列を出力し、最後にCR,LFを追加する
PRINTF([function],
   string, [values])
フォーマット付き表示出力関数
・functionの指定が無い時は標準デバイスへ、ある時はfunctionへ出力する。
・stringは固定の文字列と変数のフォーマット指定の組合わせ変数のフォーマットは%wtで表現する
・valuesは変数名を指定する


 %wtフォーマットの指定方法は下記
 wは 1-9は出力する文字数指定
     0はゼロサプレス無し
    1.1-9.9は浮動少数の指定
 は C :文字
    U :符号無し整数
    x  :16進数小文字
    X :16進数大文字
    D :符号付き整数
    %e :exp形式
    %f :浮動少数
    Lx :16進数long整数
    LX:16進数long整数大文字
    lu :符号無しlong整数
    ld :符号付きlong整数
    % :%そのもの
〈例〉
  printf("Hello!\n");
  printf("VALUE= %2x\r\n,value);
  printf("%2u %X %4X\r\n,x,y,x);
b=KBHIT() 受信ピンでスタートビットを検出したときTRUEになる。
SET_UART_SPEED(baud) UARTハードウェアの通信速度を変更する





      目次ページへ