Easy RS-232C LIBrary
ERSLIB 2.1
"erslib.h" by I.N. 2020/3/12

  目次

1.はじめに
  特長動作環境インストール方法アンインストール方法使用手順

2.説明
  通信速度についてCOMポートの番号についてパリティエラーについてXON/XOFFについて

3.資料
  シリアル通信ポート(D-SUB9ピン)のピン配列シリアル通信ポート(D-SUB25ピン)のピン配列クロスケーブル(1)クロスケーブル(2)クロスケーブル(3)ストレートケーブル電圧波形

4.サンプルプログラム
  Win32 コンソール アプリケーションの例(単純)Win32 コンソール アプリケーションの例(通信テスト用)Windows Mobileでの例(送信と受信)

5.関数リファレンス
  基本関数送信に関するもの受信に関するもの

6.おわりに
  著作権・使用許諾バージョンアップ履歴作者のウェブサイト作者への連絡先開発環境


はじめに

 本製品をお買い上げいただき誠にありがとうございます.(無料です)
 このライブラリ関数を使えば,Windows上あるいはWindows Mobile上で
 動作するシリアル通信(RS-232C)プログラムが誰でも手軽に作れます.


特長

 (1) 最大256ポート(COM1〜COM256)までの同時使用に対応しています.
   (Windows MobileではCOM1:〜COM9:の最大9ポート)
 (2) タイムアウト時間の設定/変更ができます.
 (3) 送受信バッファのチェックができます.
 (4) XON/XOFFフロー制御が使用できます.
 (5) 制御用信号(RS,CS,DR,ER)が使用できます.
 (6) Win32 プロジェクト(コンソール アプリケーションも含む)に対応しています.
 (7) Windows Mobile(Pocket PC)のプログラム開発にも使えます.


動作環境

 OS:Windows 2000/XP/Vista/7/8/8.1/10
    Windows Mobile 2005
 コンパイラ:Visual C++ 2008/2015/2017/2019
        (他のバージョンでもおそらく動作します)


インストール方法

 インストールと言う程のことでもありませんが,ファイル erslib.h を適当なディレクトリに置いて使用してください.
 erslib.h が置いてあるディレクトリへのパスが通っていれば,erslib.h はどこに置いても構いません.
 メインのソースファイルと同じディレクトリに置いて,プログラムの先頭で#inlude "erslib.h"と書くのが簡単な方法です.
 メインのソースファイルとは別のディレクトリに置いて,Visual C++のプロパティマネージャーで設定する方法(下記)もあります.

 Visual C++ 2010以降の場合

方法:
 erslib.h を適当なフォルダに置いておく.先にプロジェクト(下の使用手順を参照)を作成した後,「表示」→「プロパティ マネージャー」→(プロジェクト名)→「Debug | Win32」あるいは「Release | Win32」→「Microsoft.Cpp.Win32.user」をクリックしてダイアログを開く.「共通プロパティ」→「VC++ディレクトリ」→「インクルード ディレクトリ」を編集し,erslib.hを置いたディレクトリを追加する.この方法で追加されたインクルード ディレクトリは,同じ種類(Win32 アプリケーション)の他のプロジェクトを作成した場合にも適用されます.


アンインストール方法

 ファイル erslib.h を削除するだけで,ERSLIBを完全にアンインストールすることができます.


使用手順(Visual C++ 2015の場合)

 Visual C++の初心者は以下の手順に従い,基本的な使い方を理解してください.

(1) Visual C++を起動する.

(2) 「ファイル」→「新規作成」→「プロジェクト」

(3) テンプレートは「Win32 コンソール アプリケーション」または「Win32 プロジェクト」,プロジェクト名は適当に.例 test など.場所も適当に設定する.そして「OK」.
  Visual C++ 2017以降の場合,「Visual C++」→「Windows デスクトップ」→「Windows デスクトップ ウィザード」を選択する.

Windows Mobile用プログラム開発では,プロジェクトの種類:「スマート デバイス」,テンプレート:「Win32 スマート デバイス プロジェクト」を選択します.

(4) Win32 アプリケーション ウィザードが出たら,「アプリケーションの設定」で,「空のプロジェクト」にチェックを入れて,「完了」.
  Visual C++ 2017以降の場合,Windows デスクトップ プロジェクトが出るので,ここで,
  「コンソール アプリケーション(.exe)」または「デスクトップ アプリケーション(.exe)」を選択し,
  「空のプロジェクト」にチェックを入れて,「OK」.


(5) ソリューション エクスプローラのソース ファイルで右クリックするとメニューが出るので,「追加」→「新しい項目」を選ぶ.

(6) 種類は「Visual C++」の「C++ ファイル」を選び,ファイル名に適当な名前を入力する.例 test そして,「追加」.

(7) プログラムを書く.(サンプルプログラムの項を参照してください)

(8) 「ビルド」→「ソリューションのビルド」でコンパイル&リンクする.

(9) 「ビルド」→「デバッグなしで開始」で実行する.そして,動作を確認する.

(10) 「ファイル」→「ソリューションを閉じる」

(11) Visual C++ を終了する.


Visual C++をよく知らない人への注意事項

次回からはVisual C++を起動した後,「ファイル」→「開く」→「プロジェクト/ソリューション」で test.sln (←例)を指定するだけで,前回の作業の続きを行うことができます.

test.cpp (←例)という名前でソースファイルを作成した場合,勝手に test2.cpp(←例)などと名前だけを変更することはできません.test.cpp (←例)の内容は修正してもよいですが,ファイル名は最後まで変更せずにプログラム作成を行ってください.

新規にプログラムを作る場合は,プロジェクトの新規作成[手順(2)]から行ってください.

プログラムを実行したあとは,実行中のプログラムを必ず終了させてください.終了させずにプログラムを修正し,ビルドや実行をすることはできません.


説明

通信速度(ボーレート)について
 通信速度はERS_Open(),ERS_Config(),ERS_BaudRate()により設定あるいは変更できます.パソコンの機種/ハードウェア構成によって設定可能な範囲は異なります.例えば,115200 bpsまでの場合や,もっと高い速度を設定できる場合もあります.
 ERS_Open()やERS_BaudRate()を使用すると,ERS_Config()で用意されていない通信速度に設定できる場合があります.

COMポートの番号について
 通信ポートは,COM1〜COM256 まで指定できますが,パソコンの機種/ハードウェア構成によっては装備されていない場合があります.シリアル通信の拡張カードを増設すると使用できるCOMポートが増えます.
 Pocket PCなどのWindows Mobile搭載機で使用できる通信ポートはCOM1:〜COM9:となります.

パリティエラーについて
 パリティチェックを有効にした場合,パリティエラーがあったときのデータは' '(=0x20,空白文字)に置き換えられます.
 ユーザ側で erslib.h のインクルードより先に ERS_PECHAR を定義することにより,パリティエラーがあったときに置き換える文字を指定することができます.
 (例)パリティエラーがあったときのデータを文字 'A' で置き換える場合
#define ERS_PECHAR 'A'
#include <erslib.h>
 (例)Windows Mobileの場合
#define ERS_PECHAR (L'A')
#include <erslib.h>

XON/XOFFについて
 XON/XOFFを用いたフロー制御を使用する場合,XOFFには文字コードの0x13,XONには文字コードの0x11が使われます.したがって任意のコードを含むようなバイナリデータを送受信することはできません.テキストデータの送受信に限定されます.


資料

シリアル通信ポート(D-SUB9ピン)のピン配列

番号 信号名 I/O 機能(カッコ内はJIS略号)
1 DCD IN Data Carrier Detect 受信キャリア検出 (CD)
2 RxD IN Receive Data シリアル受信データ (RD)
3 TxD OUT Transmit Data シリアル送信データ (SD)
4 DTR OUT Data Terminal Ready 端末レディ (ER)
5 GND   Signal Ground 信号グラウンド (SG)
6 DSR IN Data Set Ready データセットレディ (DR)
7 RTS OUT Request to Send 送信要求 (RS)
8 CTS IN Clear to Send 送信許可 (CS)
9 RI IN Ring Indicator 被呼表示 (CI)


D-SUB9コネクタ形状(オス)


シリアル通信ポート(D-SUB25ピン)のピン配列

番号 信号名 I/O 機能(カッコ内はJIS略号)
1 FG   保安用接地
2 TxD OUT Transmit Data シリアル送信データ (SD)
3 RxD IN Receive Data シリアル受信データ (RD)
4 RTS OUT Request to Send 送信要求 (RS)
5 CTS IN Clear to Send 送信許可 (CS)
6 DSR IN Data Set Ready データセットレディ (DR)
7 GND   Signal Ground 信号グラウンド (SG)
8 DCD IN Data Carrier Detect 受信キャリア検出 (CD)
20 DTR OUT Data Terminal Ready 端末レディ (ER)
22 RI IN Ring Indicator 被呼表示 (CI)


クロスケーブル(1)
 最も単純なクロスケーブルです.
 サンプルプログラムの検証ではこれを使用しました.


クロスケーブル(2)
 制御線を持たない機器との接続に使います.


クロスケーブル(3)
 制御線も使用する場合のクロスケーブルです.


ストレートケーブル
 ストレートケーブルはモデム等の機器と接続する場合に使います.



電圧波形

 RS-232C通信における実際の電圧波形を簡単に(かなり大ざっぱに)説明します.

 ここでは,ボーレート=115200bps,スタートビット=1ビット,ストップビット=1ビット,パリティ=なし,キャラクタ長=8ビット,文字コード=0x43 の場合を例に挙げています.

 パリティありの場合は,最上位ビット(MSB)とストップビットの間にパリティビットが挿入されます.

 パソコンのD-SUB9ピンコネクタには,±5〜15V程度の信号(図のBに相当)が流れています.


 図1 電圧波形を読み取る位置



 図2 各点の電圧波形


サンプルプログラム

Win32 コンソール アプリケーションの例(単純)

 このプログラムは使用方法が簡単であることを分かってもらうための例です.これを実行しても意味はありません.このプログラムではCOM1から受信し,COM2から送信しています.

#include <erslib.h>

void main(void)
{
        char buf[4096];
        int n;
        ERS_Open(1,4800);
        ERS_Open(2,115200);
        n=ERS_CheckRecv(1);
        ERS_Recv(1,buf,n);
        ERS_Send(2,buf,200);
        ERS_CloseAll();
}


Win32 コンソール アプリケーションの例(通信テスト用)

 このプログラムは2つ同時に実行してください.
 1台のPCにCOM1とCOM2が備わっていれば,同一コンピュータ内で2つ実行しても構いません.そのときはCOM1とCOM2をRS-232Cのクロスケーブルで接続します.
 あるいは,異なるコンピュータでそれぞれ1つずつ実行しても構いません.その場合も2台のPCのCOMポートをクロスケーブルが必要です.
 動作確認で使用したクロスケーブルは,D-SUB9ピンの2,3番がクロスし,5番同士が接続された簡単なものです. 

#include <erslib.h>

#define BUFSIZE 5000

void main(void)
{
        char buf[BUFSIZE];
        int n,r;
        int com=0;

        for(;;){
                printf("0:Open\n");
                printf("1:Recv\n");
                printf("2:CheckRecv\n");
                printf("3:Send\n");
                printf("4:Close\n>");
                scanf_s("%s",buf,BUFSIZE);

                if(buf[0]=='0'){
                        printf("COM[n]=");
                        scanf_s("%d",&com);
                        r=ERS_Open(com,5000,5000);
                        printf(" ERS_Open() return = %d\n",r);
                        ERS_Config(com,ERS_115200);
                }else
                if(buf[0]=='4'){
                        r=ERS_Close(com);
                        printf(" ERS_Close() return = %d\n",r);
                        return;
                }else
                if(buf[0]=='1'){
                        printf("recv size=");
                        scanf_s("%d",&n);
                        printf("Recv...");
                        r=ERS_Recv(com,buf,n);
                        printf(" ERS_Recv() return = %d\n",r);
                }else
                if(buf[0]=='2'){
                        r=ERS_CheckRecv(com);
                        printf(" ERS_CheckRecv() return = %d\n",r);
                }else
                if(buf[0]=='3'){
                        printf("send size=");
                        scanf_s("%d",&n);
                        r=ERS_Send(com,buf,n);
                        printf(" ERS_Send() return = %d\n",r);
                }
        }
}


Windows Mobileでの例(送信と受信)

 Pocket PCから文字を送信し,自分自身で受信するプログラムの例.

使用機器:HP iPAQ hx4700 (Windows Mobile 2005へアップグレード済み)
ケーブル:HP ユニバーサル同期ケーブル(FA122A#AC3)
併用ライブラリ:ECELIB 0.4

使い方
 a) Pocket PCのCOMポートのTXDとRXDをつなぐ.
 b) プログラムを実行する.
 c) 何か文字列を入力すると,その文字列を送信します.
 d) その文字列を自分自身で受信し,表示します.

#include <ecelib.h>
#include <erslib.h>
void ECE_Ready(void) { ERS_Open(1,1024,1024); ERS_Config(1,ERS_115200); } void ECE_Main(void) { wchar_t sbuf[100], rbuf[100]; ECE_Printf(L"送信文字列="); ECE_Input(sbuf); ERS_WPuts(1,sbuf); ERS_WGets(1,rbuf,-1); ECE_Printf(L"受信した文字列=[%s]\n", rbuf); } void ECE_Finish(void) { ERS_CloseAll(); }


関数リファレンス

基本関数

int ERS_Open(int n, int baudrate=ERS_BAUDRATE);
int ERS_Open(int n, int recv_size, int send_size);
説明
 シリアル通信(RS-232C)のポートをオープンします.最初に必要です.

 1つ目の書式では,ボーレートを自由に指定してオープンします.2番目の引数が省略された場合,デフォルト値ERS_BAUDRATE(=9600)が適用されます.送信および受信バッファのサイズ(単位:バイト)はそれぞれERS_SENDBUFFERSIZE(=4096),ERS_RECVBUFFERSIZE(=4096)になります.他の通信設定は,ストップビット1bit,パリティなし,キャラクタ長8bit,XON/XOFF無効,送受信タイムアウト1000ミリ秒となります.
 なお,erslib.hのインクルードより前にERS_BAUDRATE,ERS_SENDBUFFERSIZE,ERS_RECVBUFFERSIZEの定義があれば,デフォルト値は変更されます.

 2つ目の書式は,旧バージョン(ver.1.8)との互換のために用意されています.こちらは,送受信のバッファサイズを指定してオープンします.通信設定は,ボーレート9600bps,ストップビット1bit,パリティなし,キャラクタ長8bit,XON/XOFF無効,送受信タイムアウト1000ミリ秒が初期値として設定されます.
 オープンに成功すると,ERS_Close()/ERS_CloseAll() でクローズするまで ERSLIB の各関数が使用可能となります.
引数
 n:ポート番号 [1〜256] (COM1〜COM256に対応します)
          [1〜9] (COM1:〜COM9:に対応します)←Windows Mobileの場合
 baudrate:ボーレート(単位:bps)
 recv_size:受信バッファのサイズ(単位:バイト)
  メモ1 私の昔のPCでは4096より小さい値を指定しても強制的に4096が最低限確保されているようでした.
  メモ2 私のPocket PC(hx4700)+ユニバーサル同期ケーブルでは,受信バッファのサイズにどんな値を指定しても40959(0x9FFF)で固定のようでした.
 send_size:送信バッファのサイズ(単位:バイト)
戻り値
 0 正常終了(オープンできた)
 1 エラー(ポート番号が範囲外)
 2 エラー(すでにオープンされている)
 3 エラー(他のアプリケーションが使用中 or そのCOMポートは装備されていない)
 4 エラー(指定のボーレートでオープンできなかった)
使用例1
 ERS_Open(1); //COM1を9600 bpsでオープン
 ERS_Open(4, 38400); //COM4を38400 bpsでオープン
 ERS_Open(5, 4096, 4096); //受信バッファ/送信バッファのサイズを指定してCOM5をオープン
使用例2
 // COM2とCOM3を同じボーレートでオープンする例
 #define ERS_BAUDRATE 19200
 #include "erslib.h"
 ERS_Open(2);
 ERS_Open(3);
使用例3
 // バッファサイズのデフォルト値を変更してオープンする
 #define ERS_RECVBUFFERSIZE 65536
 #define ERS_SENDBUFFERSIZE 65536
 #include "erslib.h"
 ERS_Open(6, 115200);


int ERS_Config(int n, unsigned int data);
説明
 通信パラメータの設定を変更します.
 通信設定は,ERS_Open()によってデフォルト値あるいは指定値が設定されますが,現在の設定から変更したいパラメータだけを論理和(|)で結んで指定します.
 XON/XOFF制御を行う場合は,この関数に続いて,ERS_XoffXon() で設定を行って下さい.
 オープンされていないポート番号を指定すると,この関数は無視されます.
引数
 n:ポート番号 [1〜256] (COM1〜COM256に対応します)
          [1〜9] (COM1:〜COM9:に対応します)←Windows Mobileの場合
 data:変更パラメータ
    文字列定数   意味
    ERS_110 ボーレート 110 bps
    ERS_300 ボーレート 300 bps
    ERS_600 ボーレート 600 bps
    ERS_1200 ボーレート 1200 bps
    ERS_2400 ボーレート 2400 bps
    ERS_4800 ボーレート 4800 bps
    ERS_9600 ボーレート 9600 bps(初期値)
    ERS_14400 ボーレート 14400 bps
    ERS_19200 ボーレート 19200 bps
    ERS_38400 ボーレート 38400 bps
    ERS_56000 ボーレート 56000 bps
    ERS_57600 ボーレート 57600 bps
    ERS_115200 ボーレート 115200 bps
    ERS_128000 ボーレート 128000 bps
    ERS_256000 ボーレート 256000 bps

    ERS_1 ストップビット 1ビット(初期値)
    ERS_15 ストップビット 1.5ビット
    ERS_2 ストップビット 2ビット

    ERS_NO パリティ なし(初期値)
    ERS_ODD パリティ 奇数
    ERS_EVEN パリティ 偶数
    ERS_MARK パリティ マーク
    ERS_SPACE パリティ スペース

    ERS_4 キャラクタ長 4bit
    ERS_5 キャラクタ長 5bit
    ERS_6 キャラクタ長 6bit
    ERS_7 キャラクタ長 7bit
    ERS_8 キャラクタ長 8bit(初期値)

    ERS_X_N XON/XOFFは使わない(初期値)
    ERS_X_Y XON/XOFFを用いてフロー制御を行う

    ERS_DTR_Y DTRを有効にする(初期値)
    ERS_DTR_N DTRを無効にする
    ERS_DTR_H DTRをハンドシェークにする

    ERS_RTS_Y RTSを有効にする(初期値)
    ERS_RTS_N RTSを無効にする
    ERS_RTS_H RTSをハンドシェークにする
    ERS_RTS_T RTSをトグルにする

    ERS_CTS_Y CTSを有効にする
    ERS_CTS_N CTSを無効にする(初期値)

    ERS_DSR_Y DSRを有効にする
    ERS_DSR_N DSRを無効にする(初期値)
戻り値
 0 正常終了
 1 エラー(ポート番号が範囲外 or ポートがオープンされていない)
 2 エラー(何らかの理由により設定に失敗した)
使用例
 ERS_Config(1,ERS_EVEN);
 ERS_Config(2,ERS_4800|ERS_7|ERS_ODD);


int ERS_Close(int n);
説明
 シリアル通信ポートをクローズします.
 ポートがクローズされると,以後はそのポートを他のアプリケーションが使用できるようになります.
 オープンされていないポート番号を指定すると,この関数は無視されます.
引数
 n:ポート番号 [1〜256] (COM1〜COM256に対応します)
          [1〜9] (COM1:〜COM9:に対応します)←Windows Mobileの場合
戻り値
 0 正常終了
 1 エラー(ポート番号が範囲外 or ポートがオープンされていない)
 2 エラー(何らかの理由によりクローズに失敗した)
使用例
 ERS_Close(1);


void ERS_CloseAll(void);
説明
 開かれているすべてのシリアル通信ポートをクローズします.
 ポートがクローズされると,以後はそのポートを他のアプリケーションが使用できるようになります.
使用例
 ERS_CloseAll();


int ers_initdone[p];
説明
 ポートの状態が格納されるグローバル変数です.
 この変数は ERSLIB が内部で使用しているもので,通常,ユーザは気にする必要はありません.
引数
 p:ポート番号 [0〜255] (COM1〜COM256に対応します)
          [0〜8] (COM1:〜COM9:に対応します)←Windows Mobileの場合

 0 オープンされていない or クローズした
 1 オープンされている


HANDLE ers_hcom[p];
説明
 オープンされたポートのハンドル値が格納されるグローバル変数です.
 この変数は ERSLIB が内部で使用しているもので,通常,ユーザは気にする必要はありません.
引数
 p:ポート番号 [0〜255] (COM1〜COM256に対応します)
          [0〜8] (COM1:〜COM9:に対応します)←Windows Mobileの場合

 COMポートのハンドル


int ERS_XoffXon(int n, int xoff, int xon);
説明
 XON/XOFFフロー制御におけるしきい値を設定します.
 この関数を使う前に ERS_Config() において,ERS_X_Y を指定し,XON/XOFFを有効にしておきます.
引数
 n:ポート番号 [1〜256] (COM1〜COM256に対応します)
          [1〜9] (COM1:〜COM9:に対応します)←Windows Mobileの場合
 xoff:残りサイズ(単位:バイト)
    受信バッファの空きがこの値以下になると XOFF を相手に送って,
    送信の一時中断を要求します.
 xon:バッファ内のデータ数(バイト単位)
    受信バッファのデータ数がこの値以下になると XON を相手に送って,
    送信続行を要求します.
戻り値
 0 正常終了
 1 エラー(ポート番号が範囲外 or ポートがオープンされていない)
 2 エラー(何らかの理由により設定に失敗した)
使用例
 ERS_Open(1,10000,5000);
 ERS_Config(1,ERS_X_Y);
 ERS_XoffXon(1,1000,6000);


int ERS_BaudRate(int n, int baudrate);
説明
 ボーレートの設定のみを変更します.
 ボーレートはERS_Open()でオープン時に指定できます.また,ボーレートを含め通信パラメータはERS_Config()で変更できます.この関数が正常終了すれば必ずそのボーレートで使えるという訳ではありません.昔の機種では実際に動作するボーレートは INT(115200/N) bps だったりします.(Nは整数, INT()は小数以下切り捨てを意味する)
 オープンされていないポート番号を指定すると,この関数は無視されます.
引数
 n:ポート番号 [1〜256] (COM1〜COM256に対応します)
          [1〜9] (COM1:〜COM9:に対応します)←Windows Mobileの場合
 baudrate:ボーレートを数値で直接指定します.
  メモ 私の昔のPC(P4P800-D, WinXP)では以下の範囲で関数が正常終了でした.
   1〜9600 bps
   10369〜10472 bps
   11405〜11520 bps
   12673〜12800 bps
   14257〜14400 bps
   16293〜16457 bps
   19009〜19200 bps
   22810〜23040 bps
   28513〜28800 bps
   38017〜38400 bps
   56000〜56000 bps
   57025〜57600 bps
   114049〜115200 bps
戻り値
 0 正常終了
 1 エラー(ポート番号が範囲外 or ポートがオープンされていない)
 2 エラー(指定のボーレートは設定できず,ボーレートは変更されなかった)
使用例
 ERS_Open(1,4096,4096);
 ERS_BaudRate(1,12800);


int ERS_ConfigDialog(int n);
説明
 通信設定を変更するためのダイアログを開きます.
 ポート番号によってはサポートされていない場合もあります.
 この関数はWindows Mobile 開発では使えません.
引数
 n:ポート番号 [1〜?] (COM1〜COM?に対応します)
戻り値
 0 正常終了
 1 エラー(ポート番号が範囲外 or ポートがオープンされていない)
 2 エラー(パラメータが範囲外のため,通信設定は変更されなかった)
使用例
 ERS_ConfigDialog(1);


送信に関わるもの

 データの送信に関わる関数です.
 下記のすべての関数は,オープンされていないポート番号が指定された場合,何も実行せずに戻ってきます.

int ERS_Send(int n, void *buf, int size);
説明
 データの送信を行います.
引数
 n:ポート番号 [1〜256] (COM1〜COM256に対応します)
          [1〜9] (COM1:〜COM9:に対応します)←Windows Mobileの場合
 buf:送信データが格納されている領域の先頭アドレス(ポインタ)
 size:送信データのサイズ(単位:バイト)
戻り値
 送信したデータのバイト数(単位:バイト)
 (オープンされていないポート番号が指定されたとき,また,ポート番号が範囲外のときは,この関数は 0 を返します.)
使用例
 char buf[400];
 ERS_Send(2,buf,400);


int ERS_SendTimeOut(int n, int sto);
説明
 送信タイムアウト時間を変更したり,設定解除したりします.
 ERS_Open() でオープンしたときのデフォルト値は1000ミリ秒です.0を指定すると,タイムアウトしない設定となります.
 XON/XOFF制御等で送信が一時中断させられるとき,この時間を超えると送信タイムアウトとなります.
引数
 n:ポート番号 [1〜256] (COM1〜COM256に対応します)
          [1〜9] (COM1:〜COM9:に対応します)←Windows Mobileの場合
 sto:タイムアウト時間(単位:ミリ秒)
戻り値
 0 正常終了
 1 エラー(ポート番号が範囲外 or ポートがオープンされていない)
 2 エラー(何らかの理由により設定に失敗した)
使用例
 ERS_SendTimeOut(1,0);
 ERS_SendTimeOut(2,100);


int ERS_ClearSend(int n);
説明
 送信バッファをクリアします.
引数
 n:ポート番号 [1〜256] (COM1〜COM256に対応します)
          [1〜9] (COM1:〜COM9:に対応します)←Windows Mobileの場合
戻り値
 0 正常終了
 1 エラー(ポート番号が範囲外 or ポートがオープンされていない)
使用例
 ERS_ClearSend(2);


int ERS_CheckSend(int n);
説明
 送信バッファにたまっているデータ数(単位:バイト)を返します.
引数
 n:ポート番号 [1〜256] (COM1〜COM256に対応します)
          [1〜9] (COM1:〜COM9:に対応します)←Windows Mobileの場合
戻り値
 送信バッファ内のデータ数(単位:バイト)
 (オープンされていないポート番号が指定されたとき,また,
 ポート番号が範囲外のときは,この関数は 0 を返します.)
使用例
 int size;
 size=ERS_CheckSend(1);


int ERS_Putc(int n, int c);
説明
 1バイト送信します.
引数
 n:ポート番号 [1〜256] (COM1〜COM256に対応します)
          [1〜9] (COM1:〜COM9:に対応します)←Windows Mobileの場合
 c:送信データ(下位8ビットのみ有効)[0〜255] 
戻り値
 送信できたデータ数(単位:バイト)[0 or 1]
使用例
 ERS_Putc(1,'A');


int ERS_WPutc(int n, wchar_t c);
説明
 UNICODEの1文字(2バイト)を送信します.
引数
 n:ポート番号 [1〜9] (COM1:〜COM9:に対応します)
 c:送信されるUNICODE文字 
戻り値
 送信できた文字数
使用例
 ERS_WPutc(1,L'A');


int ERS_Puts(int n, const char *s);
説明
 文字列を送信します.
 文字列の終端コード(\0)は改行文字(\n)へ変換して送信されます.
引数
 n:ポート番号 [1〜256] (COM1〜COM256に対応します)
          [1〜9] (COM1:〜COM9:に対応します)←Windows Mobileの場合
 s:送信される文字列が格納してある領域の先頭アドレス(ポインタ)
戻り値
 送信できたデータ数(単位:バイト)(最後の改行も含む)
使用例
 ERS_Puts(2,"ABC");


int ERS_WPuts(int n, const wchar_t *s);
説明
 UNICODE文字列を送信します.
 文字列の終端コード(\0)は改行文字(\n)へ変換して送信されます.
引数
 n:ポート番号 [1〜9] (COM1:〜COM9:に対応します)
戻り値
 送信できた文字数(最後の改行も含む)
使用例
 ERS_WPuts(1,L"ABC");


int ERS_Sends(int n, const char *s);
説明
 文字列を送信します.
 文字列の終端コード(\0)の前までを送信します.終端コードは送信されません.
引数
 n:ポート番号 [1〜256] (COM1〜COM256に対応します)
          [1〜9] (COM1:〜COM9:に対応します)←Windows Mobileの場合
 s:送信される文字列が格納してある領域の先頭アドレス(ポインタ)
戻り値
 送信できたデータ数(単位:バイト)
使用例
 ERS_Sends(2,"Hello");


int ERS_WSends(int n, const wchar_t *s);
説明
 UNICODE文字列を送信します.
 文字列の終端コード(\0)の前までを送信します.終端コードは送信されません.
引数
 n:ポート番号 [1〜9] (COM1:〜COM9:に対応します)
戻り値
 送信できた文字数
使用例
 ERS_WSends(1,L"Hello");


int ERS_Printf(int n, const char *format [, argument]...);
説明
 書式付き文字列を送信します.
 使える書式は,一般的な printf() と同じです.制御文字や漢字もそのまま送信されます.
 文字列の終端コード(\0)は改行文字(\n)へ変換して送信されます.
引数
 n:ポート番号 [1〜256] (COM1〜COM256に対応します)
          [1〜9] (COM1:〜COM9:に対応します)←Windows Mobileの場合
 format:書式付き文字列へのポインタ
 argument...:引数(必要に応じて)
戻り値
 送信できたデータ数(単位:バイト)(最後の改行も含む)
使用例
 ERS_Printf(2,"a=%03d",a);


int ERS_WPrintf(int n, const wchar_t *format, ...);
説明
 書式付きUNICODE文字列を送信します.
 使える書式は,一般的な printf() と同じです.制御文字や漢字もそのまま送信されます.
 文字列の終端コード(\0)は改行文字(\n)へ変換して送信されます.
引数
 n:ポート番号 [1〜9] (COM1:〜COM9:に対応します)
 format:書式付きUNICODE文字列へのポインタ
 argument...:引数(必要に応じて)
戻り値
 送信できた文字数(最後の改行も含む)
使用例
 ERS_WPrintf(1, L"a=%03d", a);


受信に関わるもの

 データの受信に関わる関数です.
 下記のすべての関数は,オープンされていないポート番号が指定された場合,何も実行せずに戻ってきます.

int ERS_Recv(int n, void *buf, int size);
説明
 データの受信を行います.
引数
 n:ポート番号 [1〜256] (COM1〜COM256に対応します)
          [1〜9] (COM1:〜COM9:に対応します)←Windows Mobileの場合
 buf:受信データを格納する領域の先頭アドレス(ポインタ)
 size:受信データ数(単位:バイト)
    受信バッファ内のデータ数が size より小さい場合,sizeバイトのデータが全部来るまで待機します.そして,size バイトのデータが受信できると直ちに制御は戻ってきます.また,データが指定された数だけ来なくても,受信タイムアウト時間を過ぎると,制御は戻ってきます.このときは,受信できたデータ数を返します.
戻り値
 受信できたデータ数(単位:バイト)
 (オープンされていないポート番号が指定されたとき,また,ポート番号が範囲外のときは,この関数は 0 を返します.)
使用例
 char buf[400];
 int n;
 n=ERS_Recv(1,buf,400);


int ERS_CheckRecv(int n);
説明
 受信バッファに残っているデータ数(単位:バイト)を返します.
 受信バッファのサイズより大きな値を返すことはありません.
引数
 n:ポート番号 [1〜256] (COM1〜COM256に対応します)
          [1〜9] (COM1:〜COM9:に対応します)←Windows Mobileの場合
戻り値
 受信バッファ内のデータ数(単位:バイト)
 (オープンされていないポート番号が指定されたとき,また,ポート番号が範囲外のときは,この関数は 0 を返します.)
使用例
 int size;
 char buf[256];
 size=ERS_CheckRecv(1);
 ERS_Recv(1,buf,size);


int ERS_ClearRecv(int n);
説明
 受信バッファをクリアします.
引数
 n:ポート番号 [1〜256] (COM1〜COM256に対応します)
          [1〜9] (COM1:〜COM9:に対応します)←Windows Mobileの場合
戻り値
 0 正常終了
 1 エラー(ポート番号が範囲外 or ポートがオープンされていない)
使用例
 ERS_ClearRecv(1);


int ERS_RecvTimeOut(int n, int rto);
説明
 受信タイムアウト時間を変更したり,設定解除したりします.
 ERS_Recv() は指定されたデータ数を受信し終えるまで制御が戻ってきませんが,受信タイムアウト時間を過ぎるとデータ数が足らなかったり,受信中であったりしても,制御は戻ります.
 ERS_Open() でオープンしたときのデフォルト値は1000ミリ秒です.
 0を指定すると,タイムアウトしない設定となります.0 を指定すると,受信バッファに必要な数のデータがない場合,ERS_Recv()はデータが来るまで無限に待ちます.
引数
 n:ポート番号 [1〜256] (COM1〜COM256に対応します)
          [1〜9] (COM1:〜COM9:に対応します)←Windows Mobileの場合
 rto:タイムアウト時間(単位:ミリ秒)
戻り値
 0 正常終了
 1 エラー(ポート番号が範囲外 or ポートがオープンされていない)
 2 エラー(何らかの理由により設定に失敗した)
使用例
 ERS_RecvTimeOut(1,1000);
 ERS_RecvTimeOut(2,0);


int ERS_Getc(int n);
説明
 1バイト受信し,その値を返します.
 もし受信タイムアウト等で受信できなかった場合はEOF(-1)を返します.
引数
 n:ポート番号 [1〜256] (COM1〜COM256に対応します)
          [1〜9] (COM1:〜COM9:に対応します)←Windows Mobileの場合
戻り値
 受信データ[0〜255]またはEOF(-1) 
使用例
 int c;
 c=ERS_Getc(1);
 if (c==EOF) ...


wchar_t ERS_WGetc(int n);
説明
 UNICODEの1文字(2バイト)を受信し,その文字を返します.
 もし受信タイムアウト等で受信できなかった場合はEOF(-1)を返します.
引数
 n:ポート番号 [1〜9] (COM1:〜COM9:に対応します)
戻り値
 受信したUNICODE文字またはEOF(-1) 
使用例
 wchar_t c;
 c=ERS_WGetc(1);
 if (c==EOF) ...


int ERS_Gets(int n, char *s, int size);
説明
 文字列を受信します.
 最初に改行または終端コード(\r or \n or \0)が来るまで受信し,
 その改行または終端コードは\0に置き換えて格納されます.
引数
 n:ポート番号 [1〜256] (COM1〜COM256に対応します)
          [1〜9] (COM1:〜COM9:に対応します)←Windows Mobileの場合
 s:受信した文字列を格納する領域の先頭アドレス(ポインタ)
 size:受信するデータの最大サイズ(単位:バイト)
    最大で size-1 文字読み込み,終端コードを追加します.
    0を指定すると全く受信しません.
    -1を指定すると改行(または終端)が来るまで受信しますが,この場合
    格納領域 s のサイズを超える場合もチェックされないので注意してください.
戻り値
 受信できた文字列のバイト数(改行または終端コードを含む)
使用例
 char buf[100];
 ERS_Gets(1,buf,sizeof(buf));


int ERS_WGets(int n, wchar_t *s, int size);
説明
 UNICODE文字列を受信します.
 最初に改行または終端コード(\r or \n or \0)が来るまで受信し,
 その改行または終端コードは\0に置き換えて格納されます.
引数
 n:ポート番号 [1〜9] (COM1:〜COM9:に対応します)
 s:受信した文字列を格納する領域の先頭アドレス(ポインタ)
 size:受信する文字の最大数(単位:文字)
    最大で size-1 文字読み込み,終端コードを追加します.
    0を指定すると全く受信しません.
    -1を指定すると改行(または終端)が来るまで受信しますが,この場合
    格納領域 s のサイズを超える場合もチェックされないので注意してください.
戻り値
 受信できた文字の数(改行または終端コードを含む)
使用例
 wchar_t buf[100];
 ERS_WGets(1,buf,100);


おわりに

著作権・使用許諾

ERSLIB のすべての著作権はI.N.にあります.
ERSLIB はフリーソフトウェアであり配布・転載は自由です.
ERSLIB の改造・変更は自由に行っても構いません.
ERSLIB を使用した際の著作権表示は特に必要ありません.
ERSLIB の使用目的・用途は限定しません.
ERSLIB を使用したことによって生じたいかなる損害等も,作者は一切その責任を負わないこととします.


バージョンアップ履歴

ver.1.0 2002/1/11
 "ERSLIB.H"の誕生.

ver.1.1 2002/1/21
 最大8ポート(COM1-COM8)に対応させた.

ver.1.2 2002/4/22
 ヘルプファイル作成.COM1-COM256に対応.タイムアウト時間が500msと誤記されていた箇所を1000msへ訂正.

ver.1.3 2002/7/16
 COM10以上が使用できなかった不具合を修正.XON/XOFFによる制御.ERS_XoffXon(),ERS_CloseAll()追加.制御信号の使用.ダイアログベースのサンプル追加.

ver.1.4 2002/11/27
 拡張子が".cpp"のときコンパイルでエラーが出ていた不具合を修正した.

ver.1.5 2003/10/16
 ERS_BaudRate()追加.サンプルプログラムの追加.ers_hcom[]の公開.

ver.1.6 2005/2/8
 WindowsCE(eVC++ 4.0)をサポート.
 ERS_Putc(), ERS_Getc(), ERS_WPutc(), ERS_WGetc()追加.
 ERS_Printf(),ERS_Puts(),ERS_Gets(), ERS_WPrintf(),ERS_WPuts(),ERS_WGets()追加.
 ERS_ConfigDialog()追加.

ver.1.7 2006/12/25
 Visual C++ 2005対応.

ver.1.8 2013/2/12
 ERS_Sends(), ERS_WSends()の追加.ヘルプファイルの再作成.

ver.2.0 2017/5/25
 ボーレートを指定してオープンするERS_Open()を追加.
 ERS_BAUDRATE, ERS_SENDBUFFERSIZE, ERS_RECVBUFFERSIZEの定義による初期値を追加.

ver.2.1 2020/3/12
 Visual C++ 2019でエラーを出さないために,ERS_W/Puts(),ERS_W/Printf(),ERS_W/Sends()の引数の型を
 char *からconst char *へ変更.


作者のウェブサイト
 ERSLIBの最新情報や作者の他のソフト,ライブラリがあります.
 http://insubaru.g1.xrea.com/


作者への連絡先
 ERSLIBに関する質問やバグ情報などは下記URL(ブログ)にて対応いたします.
 https://insubaru.hatenablog.com/


開発環境

 OS:Windows 10 Pro (x64) version 1909
 言語:Visual Studio Professional 2015/2019


End of help.