H8RSLIB 2.1
easy H8 RS-232C LIBrary by I.N. 2011/6/22
更新履歴
2011/06/22 ver.2.1 送信バッファ処理の改良 H8RS_Send()
2008/10/23 ver.2.0 送信もリングバッファ仕様とした
2008/01/07 ver.1.3 H8RS_Sends()の追加
2005/08/29 ver.1.2 H8RS_Recv()の改良(割り込み対応を強化)
2005/08/26 ver.1.1 H8RS_CheckRecv()の改良(割り込み対応を強化)
2005/06/02 ver.1.0 初版


1.はじめに
 CPUボード H8/3664F + YellowIDE でRS-232Cシリアル通信プログラムを
作成するための関数ライブラリです.
 H8/3664F以外のH8(CPU)でも使える可能性はありますが未確認です.
 動作確認は AKI-H8/3664F + YellowIDE 6.5 で行いました.


2.特長
 リングバッファ構造の受信バッファがあり,受信割り込みによって受信データは
バックグラウンドで自動的に受信バッファへ格納されます.
 受信データが来る瞬間にメインプログラムで他の作業を実行していてもデータを
取りこぼすことがありません.
 ただし,受信バッファが一杯になった後に受信したデータはすべて無視(破棄)
されますので,受信バッファが一杯になる前にデータを読み出すようにしてください.

 リングバッファ構造の送信バッファがあり,送信ではデータはいったん送信バッファへ
格納されます.送信バッファへデータの格納が終わると,送信関数の制御はすぐに戻って
くるのでメインプログラムでは次の他の処理を行うことができます.
 送信割り込みによって送信バッファ内のデータはバックグラウンドで自動的に送信されます.
 送信バッファが一杯になった状態で送信関数を実行するとデータはすべて無視(破棄)され
ますので,送信バッファに空きがあることを確認してから送信するようにしてください.


3.使用方法とサンプル

3.1 使用方法
 プログラムの先頭で以下のようにインクルードしてください.
 #include <h83664.h>
 #include <stdio.h>
 #include <sysio.h>
 #include "h8rslib.h"

 また,YellowIDEのプロジェクトの設定(割り込み)で
ベクタ番号:23 関数名:H8RS_sci3_ir 言語:C を必ず登録してください.

 <注意>
 H8RS_Open()によってオープンした後は,メインプログラム内で
 割り込み禁止 _di(); を実行しないようにしてください.
 _di(); を実行するとデータの送受信ができなくなります.

3.2 サンプル
 受信した文字列をそのまま送り返すプログラム
#include <h83664.h>
#include <stdio.h>
#include <sysio.h>
#include "h8rslib.h"

void main(void)
{
        char buf[32];
        int n;

        H8RS_Open();

        H8RS_Sends("Hello!\r\n");

        for(;;){
                n=H8RS_CheckRecv();     //受信データの確認

                //もし1文字でも受信データがあれば以下の処理をする
                if(n){
                        n=H8RS_Recv(buf,n);   //データの受信

                        while(H8RS_CheckSend()<n);     //送信バッファの確認

                        H8RS_Send(buf,n);     //データの送信
                }

                //...
                //この間,別の作業をしてもかまわない.
                //...
        }
}

4.設定の変更

4.1 送受信バッファのサイズ変更
 バッファのサイズのデフォルト値は,送信・受信とも32[バイト]ですが,
下記のようにして変更できます.デフォルト値より大きくすることも小さくすることもできます.
バッファのサイズの最小値は 1 です.大きくすれば,それだけRAMを食います.
受信と送信で異なるバッファサイズを指定できます.

//受信バッファのサイズ変更
#define H8RS_RECVBUFFERSIZE 100
//送信バッファのサイズ変更
#define H8RS_SENDBUFFERSIZE 10

#include "h8rslib.h"

4.2 ボーレートの変更
 ボーレートの初期値は38400 bps(厳密には38461.5 bps)ですが,
下記のようにすると変更できます.

//9600 bpsにする場合
#define H8RS_BRR 51
#include "h8rslib.h"

上記の値はCPUのクロックが16.0MHzの場合です.

なお,クロックが16.0MHzの場合,BRR値は次のようになります.
207 => 2403.8 [bps] ( 2400に対し+0.16%)
103 => 4807.7 [bps] ( 4800に対し+0.16%)
51 => 9615.4 [bps] ( 9600に対し+0.16%)
25 => 19230.8 [bps] (19200に対し+0.16%)
15 => 31250.0 [bps] (31250に対し 0.00%)
12 => 38461.5 [bps] (38400に対し+0.16%)

誤差が大きなボーレート設定において,連続した大量のデータを送受信しようと
する場合,誤差が累積して,誤通信(文字化け)が発生する可能性があります.


5.関数リファレンス

================全体に関するもの================

--------------------------------------------------------
int H8RS_Open(void);
--------------------------------------------------------
説明
 シリアル通信(RS-232C)のポートをオープンします.最初に必要です.
 通信設定は,ボーレート38400bps,スタートビット1bit,ストップビット1bit,パリティなし,
 キャラクタ長8bit,XON/XOFFなしです.
 オープンに成功すると,H8RS_Close() でクローズするまで H8RSLIB の各関数が使用可能と
 なります.
戻り値
 0 正常終了(オープンできた)
 1 エラー(すでにオープンされている)
使用例
 H8RS_Open();


--------------------------------------------------------
int H8RS_Close(void);
--------------------------------------------------------
説明
 シリアル通信ポートをクローズします.
戻り値
 0 正常終了(クローズできた)
 1 エラー(ポートがオープンされていない)
使用例
 H8RS_Close();


================送信に関するもの================


--------------------------------------------------------
int H8RS_Send(unsigned char *buf, int n);
--------------------------------------------------------
説明
 データの送信を行います.
 送信バッファへデータの格納が終わると制御はすぐに戻ってきます.
 (実際のデータ送信はただちに実行されますが,送信バッファが空で
 ない場合,バッファにたまっているデータの送信が優先されます)
 送信バッファからあふれたデータは無視(破棄)されます.
引数
 buf:送信データが格納されている領域の先頭アドレス(ポインタ)
 n:送信データのサイズ(単位:バイト)
戻り値
 送信バッファへ格納されたデータのバイト数(単位:バイト)
 (オープンされていないとき,この関数は 0 を返します.)
使用例
 char buf[32];
 H8RS_Send(buf,32);


--------------------------------------------------------
int H8RS_CheckSend(void);
--------------------------------------------------------
説明
 送信バッファの空きサイズをバイト単位で返します.
 データを送信するときは,この関数でバッファの空きを確認してから
 送信するようにすると,データの送信洩れがありません.
 送信バッファのサイズより大きな値を返すことはありません.
戻り値
 送信バッファの空きサイズ(単位:バイト)
使用例
 int n;
 char buf[32];
 while(H8RS_CheckSend()<n);
 H8RS_Send(buf,n);


--------------------------------------------------------
int H8RS_ClearSend(void);
--------------------------------------------------------
説明
 送信バッファをクリアします.
 バッファに残っている送信前のデータはすべて破棄され送信されません.
戻り値
 0 正常終了
 1 エラー(オープンされていない)
使用例
 H8RS_ClearSend();


--------------------------------------------------------
int H8RS_Putc(int c);
--------------------------------------------------------
説明
 1バイト送信します.
 送信バッファへデータの格納が終わると制御はすぐに戻ってきます.
 (実際のデータ送信はただちに実行されますが,送信バッファが空で
 ない場合,バッファにたまっているデータの送信が優先されます)
 送信バッファからあふれたデータは無視(破棄)されます.
引数
 c:送信データ(下位8ビットのみ有効)[0〜255] 
戻り値
 送信バッファへ格納されたデータのバイト数(単位:バイト)[0 or 1]
 (オープンされていないとき,この関数は 0 を返します.)
使用例
 H8RS_Putc('A');


--------------------------------------------------------
int H8RS_Puts(unsigned char *s);
--------------------------------------------------------
説明
 文字列を送信します.
 文字列の終端コード(\0)は改行文字(\n)へ変換して送信されます.
 送信バッファへデータの格納が終わると制御はすぐに戻ってきます.
 (実際のデータ送信はただちに実行されますが,送信バッファが空で
 ない場合,バッファにたまっているデータの送信が優先されます)
 送信バッファからあふれたデータは無視(破棄)されます.
引数
 s:送信される文字列が格納してある領域の先頭アドレス(ポインタ)
戻り値
 送信バッファへ格納されたデータのバイト数(単位:バイト)(最後の改行も含む)
 (オープンされていないとき,この関数は 0 を返します.)
使用例
 char *s="ABC";
 H8RS_Puts(s);
 H8RS_Puts("Hello");


--------------------------------------------------------
int H8RS_Sends(unsigned char *s);
--------------------------------------------------------
説明
 文字列を送信します.
 文字列の終端コード(\0)を見つけると送信は終了します.
 終端コードは送信されません.
 送信バッファへデータの格納が終わると制御はすぐに戻ってきます.
 (実際のデータ送信はただちに実行されますが,送信バッファが空で
 ない場合,バッファにたまっているデータの送信が優先されます)
 送信バッファからあふれたデータは無視(破棄)されます.
引数
 s:送信される文字列が格納してある領域の先頭アドレス(ポインタ)
戻り値
 送信バッファへ格納されたデータのバイト数(単位:バイト)
 (オープンされていないとき,この関数は 0 を返します.)
使用例
 char *s="ABC";
 H8RS_Sends(s);
 H8RS_Sends("Hello\r\n");


--------------------------------------------------------
int H8RS_Printf(char *format [, argument]...);
--------------------------------------------------------
説明
 (注意)この関数を使うとプログラムのサイズが大きくなる可能性があるため,
     H8のROMサイズを考慮して使って下さい.
 書式付き文字列を送信します.
 使える書式は,一般的な printf() と同じです.制御文字や漢字もそのまま送信されます.
 文字列の終端コード(\0)は改行文字(\n)へ変換して送信されます.
 送信バッファへデータの格納が終わると制御はすぐに戻ってきます.
 (実際のデータ送信はただちに実行されますが,送信バッファが空で
 ない場合,バッファにたまっているデータの送信が優先されます)
 送信バッファからあふれたデータは無視(破棄)されます.
<補足>
 一回に送信できる文字数は256バイトです.このデフォルト値を変更するには
 #define H8RS_PRINTF_BUFFERSIZE 1024(←1024バイトに変更する例) を
 #include "h8rslib.h"より前に記述してください.
引数
 format:書式付き文字列へのポインタ
 argument...:引数(必要に応じて)
戻り値
 送信バッファへ格納されたデータのバイト数(単位:バイト)(最後の改行も含む)
 (オープンされていないとき,この関数は 0 を返します.)
使用例
 H8RS_Printf("a=%03d",a);


================受信に関するもの================

--------------------------------------------------------
int H8RS_Recv(unsigned char *buf, int n);
--------------------------------------------------------
説明
 受信バッファからデータを読み取ります.
(注意)
 指定されたデータ数よりも受信バッファのデータ数が少ない場合,
 バッファ内のデータがなくなった時点で制御が戻ってきます.
 指定された数のデータが来るまで待つことはしません.
 この関数は実際に読み込んだデータの数を返します.
引数
 buf:受信データを格納する領域の先頭アドレス(ポインタ)
 n:受信データ数(単位:バイト)
戻り値
 受信できたデータ数(単位:バイト)
 (オープンされていないとき,この関数は 0 を返します.)
使用例
 char buf[32];
 int n;
 n=H8RS_Recv(buf,32);


--------------------------------------------------------
int H8RS_CheckRecv(void);
--------------------------------------------------------
説明
 受信バッファにたまっているデータの数(単位:バイト)を返します.
 受信バッファのサイズより大きな値を返すことはありません.
戻り値
 受信バッファ内のデータ数(単位:バイト)
使用例
 int n;
 char buf[32];
 n=H8RS_CheckRecv();
 H8RS_Recv(buf,n);


--------------------------------------------------------
int H8RS_ClearRecv(void);
--------------------------------------------------------
説明
 受信バッファをクリアします.
戻り値
 0 正常終了
 1 エラー(オープンされていない)
使用例
 H8RS_ClearRecv();


--------------------------------------------------------
int H8RS_Getc(void);
--------------------------------------------------------
説明
 受信バッファから1バイト読み取り,その値を返します.
 もしバッファにデータがない等の理由で受信できなかった場合は-1を返します.
戻り値
 受信データ[0〜255]または-1
使用例
 int c;
 c=H8RS_Getc();
 if (c<0) ...


--------------------------------------------------------
int H8RS_Gets(unsigned char *s);
--------------------------------------------------------
説明
 受信バッファから文字列を読み取ります.
 最初に改行または終端コード(\r or \n or \0)が来るまで受信し,
 その改行または終端コードは\0に置き換えて格納されます.
 最初の改行または終端コードが来るまで制御は戻ってきません.
引数
 s:受信した文字列を格納する領域の先頭アドレス(ポインタ)
  格納領域 s のサイズを超える場合もチェックされないので注意してください.
戻り値
 受信できた文字列のバイト数(改行または終端コードを含む)
使用例
 char buf[100];
 H8RS_Gets(buf);


ダウンロード

 h8rslib.h ファイル h8rslib.h がZIP圧縮してあります.

 旧バージョンのページ → H8RSLIB ver.1.3


1つ上へ戻る