RS232C:シリアル通信

  1. 目的

     シリアル通信(RS232C)を利用して、パソコンと接続する。接続するとPICのプログラムの printf() でパソコンの画面に文字が表示できる。また、scanf() で鍵盤の文字を入力できる。

  2. シリアル通信

    1. シリアル通信

      シリアル通信は、送受信を各1本の信号線で行います。送信側ではバイト単位のデータを下位ビットから順に送り出します。受信側ではこのデータを受け取り、8ビットのデータに合成してメモリに保存します。
       シリアル通信には多くの送受信の手法があります。USB、イーサネット、携帯電話(ディジタル)もシリアル通信を行います。RS232Cは古くから利用されているシリアル通信方式で、簡単に送受信回路を構成できます。ただしパソコンの世界では、最近は、より多機能・高速な USB が多用されRS232Cが利用されることは少なくなりました。しかし、組込みハードの世界では、よく利用されています。

    2. RS232C通信とソケット

       RS232Cによるシリアル通信はパソコンの COM1,COM2 ソケットを利用します。
       PCには COM 端子があり、イーサネットが普及する前は、COM端子にモデムを接続し、モデム経由でインターネットに接続していました。
      RS232Cのコネクタは本来D-SUB25ピンでしたが、Windows PCがD-SUB9ピンを採用後、このコネクタが多くなりました。25ピンと9ピンでは送信と受信のピンが入れ替わっていますから注意してください。9ピン接続の場合、データ信号は3,2ピン、グランド信号が5ピンです。


      信号 意味 25ピン 9ピン
      TXD 送信信号 2 3
      RXD 受信信号 3 2
      RTS 送信要求 4 7
      CTS Clear To send 5 8
      DSR Data Set Ready 6 6
      GND 基準電位 7 5
      DCD Data Carrier Detect 8 1
      DTR Data Terminal Ready 20 4
      R I Ring Information 22 9

      9ピンの場合、3ピンがPCからの送信、2ピンが相手からの受信信号です。この信号は5ピンを基準(グランド)電圧とします。
       他の信号は、送受信の制御に利用される場合があります。PCの場合、PC側が送受信可能な場合、RTS信号を出してきます。これに対し、PIC(端末)側は送受信可能になるとCTS信号を出力します。これをハードウエアハンドシェイク(握手)といいます。

    3. データ信号とパリティ

       シリアル(直列)通信は、送信、受信に各1本、他にグランド信号のみで接続が可能です。データ信号は、最初に0を送り、続けて送信したいバイトデータの各ビットを順に送ります。最後に1bit時間データ線を1に保持します。最初の0をスタートビット、最後の1をストップビットと呼びます。


        各ビットは一定時間間隔で直列(シリアル)に送り出します。この速度は、9600bps(bps:秒あたりのビット数)が標準で、最近ではこのn倍がよく利用されます。1バイトのデータを送るには、スタート、ストップビットを含めると10ビットとなりますから、秒あたりの送信可能なバイト数は960(約1Kバイト)になります。また、データの最後に誤り検査用のパリティチェックビットを含めることができますが、現在、この機能はほとんど利用されていません。

    4. 信号レベル

       RS232Cの信号レベルは、±15ボルトです。論理値1が-3〜-15V、0が3〜15Vです。ただし、TTLとの互換性をとるため、3V以上を0、それ以外を1としている場合もありますが、保証はされません。PCのディジタル信号の標準は 0〜5V のため、PICなどと接続するためには電圧のレベル変換回路が必要です。信号がない場合、RS232Cの送受信信号は -9Vで、PICのレベルはコンバータで反転するため H(5V)レベルになります。

    5. ソケットとケーブル

       一般に通信を制御する側をホスト、ホストの要求に応じてデータを送受信する側を端末(クライアント)と呼びます。ホスト側のコネクタは通常オス型で端末側はメス型です。したがって、接続するケーブルはホスト側はメス型、端末側はオスになります。ここでは、PICは端末側のソケットを使います。
      上の表の端子接続はホスト側の接続で、端末側ではホストの送信信号を端末側の受信端子を接続する必要があります。制御線に関しても、CTSとRTS、DSRとDTRを入れ替える必要があります。


  3. PCで送受信するツール


    1. HyperTerminal

      PC側に RS232C で送受信するツール(プログラム)がないと、接続試験ができません。ここでは、Windows標準のアクセサリである HyperTerminal(ハイパーターミナル) を利用します。アクセサリの「通信」メニューからHypertrm.exe を起動します。これは、COM端子から入力した文字を画面に表示し、キーボードの入力をCOM端子から出力します。

    2. 設定

       ファイルメニューから「新しい接続」を選択するとダイアログが出ます。名前を 9600com1 とし、適当なアイコンを選択し、OKします。接続方法として、「Com1ダイレクト」 を選択します。他は電話の場合に必要な項目ですから、設定不要です。OK[を押します。


      COM1のプロパティダイアログが出ます。ビット/秒 を9600、フロー制御 をなし に変更します。これで、設定が完了です。
       鍵盤を押すとそのコードがシリアル端子:com1: から出力されます(画面には表示されません)。RS232cからのの受信があると、受信文字を表示します。

  4. 回路設計


    1. レベル変換回路

       RS232C を設計する当時では、雑音に対抗するには信号電圧の振幅を大きくすることが効果的でした。そこで、RS232C の信号は、0(Lレベル)が-9V 、1(Hレベル)が +9V に対応付けられています。このため、PICの0と5Vの信号電圧を変換する必要があります。ここでは、AMD3202でこのレベル変換を行います。この素子には、±9vの電圧を、5V電源から生成する機能が必要なため、±電源ごとにコンデンサが必要です。このコンデンサには0.1μFのコンデンサを使用します。
       AMD3202では、入力2本、出力2本の変換機能がありますが、ここでは、入出力信号1本のみ利用します。

    2. RS232Cコネクタ

       9ピンコネクタで接続します。制御信号は、PCのRTS信号をそのままCTSに折り返します。これは、PICからの出力を行うことを意味します。
       コネクタの足と信号線を接続するのはちょっと厄介かも知れません。また、コネクタのピン番号を間違えないよう注意してください。

    3. 実験回路

       PICのB2(8ピン)がシリアル出力でAMD232の10ピンに接続し、レベル変換後AMD232の7ピンとRS232Cコネクタの2ピンに接続します。これは、PC側の受信信号になります。
       一方RS232Cコネクタの3ピンはPCのシリアル出力で、AMD232の8ピンに入力し、レベル変換後9ピンから、PICのPB1(7ピン)に接続します。
       AMDには電圧生成のため、合計4個のコンデンサを外付けします。コンデンサの足が長いので、適当な長さに切りそろえてください。

      MAX2332Cの変換回路は他の実験でも使用しますから別のボードで作成してください。

  5. プログラム


    1. PICでRS232Cを利用する

       PICでRS232Cを利用するには、use 文 で rs232cの利用と、速度、送受信端子を指定します。BAUDがボーレートで、秒あたりのビット数を指定します。xmit は送信、rcv は受信のピン番号を指定します。
          #use RS232(BAUD=9600,xmit=PIN_B2,rcv=PIN_B1)
      PIC用のCコンパイラでは、RS232Cを標準装置として扱いします。したがって、データを送信するには、printf() やputc()、受信するには、scanf() や getc() が利用できます。
       RS232C が組み込まれていないPICの場合、シフトウエアでこの機能を組み込みます。

    2. プログラムの流れ

      プログラムを実行する前に、まず、ケーブルでPCと接続し、ハイパーターミナル(9600BPS)を起動しておきます。
       プログラムは、簡単です。#USEでRS232を設定します。この文は、#use delay() のあとで指定します。main()では、まず、printf() で cmd を出力ます。このとき、1ピンのA2 にLEDを接続しておくと、一瞬発光します。
       ハイパーターミナルのキー入力を待ちます。改行キーが入力されるまで入力文字を読み、PCに送り返します。ここで、文字数を len に記録します。改行コードを受け取ったら、length = に続けて、受信した文字数をPC側に送り表示します。

    3. ハイパーターミナルの画面

       実行すると、画面にcmd: の文字が表示されます。ハイパーターミナルでキーボードから半角で文字を入力し enterキーを押します。PIC側では 受信した文字を ハイパーターミナル に送りその文字数を表示します。
       cmd を表示する前に ポートA2に 接続したLEDが点灯します。


      今回の実験では、上のような画面になります。終了時に設定を保存すると、次回からは、設定した内容で起動できます。

    4. ソース

      #include <16f648a.h>
      
      #fuses HS,NOWDT,NOLVP,NOMCLR //内部クロック、WDT,LVPなし
      #use delay(CLOCK=20000000)
      #use RS232(BAUD=9600,xmit=PIN_B2,rcv=PIN_B1)//use delayの後に配置する
      
      main(){
              char cmnd;
              int len;
              int i;
              //set_tris_b(0b11110010);
              
              while(1){
                        delay_ms(300);
                        output_low(pin_a2);
                        delay_ms(300);
                        output_high(pin_a2);
                        
                      printf("\rcmd:");
                len=0;
                      do{
                         cmnd=getc();
                         putc(cmnd);
                         len ++;
                       }while (cmnd != '\r' && cmnd != 'n');
                       printf("\nlength=%d\n",len);              
              }
              return 0;
      }