RXRSLIB 1.1
easy RX63N RS-232C LIBrary by I.N. 2018/09/04


更新履歴
2018/09/04 e2studioで使う場合の説明を追加
2017/11/30 #define RXRS_SENDBUFFERSIZEnの記述で不要なVを削除
2015/12/04 analogWrite()に関する問題と対策を追記
2014/12/10 ver.1.1 非送信時(TE=0)にTXD出力がハイインピーダンスになっていた点を修正
2014/12/03 ver.1.0 初版


1.はじめに

 マイコンボード GR-SAKURA + 開発環境(RXduinoまたはWebコンパイラまたはe2studio) で
RS-232Cシリアル通信プログラムを作成するための関数ライブラリです.

 動作確認は,PC側に秋月電子のAE-FT234Xを用いました.
また,開発環境はrxduino-free-v120csとWebコンパイラ(v1.08)とe2studio(v.5.4.0)で確認しました.

なお,開発環境に元からあるシリアル関数(Serial)は使えなくなります.


2.特長

 GR-SAKURAボードでシリアル通信ポートを最大8チャンネル(SCI 0,1,2,3,5,6,8,12)まで使えます.
 11719〜3M[bps](BRR値=255〜0)までのボーレートに対応します.
 偶数/奇数パリティ,ストップビット,データ長の選択ができます.
 送信/受信バッファのサイズ変更(デフォルトは32)ができます.
 チャンネル0と2では使用するI/Oポートを2箇所から選択できます.

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

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


3.使用方法とサンプル

3.1 使用方法
3.1.1 RXduinoまたはWebコンパイラの場合

 開発環境の準備が済んだら,割り込みベクタ記述ファイル intvect.c を開き,
以下のように114番および214〜252番の関数名を書き換えてください.
また,RXRSLIBが使用する割り込み関数のプロトタイプ宣言を追記して下さい.
これらを忘れるとコンパイルでエラーが出なくても,データの送受信はできません.
ただし,使わないSCIチャンネルについては,書き換えを省略しても構いません.

まず,RX63N用の114番を書き換えます.(intvect.cの1013行あたり)
        RXRS_SCI_ERI,   //--- for RXRSLIB
        /*
        Excep_GROUP_L0,     
        */

次に,RX63N用の214〜252番を書き換えます.(intvect.cの1113行〜1151行あたり)
        /*
        Excep_SCI0_RXI0,     
        Excep_SCI0_TXI0,     
        Excep_SCI0_TEI0,     
        Excep_SCI1_RXI1,     
        Excep_SCI1_TXI1,     
        Excep_SCI1_TEI1,     
        Excep_SCI2_RXI2,     
        Excep_SCI2_TXI2,     
        Excep_SCI2_TEI2,     
        Excep_SCI3_RXI3,     
        Excep_SCI3_TXI3,     
        Excep_SCI3_TEI3,     
        */
        RXRS_SCI0_RXI0, //--- for RXRSLIB
        RXRS_SCI0_TXI0,     
        RXRS_SCI0_TEI0,     
        RXRS_SCI1_RXI1, //--- for RXRSLIB
        RXRS_SCI1_TXI1,     
        RXRS_SCI1_TEI1,     
        RXRS_SCI2_RXI2, //--- for RXRSLIB
        RXRS_SCI2_TXI2,     
        RXRS_SCI2_TEI2,     
        RXRS_SCI3_RXI3, //--- for RXRSLIB
        RXRS_SCI3_TXI3,     
        RXRS_SCI3_TEI3,     

        Excep_SCI4_RXI4,     
        Excep_SCI4_TXI4,     
        Excep_SCI4_TEI4,     

        /*      
        Excep_SCI5_RXI5,     
        Excep_SCI5_TXI5,     
        Excep_SCI5_TEI5,     
        Excep_SCI6_RXI6,     
        Excep_SCI6_TXI6,     
        Excep_SCI6_TEI6,     
        */
        RXRS_SCI5_RXI5, //--- for RXRSLIB
        RXRS_SCI5_TXI5,     
        RXRS_SCI5_TEI5,     
        RXRS_SCI6_RXI6, //--- for RXRSLIB
        RXRS_SCI6_TXI6,     
        RXRS_SCI6_TEI6,     

        Excep_SCI7_RXI7,     
        Excep_SCI7_TXI7,     
        Excep_SCI7_TEI7,     

        /*
        Excep_SCI8_RXI8,     
        Excep_SCI8_TXI8,     
        Excep_SCI8_TEI8,     
        */
        RXRS_SCI8_RXI8, //--- for RXRSLIB
        RXRS_SCI8_TXI8,     
        RXRS_SCI8_TEI8,     

        Excep_SCI9_RXI9,     
        Excep_SCI9_TXI9,     
        Excep_SCI9_TEI9,     
        Excep_SCI10_RXI10,   
        Excep_SCI10_TXI10,   
        Excep_SCI10_TEI10,   
        Excep_SCI11_RXI11,   
        Excep_SCI11_TXI11,   
        Excep_SCI11_TEI11,
        
        /*
        Excep_SCI12_RXI12,   
        Excep_SCI12_TXI12,   
        Excep_SCI12_TEI12,   
        */
        RXRS_SCI12_RXI12,       //--- for RXRSLIB
        RXRS_SCI12_TXI12,     
        RXRS_SCI12_TEI12,     

さらに,同じ intvect.c において,#include "intvect.h"の下(28行)あたりに次のプロトタイプ宣言を追加します.
void __attribute__ ((interrupt)) RXRS_SCI_ERI(void);

void __attribute__ ((interrupt)) RXRS_SCI0_RXI0(void);
void __attribute__ ((interrupt)) RXRS_SCI0_TXI0(void);
void __attribute__ ((interrupt)) RXRS_SCI0_TEI0(void);

void __attribute__ ((interrupt)) RXRS_SCI1_RXI1(void);
void __attribute__ ((interrupt)) RXRS_SCI1_TXI1(void);
void __attribute__ ((interrupt)) RXRS_SCI1_TEI1(void);

void __attribute__ ((interrupt)) RXRS_SCI2_RXI2(void);
void __attribute__ ((interrupt)) RXRS_SCI2_TXI2(void);
void __attribute__ ((interrupt)) RXRS_SCI2_TEI2(void);

void __attribute__ ((interrupt)) RXRS_SCI3_RXI3(void);
void __attribute__ ((interrupt)) RXRS_SCI3_TXI3(void);
void __attribute__ ((interrupt)) RXRS_SCI3_TEI3(void);

void __attribute__ ((interrupt)) RXRS_SCI5_RXI5(void);
void __attribute__ ((interrupt)) RXRS_SCI5_TXI5(void);
void __attribute__ ((interrupt)) RXRS_SCI5_TEI5(void);

void __attribute__ ((interrupt)) RXRS_SCI6_RXI6(void);
void __attribute__ ((interrupt)) RXRS_SCI6_TXI6(void);
void __attribute__ ((interrupt)) RXRS_SCI6_TEI6(void);

void __attribute__ ((interrupt)) RXRS_SCI8_RXI8(void);
void __attribute__ ((interrupt)) RXRS_SCI8_TXI8(void);
void __attribute__ ((interrupt)) RXRS_SCI8_TEI8(void);

void __attribute__ ((interrupt)) RXRS_SCI12_RXI12(void);
void __attribute__ ((interrupt)) RXRS_SCI12_TXI12(void);
void __attribute__ ((interrupt)) RXRS_SCI12_TEI12(void);

 あとは自分のソースファイルで次のようにインクルードするだけです.
(rxrslib.h は適切なディレクトリに事前に置いて,インクルードできるようにしてください)
#include "rxrslib.h"

3.1.2 e2studioの場合
 開発環境の準備とGR-SAKURA用プロジェクトのインポートが済んだら,
割り込みベクタ記述ファイル vector_table.c を開き,
以下のように割り込みベクタの関数名を書き換えてください.
また,RXRSLIBが使用する割り込み関数のプロトタイプ宣言を追記して下さい.
これらを忘れるとコンパイルでエラーが出なくても,データの送受信ができません.
ただし,使わないSCIチャンネルについては,書き換えを省略しても構いません.

まず,共通の割り込みベクタ ICU GROUP12 を書き換えます.(vector_table.cの334行あたり)
//;0x1C8    ICU GROUP12
    //(fp)INT_Excep_ICU_GROUP12,
    (fp)RXRS_SCI_ERI,

次に,チャンネルごとに割り込みベクタ(SCIn_RXIn,SCIn_TXIn,SCIn_TEIn)を書き換えます.
(n には使用するSCIのチャンネル番号が入ります.[0〜3, 5, 6, 8, 12]のいずれか.)
(SCI0はvector_table.cの564行あたり)
下記はSCI0(n=0)の例です.複数のチャンネルを使用する場合は,該当する箇所を
すべて修正します.
//;0x0358 SCI0_RXI0
    //(fp)INT_Excep_SCI0_RXI0,
    (fp)RXRS_SCI0_RXI0,
//;0x035C SCI0_TXI0
    //(fp)INT_Excep_SCI0_TXI0,
    (fp)RXRS_SCI0_TXI0,
//;0x0360 SCI0_TEI0
    //(fp)INT_Excep_SCI0_TEI0,
    (fp)RXRS_SCI0_TEI0, 

さらに,同じ vector_table.c において,#include "interrupt_handlers.h"の下(21行)あたりに次のプロトタイプ宣言を追加します.
void __attribute__ ((interrupt)) RXRS_SCI_ERI(void);

void __attribute__ ((interrupt)) RXRS_SCI0_RXI0(void);
void __attribute__ ((interrupt)) RXRS_SCI0_TXI0(void);
void __attribute__ ((interrupt)) RXRS_SCI0_TEI0(void);

void __attribute__ ((interrupt)) RXRS_SCI1_RXI1(void);
void __attribute__ ((interrupt)) RXRS_SCI1_TXI1(void);
void __attribute__ ((interrupt)) RXRS_SCI1_TEI1(void);

void __attribute__ ((interrupt)) RXRS_SCI2_RXI2(void);
void __attribute__ ((interrupt)) RXRS_SCI2_TXI2(void);
void __attribute__ ((interrupt)) RXRS_SCI2_TEI2(void);

void __attribute__ ((interrupt)) RXRS_SCI3_RXI3(void);
void __attribute__ ((interrupt)) RXRS_SCI3_TXI3(void);
void __attribute__ ((interrupt)) RXRS_SCI3_TEI3(void);

void __attribute__ ((interrupt)) RXRS_SCI5_RXI5(void);
void __attribute__ ((interrupt)) RXRS_SCI5_TXI5(void);
void __attribute__ ((interrupt)) RXRS_SCI5_TEI5(void);

void __attribute__ ((interrupt)) RXRS_SCI6_RXI6(void);
void __attribute__ ((interrupt)) RXRS_SCI6_TXI6(void);
void __attribute__ ((interrupt)) RXRS_SCI6_TEI6(void);

void __attribute__ ((interrupt)) RXRS_SCI8_RXI8(void);
void __attribute__ ((interrupt)) RXRS_SCI8_TXI8(void);
void __attribute__ ((interrupt)) RXRS_SCI8_TEI8(void);

void __attribute__ ((interrupt)) RXRS_SCI12_RXI12(void);
void __attribute__ ((interrupt)) RXRS_SCI12_TXI12(void);
void __attribute__ ((interrupt)) RXRS_SCI12_TEI12(void);

あと,e2studio用プロジェクト(sakura_sketch_V220.zip)をインポートした場合,
ファイル /rx63n/iodefine.hを開いて,次の箇所のコメントを外します.
・8408行目あたり
//comment disabled
        struct {
            unsigned char MPBT:1;
            unsigned char MPB:1;
            unsigned char TEND:1;
            unsigned char PER:1;
            unsigned char FER:1;
            unsigned char ORER:1;
            unsigned char :2;
        } BIT;
・8544行目あたり
//comment disabled
        struct {
            unsigned char MPBT:1;
            unsigned char MPB:1;
            unsigned char TEND:1;
            unsigned char PER:1;
            unsigned char FER:1;
            unsigned char ORER:1;
            unsigned char :2;
        } BIT;

 あとは自分のソースファイルで次のようにインクルードするだけです.
(rxrslib.h は適切なディレクトリに事前に置いて,インクルードできるようにしてください)
#include "rxrslib.h"

3.2 サンプルプログラム
 SCI0を使用します.(ncomの値)
 ボーレート設定は 230769 (約230400) bpsです.(BRR値は12)
 使用I/Oピンは,送信がIO1(PIN_P20),受信がIO0(PIN_P21)です.
 200ms毎に5桁の数値+改行を送信します.
 200ms毎にLED点滅もあります.
 外部からの何か受信があれば,それをそのまま送り返します.
 青ボタンを押すと文字列"Blue button"+改行 を送信します.
#include <rxduino.h>
// e2studioの場合は #include <Arduino.h>

#include "rxrslib.h"

int ncom=0;

void setup() {
    pinMode(PIN_SW,INPUT);          //青ボタン使用
    pinMode(PIN_LED0,OUTPUT);       //LED0使用

    RXRS_Open(ncom,12);   //brr=12 -> 230769.2 bps
}

int n,led,t0;

void loop() {
    if(millis()-t0 >= 200){
        while(RXRS_CheckSend(ncom)<7);
        RXRS_Printf(ncom,"%05d\r\n",n++);

        t0= millis();
        digitalWrite(PIN_LED0, led);
        led=1-led;
    }

    //青ボタン処理
    if(!digitalRead(PIN_SW)){
        while(RXRS_CheckSend(ncom)<13);
        RXRS_Puts(ncom,"Blue button");
    }

    //受信処理
    while(RXRS_CheckRecv(ncom)){
        int c;
        c= RXRS_Getc(ncom);
        RXRS_Putc(ncom,c);
    }
}

3.3 SAKURAライブラリと併用する場合の問題と対策
 ・analogWrite()がなぜか正常に機能しなくなる現象が報告されています.
  この場合,RXRS_Open()より前に一度,analogWrite()を呼び出しておくと解決されます.


4.設定の変更

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

 以下の中から必要なものを #include "rxrslib.h"より前に記述します.
いずれにおいても,n にはSCIのチャンネル番号(0〜3, 5, 6, 8, 12)が入ります.
また,size にはバッファサイズ(単位:バイト)を記述します.

受信バッファのサイズ変更:
#define RXRS_RECVBUFFERSIZEn size
送信バッファのサイズ変更:
#define RXRS_SENDBUFFERSIZEn size

4.2 ボーレートの指定
 ボーレート(通信速度)の指定は,RXRS_Open()の第2引数で行います.
SCIのチャンネル毎に異なる値を設定できます.
主なBRR値とボーレートの関係は以下のとおりです.
brr ->ボーレート[bps]
  0 ->3000000.0 [bps]
  1 ->1500000.0 [bps]
  2 ->1000000.0 [bps]
  3 -> 750000.0 [bps]
  4 -> 600000.0 [bps]
  5 -> 500000.0 [bps]
  6 -> 428571.4 [bps]
  7 -> 375000.0 [bps]
  8 -> 333333.3 [bps]
  9 -> 300000.0 [bps]
 10 -> 272727.3 [bps]
 11 -> 250000.0 [bps]
 12 -> 230769.2 [bps]
 25 -> 115384.6 [bps]
 51 ->  57692.3 [bps]
 77 ->  38461.5 [bps]
 95 ->  31250.0 [bps]
155 ->  19230.8 [bps]

また,brr値からボーレートへの換算は次式となります.

 baudrate = 48M/(16*(brr+1)) [bps]

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

4.3 パリティ,ストップビット,データ長の変更
 デフォルトでは,スタートビット1bit,ストップビット1bit,パリティなし,データ長8bit,XON/XOFFなしです.
このうち,パリティ,ストップビット,データ長については変更できます.
以下の中から必要なものを #include "rxrslib.h"より前に記述します.
いずれにおいても,n にはSCIのチャンネル番号(0〜3, 5, 6, 8, 12)が入ります.
偶数パリティ:
#define SCIn_PARITY_EVEN
奇数パリティ:
#define SCIn_PARITY_ODD
ストップビット2:
#define SCIn_STOP_2
データ長7ビット:
#define SCIn_DATA_7

4.4 使用ポートの変更
 デフォルトでは,SCIの各チャンネルは次のポートを使用します.
SCI0:  P21(IO0)  =RXD, P20(IO1)  =TXD
SCI1:  P30(CN6-6)=RXD, P26(CN6-3)=TXD ※
SCI2:  P12(IO30) =RXD, P13(IO31) =TXD
SCI3:  P25(IO5)  =RXD, P23(IO3)  =TXD
SCI5:  PC2(IO8)  =RXD, PC3(IO9)  =TXD
SCI6:  P33(IO7)  =RXD, P32(IO6)  =TXD
SCI8:  PC6(IO11) =RXD, PC7(IO12) =TXD
SCI12: PE2(IO46) =RXD, PE1(IO45) =TXD

※SCI1で使うP30, P26の位置を下図に示します.


このうち,SCI0とSCI2においては,次のポートへ変更できます.
以下の中から必要なものを#include "rxrslib.h"より前に記述します.

// SCI0で P33(IO7)=RXD, P32(IO6)=TXDを使うとき
#define SCI0_RXDTXD_P33P32

// SCI2で P52(IO26)=RXD, P50(IO24)=TXDを使うとき
#define SCI2_RXDTXD_P52P50


5.関数リファレンス

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

--------------------------------------------------------
int RXRS_Open(int n, int brr)
--------------------------------------------------------
説明
 シリアル通信(SCI)のチャンネルを開始します.最初に必要です.
 通信設定は,スタートビット1bit,ストップビット1bit,パリティなし,データ長8bit,XON/XOFFなしです.
 ボーレートは第2引数にbrr値で指定します.
 正常終了した後,RXRSLIB の各関数が使用可能となります.
引数
 n:チャンネル番号 [0〜3, 5, 6, 8, 12]
 brr:ボーレートに対応するBRR値 [0〜255] ※4.2を参照
戻り値
 0 正常終了(オープンできた)
 1 エラー(すでにオープンされている)
使用例
 RXRS_Open(0, 25);
 RXRS_Open(8, 12);


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

--------------------------------------------------------
int RXRS_CheckSend(int n);
--------------------------------------------------------
説明
 送信バッファの空きサイズをバイト単位で返します.
 データを送信するときは,この関数でバッファの空きを確認してから
 送信するようにすると,データの送信洩れがありません.
 送信バッファのサイズより大きな値を返すことはありません.
引数
 n:チャンネル番号 [0〜3, 5, 6, 8, 12]
戻り値
 送信バッファの空きサイズ(単位:バイト)
使用例
 int n;
 char buf[32];
 while(RXRS_CheckSend(1)<n);
 RXRS_Send(1,buf,n);


--------------------------------------------------------
int RXRS_ClearSend(int n);
--------------------------------------------------------
説明
 送信バッファをクリアします.
 バッファに残っている全データの送信完了を待ってから制御が戻ってきます.
引数
 n:チャンネル番号 [0〜3, 5, 6, 8, 12]
戻り値
 0 正常終了
 1 エラー(オープンされていない)
使用例
 RXRS_ClearSend(1);


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


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


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


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


--------------------------------------------------------
int RXRS_Printf(int n, const char *format [, argument]...);
--------------------------------------------------------
説明
 書式付き文字列を送信します.
 使える書式は,一般的な printf() と同じです.制御文字や漢字もそのまま送信されます.
 文字列の終端コード(\0)は送信されません.
 送信バッファへデータの格納が終わると制御はすぐに戻ってきます.
 (実際のデータ送信はただちに実行されますが,送信バッファが空でない場合,
  バッファにたまっているデータの送信が優先されます)
 送信バッファからあふれたデータは無視(破棄)されます.
 <補足>
 一回に送信できる最大文字数は256バイトです.この上限を変更するには
 #define RXRS_PRINTF_BUFFERSIZE 1024(←1024バイトに変更する例) を
 #include "rxrslib.h"より前に記述してください.
引数
 n:チャンネル番号 [0〜3, 5, 6, 8, 12]
 format:書式付き文字列へのポインタ
 argument...:引数(必要に応じて)
戻り値
 送信バッファへ格納されたデータのバイト数(単位:バイト)
 (オープンされていないとき,この関数は 0 を返します.)
使用例
 int a=100;
 RXRS_Printf(0, "a=%d\r\n",a);


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

--------------------------------------------------------
int RXRS_CheckRecv(int n);
--------------------------------------------------------
説明
 受信バッファにたまっているデータの数を返します.
 受信バッファのサイズより大きな値を返すことはありません.
引数
 n:チャンネル番号 [0〜3, 5, 6, 8, 12]
戻り値
 受信バッファ内のデータ数(単位:バイト)
 (オープンされていないとき,この関数は 0 を返します.)
使用例
 int n;
 char buf[32];
 n=RXRS_CheckRecv(6);
 RXRS_Recv(6,buf,n);


--------------------------------------------------------
int RXRS_ClearRecv(int n);
--------------------------------------------------------
説明
 受信バッファをクリアします.
 受信バッファにたまっている読み出し前のデータはすべて破棄されます.
引数
 n:チャンネル番号 [0〜3, 5, 6, 8, 12]
戻り値
 0 正常終了
 1 エラー(オープンされていない)
使用例
 RXRS_ClearRecv(6);


--------------------------------------------------------
int RXRS_Recv(int n, char *buf, int size);
--------------------------------------------------------
説明
 データの受信を行います.
 (正確には,受信バッファからbufへデータを移動させます.)
<補足>
 指定されたデータ数よりも受信バッファのデータ数が少ない場合,
 受信バッファ内のデータがなくなった時点で制御が戻ってきます.
 指定された数のデータが来るまで待つことはしませんので,
 事前にRXRS_CheckRecv()で受信バッファ内のデータ数を確認しておいてください.
引数
 n:チャンネル番号 [0〜3, 5, 6, 8, 12]
 buf:受信データを格納する領域の先頭アドレス(ポインタ)
 size:読み込みたいデータ数(単位:バイト)
戻り値
 実際に読み込めたデータ数(単位:バイト)
 (オープンされていないとき,この関数は 0 を返します.)
使用例
 char buf[32];
 int n;
 n=RXRS_Recv(1,buf,32);


--------------------------------------------------------
int RXRS_Getc(int n);
--------------------------------------------------------
説明
 1バイト受信し,その値を返します.
 もし受信バッファにデータがない等の理由で受信できなかった場合は-1を返します.
引数
 n:チャンネル番号 [0〜3, 5, 6, 8, 12]
戻り値
 受信データ[0〜255]または-1
使用例
 int c;
 c=RXRS_Getc(1);
 if (c<0) ...


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


6.宣言文の使用例
 デフォルト設定を変更する(オプションの)宣言文が色々出てきたので,以下にまとめも兼ねて
使用例を書いておきます.
#define RXRS_RECVBUFFERSIZE0  50
#define RXRS_RECVBUFFERSIZE1  40
#define RXRS_RECVBUFFERSIZE12 30

#define RXRS_SENDBUFFERSIZE2  30
#define RXRS_SENDBUFFERSIZE3  40
#define RXRS_SENDBUFFERSIZE8  50

#define SCI0_PARITY_EVEN
#define SCI0_STOP_2
#define SCI0_DATA_7

#define SCI1_PARITY_ODD

#define SCI0_RXDTXD_P33P32
#define SCI2_RXDTXD_P52P50

#define RXRS_PRINTF_BUFFERSIZE 512

#include "rxrslib.h"


ダウンロード

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



1つ上へ戻る