SH7125RSLIB 1.1
easy SH2-7125F RS-232C LIBrary by I.N. 2008/7/24
更新履歴
2008/07/22 ver.1.0 初版
2008/07/24 ver.1.1 SCI0/1/2に異なるバッファサイズ指定可,使用ポートを細かく指定可
1.はじめに
CPUボード SH2/7125F + 開発環境 HEW でRS-232Cシリアル通信プログラムを作成する
ための関数ライブラリです.
動作確認は 秋月SH7125F + HEW4.0 で行いました.
2.特長
リングバッファ構造の受信バッファがあり,受信割り込みによって受信データは
バックグラウンドで自動的に格納されます.
受信データが来る瞬間にメインプログラムで他の作業を実行していてもデータを
取りこぼすことがありません.
ただし,受信バッファが一杯になった後に受信したデータはすべて無視(破棄)
されますので,受信バッファが一杯になる前にデータを読み出すようにしてください.
送信については,送信バッファはなく,送信関数ではすべてのデータを送信し
終わるまで制御は返ってきません.
3.使用方法とサンプル
3.1 使用方法
HEWでプロジェクトを作成したら,まず,割り込みベクタ記述ファイル intprg.c を開き,
次のように216〜227番の関数名を書き換えてください.これを忘れるとデータの受信が
できません.
// 216 SCI0 ERI0
void INT_SCI0_ERI0(void){SHRS_recv_ir0();}
// 217 SCI0 RXI0
void INT_SCI0_RXI0(void){SHRS_recv_ir0();}
// 218 SCI0 TXI0
void INT_SCI0_TXI0(void){SHRS_dummy_ir();}
// 219 SCI0 TEI0
void INT_SCI0_TEI0(void){SHRS_dummy_ir();}
// 220 SCI1 ERI1
void INT_SCI1_ERI1(void){SHRS_recv_ir1();}
// 221 SCI1 RXI1
void INT_SCI1_RXI1(void){SHRS_recv_ir1();}
// 222 SCI1 TXI1
void INT_SCI1_TXI1(void){SHRS_dummy_ir();}
// 223 SCI1 TEI1
void INT_SCI1_TEI1(void){SHRS_dummy_ir();}
// 224 SCI2 ERI2
void INT_SCI2_ERI2(void){SHRS_recv_ir2();}
// 225 SCI2 RXI2
void INT_SCI2_RXI2(void){SHRS_recv_ir2();}
// 226 SCI2 TXI2
void INT_SCI2_TXI2(void){SHRS_dummy_ir();}
// 227 SCI2 TEI2
void INT_SCI2_TEI2(void){SHRS_dummy_ir();}
あとはソースファイルの先頭で以下のようにインクルードするだけです.
#include "iodefine.h"
#include "sh7125rslib.h"
3.2 サンプル
受信した文字をそのまま送り返すプログラム
#include "iodefine.h"
#include "sh7125rslib.h"
int main(void)
{
char buf[32];
int n;
SHRS_Open(1);
SHRS_Sends(1,"Hello!\r\n");
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を食います.
SCIの各チャンネルごとに異なるバッファサイズを指定できます.
#define SHRS_BUFFERSIZE0 64
#define SHRS_BUFFERSIZE1 500
#define SHRS_BUFFERSIZE2 20
#include "sh7125rslib.h"
4.2 ボーレートの変更
ボーレート(通信速度)のデフォルト値は38,400 bps(厳密には39062.5 bps)ですが,
下記のようにして変更できます.SCIの各チャンネルごとに異なるボーレートを設定できます.
//SCI0/SCI1/SCI2 をすべて 9600 bpsにする場合
#define SHRS_BRR0 80
#define SHRS_BRR1 80
#define SHRS_BRR2 80
#include "sh7125rslib.h"
なお,CPUのクロックPφ=25.0MHz(12.5MHz X'tal)の場合,BRR値は次のようになります.
6 => 111607.1[bps] (115200に対し-3.12%)
13 => 55803.6[bps] (57600に対し-3.12%)
19 => 39062.5[bps] (38400に対し+1.73%)
24 => 31250.0[bps] (31250に対し 0.00%)
40 => 19054.9[bps] (19200に対し-0.76%)
80 => 9645.1[bps] (9600に対し+0.47%)
4.3 使用するポートの変更
デフォルトでは,SCI0にはRXD0=PA0, TXD0=PA1,SCI1にはRXD1=PA3, TXD1=PA4を
使う設定になっています.これ以外のポートを使うには以下の宣言文の中から必要なものを
#include "sh7125rslib.h" より前に記述します.
SCI2にはRXD2=PA8, TXD2=PA9以外の選択肢はありません.
・次の2つのうちいずれか一方
#define SHRS_RXD0_PA10
#define SHRS_RXD0_PE1
・次の2つのうちいずれか一方
#define SHRS_TXD0_PA11
#define SHRS_TXD0_PE2
・次の2つのうちいずれか一方
#define SHRS_RXD1_PA14
#define SHRS_RXD1_PE4
・次の2つのうちいずれか一方
#define SHRS_TXD1_PA15
#define SHRS_TXD1_PE5
5.関数リファレンス
--------------------------------------------------------
int SHRS_Open(int n);
--------------------------------------------------------
説明
シリアル通信(RS-232C)のポートをオープンします.最初に必要です.
通信設定は,ボーレート38400bps,スタートビット1bit,ストップビット1bit,パリティなし,
キャラクタ長8bit,XON/XOFFなしです.
オープンに成功すると,SHRS_Close() でクローズするまで SH7125RSLIB の各関数が使用可能となります.
引数
n:ポート番号 [0〜2] (SCI0〜SCI2に対応します)
戻り値
0 正常終了(オープンできた)
1 エラー(すでにオープンされている)
使用例
SHRS_Open(1);
--------------------------------------------------------
int SHRS_Close(int n);
--------------------------------------------------------
説明
シリアル通信ポートをクローズします.
引数
n:ポート番号 [0〜2] (SCI0〜SCI2に対応します)
戻り値
0 正常終了(クローズできた)
1 エラー(ポートがオープンされていない)
使用例
SHRS_Close(1);
================送信に関わるもの================
--------------------------------------------------------
int SHRS_Send(int n, char *buf, int size);
--------------------------------------------------------
説明
データの送信を行います.
すべてのデータを送信し終わるまで制御は戻ってきません.
引数
n:ポート番号 [0〜2] (SCI0〜SCI2に対応します)
buf:送信データが格納されている領域の先頭アドレス(ポインタ)
size:送信データのサイズ(単位:バイト)
戻り値
送信したデータのバイト数(単位:バイト)
(オープンされていないとき,この関数は
0 を返します.)
使用例
char buf[32];
SHRS_Send(1,buf,32);
--------------------------------------------------------
int SHRS_Putc(int n, int c);
--------------------------------------------------------
説明
1バイト送信します.
データを送信し終わるまで制御は戻ってきません.
引数
n:ポート番号 [0〜2] (SCI0〜SCI2に対応します)
c:送信データ(下位8ビットのみ有効)[0〜255]
戻り値
送信できたデータ数(単位:バイト)[0 or
1]
(オープンされていないとき,この関数は
0 を返します.)
使用例
SHRS_Putc(1, 'A');
--------------------------------------------------------
int SHRS_Puts(int n, char *s);
--------------------------------------------------------
説明
文字列を送信します.
文字列の終端コード(\0)は改行文字(\n)へ変換して送信されます.
すべてのデータを送信し終わるまで制御は戻ってきません.
引数
n:ポート番号 [0〜2] (SCI0〜SCI2に対応します)
s:送信される文字列が格納してある領域の先頭アドレス(ポインタ)
戻り値
送信できたデータ数(単位:バイト)(最後の改行も含む)
(オープンされていないとき,この関数は
0 を返します.)
使用例
char *s="ABC";
SHRS_Puts(1, s);
SHRS_Puts(1, "Hello");
--------------------------------------------------------
int SHRS_Sends(int n, char *s);
--------------------------------------------------------
説明
文字列を送信します.
文字列の終端コード(\0)の直前文字までを送信し,終端コードは送信しません.
すべてのデータを送信し終わるまで制御は戻ってきません.
引数
n:ポート番号 [0〜2] (SCI0〜SCI2に対応します)
s:送信される文字列が格納してある領域の先頭アドレス(ポインタ)
戻り値
送信できたデータ数(単位:バイト)(最後の改行も含む)
(オープンされていないとき,この関数は
0 を返します.)
使用例
char *s="ABC";
SHRS_Sends(1, s);
SHRS_Sends(1, "Hello\r\n");
--------------------------------------------------------
int SHRS_Printf(int n, char *format [, argument]...);
--------------------------------------------------------
説明
※この関数は#include "sh7125rslib.h"より前に #define SHRS_USE_PRINTF を
書かないと使えません.
(注意)この関数を使うとプログラムのサイズが大きくなります.
書式付き文字列を送信します.
使える書式は,一般的な printf() と同じです.制御文字や漢字もそのまま送信されます.
文字列の終端コード(\0)は改行文字(\n)へ変換して送信されます.
すべてのデータを送信し終わるまで制御は戻ってきません.
<補足>
一回に送信できる文字数は256バイトです.このデフォルト値を変更するには
#define SHRS_PRINTF_BUFFERSIZE 1024(←1024バイトに変更する例) を
#include "sh7125rslib.h"より前に記述してください.
引数
n:ポート番号 [0〜2] (SCI0〜SCI2に対応します)
format:書式付き文字列へのポインタ
argument...:引数(必要に応じて)
戻り値
送信できたデータ数(単位:バイト)(最後の改行も含む)
(オープンされていないとき,この関数は
0 を返します.)
使用例
SHRS_Printf(1, "a=%03d",a);
================受信に関わるもの================
--------------------------------------------------------
int SHRS_Recv(int n, char *buf, int size);
--------------------------------------------------------
説明
データの受信を行います.
(注意)
指定されたデータ数よりも受信バッファのデータ数が少ない場合,
バッファ内のデータがなくなった時点で制御が戻ってきます.
指定された数のデータが来るまで待つことはしません.
この関数は実際に読み込んだデータの数を返します.
引数
n:ポート番号 [0〜2] (SCI0〜SCI2に対応します)
buf:受信データを格納する領域の先頭アドレス(ポインタ)
size:受信データ数(単位:バイト)
戻り値
受信できたデータ数(単位:バイト)
(オープンされていないとき,この関数は
0 を返します.)
使用例
char buf[32];
int n;
n=SHRS_Recv(1,buf,32);
--------------------------------------------------------
int SHRS_CheckRecv(int n);
--------------------------------------------------------
説明
受信バッファにたまっているデータの数(単位:バイト)を返します.
受信バッファのサイズより大きな値を返すことはありません.
引数
n:ポート番号 [0〜2] (SCI0〜SCI2に対応します)
戻り値
受信バッファ内のデータ数(単位:バイト)
使用例
int n;
char buf[32];
n=SHRS_CheckRecv(1);
SHRS_Recv(1,buf,n);
--------------------------------------------------------
int SHRS_ClearRecv(int n);
--------------------------------------------------------
説明
受信バッファをクリアします.
引数
n:ポート番号 [0〜2] (SCI0〜SCI2に対応します)
戻り値
0 正常終了
1 エラー(オープンされていない)
使用例
SHRS_ClearRecv(1);
--------------------------------------------------------
int SHRS_Getc(int n);
--------------------------------------------------------
説明
1バイト受信し,その値を返します.
もしバッファにデータがない等の理由で受信できなかった場合は-1を返します.
引数
n:ポート番号 [0〜2] (SCI0〜SCI2に対応します)
戻り値
受信データ[0〜255]または-1
使用例
int c;
c=SHRS_Getc(1);
if (c<0) ...
--------------------------------------------------------
int SHRS_Gets(int n, char *s);
--------------------------------------------------------
説明
文字列を受信します.
最初に改行または終端コード(\r or \n or
\0)が来るまで受信し,
その改行または終端コードは\0に置き換えて格納されます.
最初の改行または終端コードが来るまで制御は戻ってきません.
引数
n:ポート番号 [0〜2] (SCI0〜SCI2に対応します)
s:受信した文字列を格納する領域の先頭アドレス(ポインタ)
格納領域 s のサイズを超える場合もチェックされないので注意してください.
戻り値
受信できた文字列のバイト数(改行または終端コードを含む)
使用例
char buf[100];
SHRS_Gets(1,buf);
6.宣言文の使用例
デフォルト設定を変更する(オプションの)宣言文が色々出てきたので,以下にまとめも兼ねて
使用例を書いておきます.
#include "iodefine.h"
#define SHRS_BRR0 13
#define SHRS_BRR1 6
#define SHRS_BRR2 80
#define SHRS_BUFFERSIZE0 900
#define SHRS_BUFFERSIZE1 910
#define SHRS_BUFFERSIZE2 920
#define SHRS_RXD0_PA10
#define SHRS_TXD0_PA11
//#define SHRS_RXD0_PE1
//#define SHRS_TXD0_PE2
#define SHRS_RXD1_PA14
#define SHRS_TXD1_PA15
//#define SHRS_RXD1_PE4
//#define SHRS_TXD1_PE5
#define SHRS_USE_PRINTF
#define SHRS_PRINTF_BUFFERSIZE 512
#include "sh7125rslib.h"
ダウンロード
sh7125rslib.h (ver.1.1) ファイル sh7125rslib.h がZIP圧縮してあります.
1つ上へ戻る