RS232C通信について

Copyright(C) 4 Feburuary 2002
 coskx

【1】RS232C通信

パソコン−周辺機器間通信,パソコン−パソコン間通信ではデータを1バイト(=8ビット)ずつ順番に転送する場合が多い。その際,8ビットの符号を 8本の信号線を用いて同時に送信するパラレル通信の手法と,1本の信号線を用いて8ビットの符号を1ビットずつ順に送るシリアル通信の手法がある。 RS232C通信はシリアル通信の手法の1つである。

よく用いられている通信方法の1つは,調歩同期式と呼ばれるもので,お互いに転送速度(1秒間に何ビット送るか),パリティビット(通信エラーチェック用)を用いるかどうか,ストップビット(1バイト送信終了の合図)を何ビット送るかを決めてから送信する。送信側は
(1)スタートビットを送信
(2)8ビットデータ(1バイト)を送信 (7ビットしか送らない方法もある)
(2')ここでパリティビットを送信する方法もあるがこの文書では使わない
(3)ストップビットを送信
を必要なバイト数続ければよいし,受信側はスタートビットを受信したら,その後に続く8ビットをあらかじめ決められた時間(送受信双方で取り決めた転送速度で決まる)ごとにデータとして受け取ればよい。(図1参照)
なお1byteのデータは下位bitから順に転送されている。

SENDING1BYTE.GIF

図1A RS232C通信の基本構造

図1B RS232C通信で文字'0'を送信しているところ
文字'0'は十六進数では30,二進数では00110000であり,最小位ビットから送信されるので00001100が送信される。

H8マイコンなどのTTLレベルでは信号はH,Lで表されるが,RS232C論理信号では正論理信号とは反転していて,しかもSpaceレベルは+3V~+15V,Markレベルは-15V~-3Vとなっている。

【2】RS232C通信におけるケーブル

調歩同期式の通信ではケーブルは基本的には次の3本の線で成り立っている。他にも通信制御のための信号線はあるが,使用されていない。(一部利用されているものもあるが内部結線されており,ユーザは考えなくても良い)
(1)グランド (2)送信(TXD) (3)受信(RXD)

D-SUB25PとD-SUB9Pのソケットにおける信号のピン配置を表1に示す。 詳細は別ページに示す。

RS232CPIN.GIF - 1,949BYTES

図2 差込口側のピン配置


表1 送受信信号と差込口側ピン番号 信号の名前はケーブル内での信号の名前である

信号

D-SUB25Pでは

D-SUB9Pでは

送信(TXD)

2

3

受信(RXD)

3

2

 

 

 


結線に当たっては「自分の送信信号TXD」を「相手の受信信号RXD」につなぐ。
信号名と端子名に混乱があるので別ページを参照のこと

すなわちクロスさせることになるが,ケーブル内でクロスさせるか,機器側でクロスさせるかの違いで,ケーブルには結線方法の違いで2種類存在することとなっている。すなわち
(1)ストレートケーブル (P2,P3が機器側でクロスされている場合に用いる)
(2)クロスケーブル (P2,P3をケーブル内でクロスさせる目的で用いる)
がある。
D-SUB25P同士のストレートケーブルの場合にはP2,P3はそれぞれ反対側のP2,P3に結線されている。D-SUB25P同士のクロスケーブル(リバースケーブル)
の場合にはP2,P3はそれぞれ反対側のP3,P2に結線されている。D-SUB9P同士の場合も同じことが言える。しかしD-SUB25PとD-SUB9P間ではストレートケーブルの場合がP2,P3はそれぞれ反対側のP3,P2に,クロスケーブル(リバースケーブル)の場合にはP2,P3はそれぞれ反対側のP2,P3に結線されている。
RS232Cケーブルがストレートケーブルかクロスケーブルか外見で見分けることはむずかしい。購入時に良く確かめること。

表2 ストレートケーブルの内部結線

D-SUB25P<>D-SUB25P
D-SUB9P<>D-SUB9P
D-SUB25P<>D-SUB9P

2

2


2

2


2

3

3

3


3

3


3

2

表3 クロスケーブルの内部結線

D-SUB25P<>D-SUB25P
D-SUB9P<>D-SUB9P
D-SUB25P<>D-SUB9P

2

3


2

3


2

2

3

2


3

2


3

3

H8マイコンAKI-H8の通信時の結線についても別ページを参照のこと

【3】パソコンからマイクロコンピュータH8へプログラムのフラッシュメモリ書き込み

パソコン−モデム間通信のようにパソコンが主でモデムが従の時の通信ではストレートケーブルが用いられる。パソコンとマイクロコンピュータH8(AKI-H8)の間でも同様にストレートケーブルが用いられる。パソコンで開発したプログラムをH8にフラッシュメモリ書き込みするときもRS232C通信が行なわれている。
なおH8は2チャネルのシリアル通信インタフェイス(チャネル0とチャネル1)を持っており,この作業にはチャネル1が用いられている。なおシリアル通信インタフェイスとはRS232C通信用のインタフェイスのことである。
使用されるストレートケーブルはパソコン側9P(メス),AKI-H8側25P(オス)のものである。


【4】パソコンとマイクロコンピュータH8との通信

マイクロコンピュータH8のデバッグ時にパソコンのターミナルソフト(例えばハイパーターミナル)が使えれば,パソコン側からキーボードとディスプレイ表示機能を提供できるようになる。
すでにマイクロコンピュータH8のシリアル通信インタフェイスチャネル1はハードウェアとしてはパソコンとつながっているので,ソフトウェアを書くだけでうまく行くはずである。
通信にはストレートケーブルを用いる。
通信手順は次のようにするのでパソコン側のターミナルソフトも同様の設定をしておかねばならない。
通信速度=38400baud(bit/sec)
通信方式=Async(調歩同期式)
データ長=8bit(8ビットでデータ送信)
パリティビット=NoParity(パリティは使わない)
ストップビット=stop1(ストップビットは1ビットだけ使用する)
以下の4つの関数を利用するとプログラム中からシリアル通信インタフェイスチャネル1が利用できる。

(1)SCI-ch1の初期化関数
void initSCI1(void)
{
    short int i;
    /*unsigned char dummy;*/
    SCI1.SCR.BYTE = 0;       /* clear all flags */
                                 /* 2400-38400baud are available at n=0(cks1=0,cks2=0) */
    SCI1.SMR.BYTE = 0;       /* Async, 8bit , NoParity, stop1, 1/1 */
    SCI1.BRR = 12;          /* 38400baud (CPU=16MHz) */
    for(i=0;i<1000;i++);      /* wait more than 1bit time */
    SCI1.SCR.BYTE = 0x30;    /* scr = 0011 0000 (TE=1,RE=1) */
    return;
}

(2)SCI-ch1から1byte入力する関数 戻り値はコード。エラーがあると-2が戻る
short int getCharSCI1(void)
/* return value 0x00-0xFF:received data */
/*              -2(0xFFFE):error */
{
    short int flags,recdata;
    do {
        flags = SCI1.SSR.BYTE;
        if (flags&0x38) {/* error */
            SCI1.SSR.BIT.RDRF = 0;
            SCI1.SSR.BIT.ORER = 0;
            SCI1.SSR.BIT.FER = 0;
            SCI1.SSR.BIT.PER = 0;
            return -2;
        }
        if (flags&0x40) {/* normally received one data */
            SCI1.SSR.BIT.RDRF = 0;
            recdata=SCI1.RDR;
            return recdata;
        }
    } while (1);
}

(3)SCI-ch1を検査し,受信データがあれば1byteを返す関数
戻り値は入力コード。なければ-1が,失敗すると-2が戻る。
short int chkgetCharSCI1(void)
/* return value -1(0xFFFF):no received data  */
/*              0x00-0xFF:received data */
/*              -2(0xFFFE):error */
{
    short int flags,recdata;
    flags = SCI1.SSR.BYTE;
    SCI1.SSR.BIT.RDRF = 0;
    if (flags&0x38) {/* error */
        SCI1.SSR.BIT.ORER = 0;
        SCI1.SSR.BIT.FER = 0;
        SCI1.SSR.BIT.PER = 0;
        return -2;
    }
    if (flags&0x40) {/* normally received one data */
        recdata=SCI1.RDR;
        return recdata;
    } else {
        return -1;
    }
}

(4)SCI-ch1に1バイト出力する関数
void putCharSCI1(char c)
{
    while((SCI1.SSR.BYTE & 0x80)==0);
    SCI1.TDR = c;
    SCI1.SSR.BIT.TDRE = 0;
}

小坂研究室ではこの関数群はh8-01.h中に収められている。

【5】H8同士の通信

2つのH8どうしで通信したい場合はクロスケーブル(両端25Pオス)を用いれば【3】の(1)の初期設定を双方で行なえば可能となる。しかしシリ アル通信インタフェイスch1をパソコンのために開けておきたい場合は,ch0を用いることとし,ch1用の関数をch0用に書き改めて使用すればよい。 通信速度を1200bit/secに設定した場合のシリアル通信インタフェイスch0初期化関数と1バイト送信関数は次のようにすればよい。

void initSCI0()
{
    int i,j;
    unsigned char dummy;
    SCI0.SCR.BYTE = 0;       /* clear all flags */
    SCI0.SMR.BYTE = 1;       /* Async, 8bit , NoParity, stop1, 1/1 */
    SCI0.BRR=103;             /*1200baud (CPU=16MHz) */
    for (j=0;j<3000;j++);    /* wait more than 1bit time */
    SCI0.SCR.BYTE = 0x30;    /* scr = 0011 0000 (TE=1,RE=1) */
    dummy = SCI0.SSR.BYTE;   /* read dummy             */
    SCI0.SSR.BYTE = 0x80;    /* clear error flag (TDRE = 1)     */
    return;
}

void sci0_putbyte(char c)
{
    unsigned char tmp;
    do{
        tmp = SCI0.SSR.BYTE;
    } while((tmp & 0x80)==0);
    SCI0.TDR = c;
    SCI0.SSR.BIT.TDRE = 0;
    return;
}

【6】赤外線を用いたH8同士の通信への拡張

通信ケーブル部分を赤外線発光素子と赤外線受光素子に置き換えると赤外線を用いた通信が出来る。ただし,赤外線受光素子は外乱赤外線に弱くなるため,ある周波数の点滅赤外線に反応するように製作された赤外線受光モジュールが開発され市販されている。
送信側はシリアル通信インタフェイスからの出力信号の1の符号部分を特定の高い周波数でのON-OFF信号に変化させてから赤外線発光素子を光らせるようにすればよい。
受信側では,ある周波数のON-OFF信号が来たら1を,そうでなかったら0を発生する赤外線受光モジュールを用いて,シリアル通信インタフェイスへのい入力信号を作ればよいことになる。
以下38kHzにチューニングされた赤外線受光モジュールを用いることにして話を進める。

INFMODEL.GIF
図3 赤外線RS232C通信の原理

送信側の周波数変調
シリアル通信インタフェイスからの出力信号と特定の周波数(37.9kHz)のクロック信号(デューティ比50%)の AND演算を行ない,所望の信号を得るのでこれで赤外線LEDを発行させると良い。ただし特定の周波数のクロック信号はH8のパルス発生インタフェイスを 用いて作ればよい。
ITU0を利用して37.9kHzのクロック信号を発生する初期化関数は次に与える。この関数が呼び出された直後より,H8CPUカードのコネクタピン「CN1-10」からクロックが発生している。 (オリジナルは松林先生作)

void initITU0_379hHz(void)
{
    int j;
    ITU.TMDR.BYTE = 0x80;  /* Timer 初期設定 通常動作 */
    ITU0.TCR.BYTE = 0xa0;  /* Timer ch0 GRAでTCNTクリア,内部1/1clock */
    ITU0.TIOR.BYTE = 0x8b; /* Timer ch0 GRAのコンペアマッチでトグル出力 */
    ITU0.GRA = 211;        /* Timer ch0 16MHz/211/2=37.9kHz */
    ITU0.TIER.BYTE = 0xf8; /* Timer ch0 GRAで割り込みなし */
    for (j=0;j<30000;j++);     /* wait*/
    ITU.TSTR.BYTE = 0x01;  /* Timer ch0 Start*/
}

【7】 高速通信への改良

この文書では「赤外線の変調周波数38kHz,シリアル通信速度1200bit/sec」の紹介をしたが,これは赤外線受光モジュールの特性に合わせているから,このような仕様になっている。
これ以外に,赤外線受光モジュールで455kHzの変調周波数をもつものがあり,これを利用すると「赤外線の変調周波数455kHz,シリアル通信速度9600bit/sec」の通信が可能になる。