SHRSLIB 1.3
easy SH2 RS-232C LIBrary by I.N. 2008/1/17
更新履歴
2008/01/17 使用方法でram7045e.xに関する説明を追加.
2005/08/29 ver.1.3 SHRS_Recv()を改良(割り込み対応が不十分だった),
             BRR値を14から15へ変更(より誤差が少ない)
2005/08/25 ver.1.2 SHRS_CheckRecv()を改良(割り込み対応が不十分だった)
2005/08/24 ver.1.1 割り込み優先レベルを1から15へ高めた
2005/07/11 ver.1.0


1.はじめに
 CPUボード SH2/7045F + H8/OS + Cygwin でRS-232C通信プログラムを作成する
ための関数ライブラリです.
SH2/7045F以外のSH(CPU)でも使える可能性はありますが確認していません.
 動作確認は AKI-SH2/7045F + H8/OS + Cygwinで行いました.


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


3.使用方法とサンプル

3.1 環境設定
 この環境設定はSHRSLIBに限らず,AKI-SH2/7045Fを使う場合の一般的な話です.
 私は普段,プログラムをRAM転送して実行していますが,H8/OSに付属のram7045.xでは
コンパイル時すぐにメモリ不足になるため,自分で修正したram7045e.xを用意して
使用しています.具体的な変更点を挙げる前に,相違点を要約すると
(1)RAM領域をCPUの内蔵RAM(4Kbyte)から,CPUボード搭載のSRAM(1Mbyte)へ変更
(2)スタック領域は内蔵RAMを使用するよう指定
です.スタックの指定方法についてはrom7045.xを参考にしました.

以下では相違点のみを示します.
オリジナル(ram7045.x)
MEMORY
{
        syscall(r) : o = 0x00000400, l = 0x200
        ram(rwx)   : o = 0xfffff7a0, l = 0x00460
}
修正版(ram7045e.x)
MEMORY
{
        syscall(r) : o = 0x00000400, l = 0x200
        ram(rwx)   : o = 0x00400000, l = 0x80000
        stack(rw)  : o = 0xfffffc00, l = 0x00400
}

ファイルの最後に以下を追加(ram7045e.x)

.stack 0xfffffffc : {
         _stack = . ;
        *(.stack)
        }  > stack

プログラムの転送方法は同じです.
put -S com1 xxx.mot
プログラムの実行開始アドレスは次のように変わります.
put -S com1 -g 400000

ちなみに,コンパイルおよびmot生成は次のような感じで行っています.
sh-coff-gcc -O -m2 -g -T ram7045e.x -nostartfiles shramcrt0.S xxx.c -lm
sh-coff-objcopy -O srec a.out xxx.mot

3.2 使用方法
 プログラムの先頭で以下のようにインクルードしてください.
 #include "shrslib.h"

3.3 サンプル
 受信した文字列をそのまま送り返すプログラム

#include <sh/reg704x.h>
#include <h8/syscall.h>
#include "shrslib.h"

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

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

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

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

4.設定の変更

4.1 受信バッファのサイズ変更
 受信バッファのサイズの初期値は32バイトですが下記のようにして変更できます.
初期値より大きくすることも小さくすることもできます.
 受信バッファのサイズの最小値は 1 です.大きくとれば,それだけRAMを食います.

#define SHRS_BUFFERSIZE 64
#include "shrslib.h"

4.2 ボーレートの変更
 ボーレートの初期値は57,600bps(厳密には28.64M/(15+1)/32=55,938bps)ですが,
下記のようにすると変更できます.(SIO0とSIO1で異なるボーレートを設定可能)

//SIO0/SIO1 を 38400bps(厳密には28.64M/(22+1)/32=38,913bps)にする場合
#define SHRS_BRR0 22
#define SHRS_BRR1 22
#include "shrslib.h"

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


5.関数リファレンス

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


--------------------------------------------------------
int SHRS_Close(int n);
--------------------------------------------------------
説明
 シリアル通信ポートをクローズします.
引数
 n:ポート番号 [0〜1] (SIO0〜SIO1に対応します)
戻り値
 0 正常終了(クローズできた)
 1 エラー(ポートがオープンされていない)
使用例
 SHRS_Close(1);


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


--------------------------------------------------------
int SHRS_Send(int n, unsigned char *buf, int size);
--------------------------------------------------------
説明
 データの送信を行います.
 すべてのデータを送信し終わるまで制御は戻ってきません.
引数
 n:ポート番号 [0〜1] (SIO0〜SIO1に対応します)
 buf:送信データが格納されている領域の先頭アドレス(ポインタ)
 size:送信データのサイズ(単位:バイト)
戻り値
 送信したデータのバイト数(単位:バイト)
 (オープンされていないとき,この関数は 0 を返します.)
使用例
 char buf[400];
 SHRS_Send(1,buf,400);


--------------------------------------------------------
int SHRS_Putc(int n, int c);
--------------------------------------------------------
説明
 1バイト送信します.
 データを送信し終わるまで制御は戻ってきません.
引数
 n:ポート番号 [0〜1] (SIO0〜SIO1に対応します)
 c:送信データ(下位8ビットのみ有効)[0〜255] 
戻り値
 送信できたデータ数(単位:バイト)[0 or 1]
 (オープンされていないとき,この関数は 0 を返します.)
使用例
 SHRS_Putc(1, 'A');


--------------------------------------------------------
int SHRS_Puts(int n, unsigned char *s);
--------------------------------------------------------
説明
 文字列を送信します.
 文字列の終端コード(\0)は改行文字(\n)へ変換して送信されます.
 すべてのデータを送信し終わるまで制御は戻ってきません.
引数
 n:ポート番号 [0〜1] (SIO0〜SIO1に対応します)
 s:送信される文字列が格納してある領域の先頭アドレス(ポインタ)
戻り値
 送信できたデータ数(単位:バイト)(最後の改行も含む)
 (オープンされていないとき,この関数は 0 を返します.)
使用例
 char *s="ABC";
 SHRS_Puts(1, s);
 SHRS_Puts(1, "Hello");


--------------------------------------------------------
int SHRS_Printf(int n, char *format [, argument]...);
--------------------------------------------------------
説明
 ※この関数はソース中の/**/を外さないと使えません.
  (注意)この関数を使うとプログラムのサイズが大きくなります.
 書式付き文字列を送信します.
 使える書式は,一般的な printf() と同じです.制御文字や漢字もそのまま送信されます.
 文字列の終端コード(\0)は改行文字(\n)へ変換して送信されます.
 すべてのデータを送信し終わるまで制御は戻ってきません.
引数
 n:ポート番号 [0〜1] (SIO0〜SIO1に対応します)
 format:書式付き文字列へのポインタ
 argument...:引数(必要に応じて)
戻り値
 送信できたデータ数(単位:バイト)(最後の改行も含む)
 (オープンされていないとき,この関数は 0 を返します.)
使用例
 SHRS_Printf(1, "a=%03d",a);


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


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


--------------------------------------------------------
int SHRS_CheckRecv(int n);
--------------------------------------------------------
説明
 受信バッファにたまっているデータの数(単位:バイト)を返します.
 受信バッファのサイズより大きな値を返すことはありません.
引数
 n:ポート番号 [0〜1] (SIO0〜SIO1に対応します)
戻り値
 受信バッファ内のデータ数(単位:バイト)
使用例
 int n;
 char buf[32];
 n=SHRS_CheckRecv(1);
 SHRS_Recv(1,buf,n);


--------------------------------------------------------
int SHRS_ClearRecv(int n);
--------------------------------------------------------
説明
 受信バッファをクリアします.
引数
 n:ポート番号 [0〜1] (SIO0〜SIO1に対応します)
戻り値
 0 正常終了
 1 エラー(オープンされていない)
使用例
 SHRS_ClearRecv(1);


--------------------------------------------------------
int SHRS_Getc(int n);
--------------------------------------------------------
説明
 1バイト受信し,その値を返します.
 もしバッファにデータがない等の理由で受信できなかった場合は-1を返します.
引数
 n:ポート番号 [0〜1] (SIO0〜SIO1に対応します)
戻り値
 受信データ[0〜255]または-1
使用例
 int c;
 c=SHRS_Getc(1);
 if (c<0) ...


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


以上

もしバグ等があれば作者まで連絡して下さい.お待ちしています.
またこの説明書にもミスがあるかもしれませんが,あしからず.


ダウンロード

 shrslib.h ファイル shrslib.h がLZH圧縮してあります.


1つ上へ戻る