H8RSLIB 1.3
easy H8 RS-232C LIBrary by I.N. 2008/1/7
更新履歴
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/3664 + YellowIDE でRS-232C通信プログラムを作成する
ための関数ライブラリです.
3664以外のH8でも使える可能性はありますが確認していません.
動作確認は AKI-H8/3664F + YellowIDE6.47 で行いました.
2.特長
リングバッファ構造の受信バッファがあり,受信割り込みによって受信データは
バックグラウンドで自動的に格納されます.
受信データが来る瞬間にメインプログラムで他の作業を実行していてもデータを
取りこぼすことがありません.
ただし,受信バッファが一杯になった後に受信したデータはすべて無視(破棄)
されますので,受信バッファが一杯になる前にデータを読み出すようにしてください.
送信について,送信バッファはなく,送信関数ではすべてのデータを送信し終わる
まで制御は返ってきません.
3.使用方法とサンプル
3.1 使用方法
プログラムの先頭で以下のようにインクルードしてください.
#include <h83664.h>
#include <stdio.h>
#include <sysio.h>
#include "h8rslib.h"
また,YellowIDEのプロジェクトの設定(割り込み)で
ベクタ番号:23 関数名:H8RS_recv_ir 言語:C を必ず登録してください.
<注意>
H8RS_Open()によってオープンした後は,メインプログラム内で
割り込み禁止 _di(); を実行しないようにしてください.
_di(); を実行するとデータが取れなくなります.
3.2 サンプル
受信した文字列をそのまま送り返すプログラム
#include <h83664.h>
#include <stdio.h>
#include <sysio.h>
#include "h8rslib.h"
void main(void)
{
unsigned char buf[32];
int n;
H8RS_Open();
for(;;){
n=H8RS_CheckRecv(); //受信データの確認
//もし1文字でも受信データがあれば以下の処理をする
if(n){
n=H8RS_Recv(buf,n);
H8RS_Send(buf,n);
}
//...
//この間,別の作業をしてもかまわない.
//...
}
}
4.設定の変更
4.1 受信バッファのサイズ変更
受信バッファのサイズの初期値は32バイトですが下記のようにして変更できます.
初期値より大きくすることも小さくすることもできます.
受信バッファのサイズの最大値は 32767,最小値は
1 です.大きくとれば,
それだけRAMを食います.
#define H8RS_BUFFERSIZE 64
#include "h8rslib.h"
4.2 ボーレートの変更
ボーレートの初期値は38400bpsですが下記のようにして変更できます.
//19200bpsにする場合
#define H8RS_BRR 25
#include "h8rslib.h"
なお,BRR値については
H8RS_BRR : 207 ---> 2400[bps]
H8RS_BRR : 103 ---> 4800[bps]
H8RS_BRR : 51 ---> 9600[bps]
H8RS_BRR : 25 ---> 19200[bps]
H8RS_BRR : 15 ---> 31250[bps]
H8RS_BRR : 12 ---> 38400[bps]
となります.上記の値は,CPUのクロックが16MHzの場合です.
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[400];
H8RS_Send(buf,400);
--------------------------------------------------------
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]...);
--------------------------------------------------------
説明
書式付き文字列を送信します.
使える書式は,一般的な printf() と同じです.制御文字や漢字もそのまま送信されます.
文字列の終端コード(\0)は改行文字(\n)へ変換して送信されます.
すべてのデータを送信し終わるまで制御は戻ってきません.
(注意)この関数を使うとプログラムのサイズが大きくなる可能性があるため,
H8のROMサイズを考慮して使って下さい.
引数
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 がLZH圧縮してあります.
1つ上へ戻る