HRSLIB 1.0
easy H8 RS-232C LIBrary by I.N. 2007/2/28
更新履歴
2007/02/28 ver.1.0
1.はじめに
CPUボード H8/3069F + YellowIDE でRS-232C通信プログラムを作成する
ための関数ライブラリです.
H8/3069F以外のH8(CPU)でも使える可能性はありますが確認していません.
動作確認は 秋月電子H8-3069F + YellowIDE 6.47 で行いました.
2.特長
リングバッファ構造の受信バッファがあり,受信割り込みによって受信データは
バックグラウンドで自動的に格納されます.
受信データが来る瞬間にメインプログラムで他の作業を実行していてもデータを
取りこぼすことがありません.
ただし,受信バッファが一杯になった後に受信したデータはすべて無視(破棄)
されますので,受信バッファが一杯になる前にデータを読み出すようにしてください.
送信については,送信バッファはなく,送信関数ではすべてのデータを送信し
終わるまで制御は返ってきません.
3.使用方法とサンプル
3.1 使用方法
YellowIDEのコンパイルオプション(/p メンバ境界を考慮して可能な限り詰めて配置する)に
チェックを入れておいて下さい.
また,YellowIDEのプロジェクトの設定(割り込み)で
ベクタ番号:52 関数名:HRS_eri0 言語:C
ベクタ番号:53 関数名:HRS_rxi0 言語:C
ベクタ番号:56 関数名:HRS_eri1 言語:C
ベクタ番号:57 関数名:HRS_rxi1 言語:C
ベクタ番号:60 関数名:HRS_eri2 言語:C
ベクタ番号:61 関数名:HRS_rxi2 言語:C
を登録してください.
(SCIの使わないチャンネルがある場合,そのチャンネルに対応する
割り込みベクタについては,登録を省略しても構いません)
プログラムの先頭で以下のようにインクルードしてください.
#include <3069s.h>
#include "hrslib.h"
<注意>
HRS_Open()によってオープンした後は,メインプログラム内で
割り込み禁止 _di(); を実行しないようにしてください.
_di(); を実行するとデータが受信されなくなります.
3.2 サンプル
// H8/3069F用RS-232C通信ライブラリHRSLIB.Hを使ったサンプル
// 受信した文字をそのまま送信する
#include <3069s.h>
#include "hrslib.h"
void main(void)
{
int i,j;
int n0,n1;
unsigned char c;
HRS_Open(0);
HRS_Open(1);
for(;;){
n0=HRS_CheckRecv(0);
HRS_Printf(0,"com0:%d[byte]\r\n",n0);
if(n0){
c=HRS_Getc(0);
HRS_Putc(0,'[');
HRS_Putc(0,c);
HRS_Puts(0,"]\r\n");
}
n1=HRS_CheckRecv(1);
HRS_Printf(1,"com1:%d[byte]\r\n",n1);
if(n1){
c=HRS_Getc(1);
HRS_Putc(1,'[');
HRS_Putc(1,c);
HRS_Puts(1,"]\r\n");
}
for(j=0;j<10;j++){
for(i=0;;i++)if(i>30000)break;
}
}
}
4.設定の変更
4.1 受信バッファのサイズ変更
受信バッファのサイズの初期値は32バイトですが下記のようにして変更できます.
初期値より大きくすることも小さくすることもできます.
受信バッファのサイズの最小値は 1 です.大きくとれば,それだけRAMを食います.
#define HRS_BUFFERSIZE 64
#include "hrslib.h"
4.2 ボーレートの変更
ボーレートの初期値は38,400 bps(厳密には39062.5 bps)ですが,
下記のようにすると変更できます.(SCI0/1/2で異なるボーレートを設定可能)
//SCI0/SCI1/SCI2 を 9600 bpsにする場合
#define HRS_BRR0 80
#define HRS_BRR1 80
#define HRS_BRR2 80
#include "hrslib.h"
上記の値はCPUのクロックが25.0MHzの場合です.
なお,クロックが25.0MHzの場合,BRR値は次のようになります.
6 => 111607.1[bps] (115200に対し-3.12%)
12 => 60096.2[bps] (57600に対し+4.33%)
13 => 55803.6[bps] (57600に対し-3.12%)
19 => 39062.5[bps] (38400に対し+1.73%)
40 => 19054.9[bps] (19200に対し-0.76%)
80 => 9645.1[bps] (9600に対し+0.47%)
5.関数リファレンス
--------------------------------------------------------
int HRS_Open(int n);
--------------------------------------------------------
説明
シリアル通信(RS-232C)のポートをオープンします.最初に必要です.
通信設定は,ボーレート38400bps,スタートビット1bit,ストップビット1bit,パリティなし,
キャラクタ長8bit,XON/XOFFなしです.
オープンに成功すると,HRS_Close() でクローズするまで HRSLIB の各関数が使用可能となります.
引数
n:ポート番号 [0〜2] (SCI0〜SCI2に対応します)
戻り値
0 正常終了(オープンできた)
1 エラー(すでにオープンされている)
使用例
HRS_Open(1);
--------------------------------------------------------
int HRS_Close(int n);
--------------------------------------------------------
説明
シリアル通信ポートをクローズします.
引数
n:ポート番号 [0〜2] (SCI0〜SCI2に対応します)
戻り値
0 正常終了(クローズできた)
1 エラー(ポートがオープンされていない)
使用例
HRS_Close(1);
================送信に関わるもの================
--------------------------------------------------------
int HRS_Send(int n, unsigned char *buf, int size);
--------------------------------------------------------
説明
データの送信を行います.
すべてのデータを送信し終わるまで制御は戻ってきません.
引数
n:ポート番号 [0〜2] (SCI0〜SCI2に対応します)
buf:送信データが格納されている領域の先頭アドレス(ポインタ)
size:送信データのサイズ(単位:バイト)
戻り値
送信したデータのバイト数(単位:バイト)
(オープンされていないとき,この関数は
0 を返します.)
使用例
char buf[400];
HRS_Send(1,buf,400);
--------------------------------------------------------
int HRS_Putc(int n, int c);
--------------------------------------------------------
説明
1バイト送信します.
データを送信し終わるまで制御は戻ってきません.
引数
n:ポート番号 [0〜2] (SCI0〜SCI2に対応します)
c:送信データ(下位8ビットのみ有効)[0〜255]
戻り値
送信できたデータ数(単位:バイト)[0 or
1]
(オープンされていないとき,この関数は
0 を返します.)
使用例
HRS_Putc(1, 'A');
--------------------------------------------------------
int HRS_Puts(int n, unsigned char *s);
--------------------------------------------------------
説明
文字列を送信します.
文字列の終端コード(\0)は改行文字(\n)へ変換して送信されます.
すべてのデータを送信し終わるまで制御は戻ってきません.
引数
n:ポート番号 [0〜2] (SCI0〜SCI2に対応します)
s:送信される文字列が格納してある領域の先頭アドレス(ポインタ)
戻り値
送信できたデータ数(単位:バイト)(最後の改行も含む)
(オープンされていないとき,この関数は
0 を返します.)
使用例
char *s="ABC";
HRS_Puts(1, s);
HRS_Puts(1, "Hello");
--------------------------------------------------------
int HRS_Printf(int n, char *format [, argument]...);
--------------------------------------------------------
説明
(注意)この関数を使うとプログラムのサイズが大きくなります.
書式付き文字列を送信します.
使える書式は,一般的な printf() と同じです.制御文字や漢字もそのまま送信されます.
文字列の終端コード(\0)は改行文字(\n)へ変換して送信されます.
すべてのデータを送信し終わるまで制御は戻ってきません.
引数
n:ポート番号 [0〜2] (SCI0〜SCI2に対応します)
format:書式付き文字列へのポインタ
argument...:引数(必要に応じて)
戻り値
送信できたデータ数(単位:バイト)(最後の改行も含む)
(オープンされていないとき,この関数は
0 を返します.)
使用例
HRS_Printf(1, "a=%03d",a);
================受信に関わるもの================
--------------------------------------------------------
int HRS_Recv(int n, unsigned char *buf, int size);
--------------------------------------------------------
説明
データの受信を行います.
(注意)
指定されたデータ数よりも受信バッファのデータ数が少ない場合,
バッファ内のデータがなくなった時点で制御が戻ってきます.
指定された数のデータが来るまで待つことはしません.
この関数は実際に読み込んだデータの数を返します.
引数
n:ポート番号 [0〜2] (SCI0〜SCI2に対応します)
buf:受信データを格納する領域の先頭アドレス(ポインタ)
size:受信データ数(単位:バイト)
戻り値
受信できたデータ数(単位:バイト)
(オープンされていないとき,この関数は
0 を返します.)
使用例
char buf[32];
int n;
n=HRS_Recv(1,buf,32);
--------------------------------------------------------
int HRS_CheckRecv(int n);
--------------------------------------------------------
説明
受信バッファにたまっているデータの数(単位:バイト)を返します.
受信バッファのサイズより大きな値を返すことはありません.
引数
n:ポート番号 [0〜2] (SCI0〜SCI2に対応します)
戻り値
受信バッファ内のデータ数(単位:バイト)
使用例
int n;
char buf[32];
n=HRS_CheckRecv(1);
HRS_Recv(1,buf,n);
--------------------------------------------------------
int HRS_ClearRecv(int n);
--------------------------------------------------------
説明
受信バッファをクリアします.
引数
n:ポート番号 [0〜2] (SCI0〜SCI2に対応します)
戻り値
0 正常終了
1 エラー(オープンされていない)
使用例
HRS_ClearRecv(1);
--------------------------------------------------------
int HRS_Getc(int n);
--------------------------------------------------------
説明
1バイト受信し,その値を返します.
もしバッファにデータがない等の理由で受信できなかった場合は-1を返します.
引数
n:ポート番号 [0〜2] (SCI0〜SCI2に対応します)
戻り値
受信データ[0〜255]または-1
使用例
int c;
c=HRS_Getc(1);
if (c<0) ...
--------------------------------------------------------
int HRS_Gets(int n, unsigned char *s);
--------------------------------------------------------
説明
文字列を受信します.
最初に改行または終端コード(\r or \n or
\0)が来るまで受信し,
その改行または終端コードは\0に置き換えて格納されます.
最初の改行または終端コードが来るまで制御は戻ってきません.
引数
n:ポート番号 [0〜2] (SCI0〜SCI2に対応します)
s:受信した文字列を格納する領域の先頭アドレス(ポインタ)
格納領域 s のサイズを超える場合もチェックされないので注意してください.
戻り値
受信できた文字列のバイト数(改行または終端コードを含む)
使用例
char buf[100];
HRS_Gets(1,buf);
以上
ダウンロード
hrslib.h ファイル hrslib.h がLZH圧縮してあります.
1つ上へ戻る