SIO(PCI/C-PCI)Linux/RT GPG-4101 無手順通信インタフェースモジュール用 Linux/RT ドライバ Help for Linux www.interface.co.jp
目次 第 1 章はじめに 3 1.1 概要... 3 1.2 特長... 3 第 2 章製品仕様 4 2.1 動作環境... 4 2.2 対象製品... 4 2.3 基本仕様... 5 第 3 章実行手順 6 3.1 デバイスを動かすまで... 6 3.2 制御手順... 9 3.3 ドライバ組み込みオプション... 13 3.4 デバッグ支援機能... 14 3.5 /procファイルシステム... 15 3.6 テストドライバの使用方法... 16 第 4 章リファレンス 17 4.1 関数一覧... 17 4.2 関数個別説明... 18 4.3 戻り値一覧... 41 4.4 構造体... 42 第 5 章サンプルプログラム 47 5.1 データ送信サンプルプログラム... 47 5.2 データ受信サンプルプログラム... 47 5.3 調歩同期送信サンプルプログラム... 47 5.4 調歩同期受信サンプルプログラム... 47 5.5 キャラクタ同期送信サンプルプログラム... 47 5.6 キャラクタ同期受信サンプルプログラム... 47 5.7 データ送信サンプルプログラム... 48 5.8 データ受信サンプルプログラム... 48 5.9 調歩同期送信サンプルプログラム... 48 5.10 調歩同期受信サンプルプログラム... 48 5.11 キャラクタ同期送信サンプルプログラム... 48 5.12 キャラクタ同期受信サンプルプログラム... 48 第 6 章重要な情報 49 2
第 1 章はじめに 1.1 概要本ソフトウェアは Linux アプリケーションおよび RTLinux リアルタイムモジュールから 弊社キャラクタ同期通信製品の制御を行うためのソフトウェアです GPG-4101 は 弊社キャラクタ同期通信製品を Linux アプリケーションから Lib をリンクし関数をコール およびリアルタイムモジュールから関数をコールすることにより制御します 本ドキュメントは Linux 上で GPG-4101 を使用するための情報を掲載しています 1.2 特長 ドライバ内部に送受信バッファを用意するため デバイスドライバのバッファサイズを拡張することができます RS-485 インタフェース製品を使用すれば 2 線式半二重によるマルチドロップ通信を実現することができます また 4 線式半二重通信にも対応しています 制御信号変化時 通信エラー発生時 ユーザが登録した処理 ( コールバックルーチン ) を実行することができます 3
第 2 章製品仕様 2.1 動作環境 対応機種弊社製 FA コントローラ弊社製 Classembly Devices PC/AT 互換機 NEC PC/FC-9821 ドライバ種別キャラクタ型ドライバ組み込み方式モジュール ( ダイナミックロード / アンロード ) メジャー番号割り当て自動割り当てソースコードの取り扱いドライバモジュール一部公開ライブラリソースコード非公開共用モジュール公開ビルドサポートメイクファイル提供対応カーネルバージョン IBM PC/AT 互換機カーネル 2.2.x カーネル 2.4.x カーネル 2.6.x 弊社 SH-CPU モジュール弊社 SH-Linux ヘルプファイル PDF 形式テキスト形式 2.2 対象製品 PCI シリーズ (PCI バス製品 ) PCI-4101 PCI-4102 CTP シリーズ (CompactPCI バス製品 ) CTP-4101 CTP-4102 CPZ シリーズ (CompactPCI バス製品 ) CPZ-4101 CPZ-4102 4
2.3 基本仕様 最大ポート数 最大 64 ポート 同期方式 キャラクタ同期 / 調歩同期式無手順 通信方式 RS-232C 全二重通信 RS-485 全二重通信 半二重通信 (2 線式 4 線式 ) ボーレート キャラクタ同期 内部クロック使用時 :80bps ~ 327680 bps 外部クロック使用時 :DC ~ 327680 bps 調歩同期 内部クロック使用時 :4bps ~ 128000 bps 外部クロック使用時 :DC ~ 136530 bps データ長 5bit~8bit ストップビット長 1bit 1.5bit 2bit パリティ なし 奇数 偶数 制御信号 RS-232C 出力信号 :RS, ER, GO1, GO2, GO3, GO4 入力信号 :CS, DR, CI, CD, GI1 RS-485 出力信号 :C 入力信号 :I 同期解放処理 EOF キャラクタ検知による自動実行 関数呼び出しによる手動実行 5
第 3 章実行手順 3.1 デバイスを動かすまで 1. インストールインタフェースモジュールを拡張スロットに実装しシステムを起動します インストーラを起動し Linux ドライバのインストールを行います ( 詳しいインストール方法は Readme をご参照ください ) #bash install 2. ドライバモジュールの組み込み ドライバモジュールを組み込みます #modprobe cp4101 3. ポート番号の確認 /proc ファイルシステムを参照することにより 各通信ポートのポート番号を確認できます Linux ドライバの各 API はポート番号により 制御を行うポートを指定します 行頭の数値がポート番号になります #cat /proc/tty/driver/cp4101 1: PCI-4101(bid=0h)CH1 [9600bps] tx:0 rx:0 2: PCI-4101(bid=0h)CH2 [9600bps] tx:0 rx:0 33: PCI-4102(bid=0h)CH1 [9600bps HD2W] tx:0 rx:0 34: PCI-4102(bid=0h)CH2 [9600bps HD2W] tx:0 rx:0 書式についての詳細は 3.5 /proc ファイルシステム をご参照ください 4. プログラム作成プログラムの作成を行います エディタを起動し 下記のコードを記述します #include <stdio.h> #include "pcisio.h" #define PORTNO SIO_PORTNO_4101_0_1 int main(void) { char Buffer[256]; /* 送受信バッファ */ SIO_CONFIG Config; /* 通信設定構造体 */ unsigned long ullen; /* データ長 */ int nret; /* 関数実行結果 */ /* ポートのオープンを行います */ nret = SioOpen( PORTNO ); if (nret!= SIO_ERROR_SUCCESS ) { printf("open Error\n"); return -1; /* プログラム終了 */ } /* 通信設定を行います */ SioGetConfig( PORTNO, &Config); Config.ulMode = SIO_BISYNC; /* BISYNC */ Config.ulLine = SIO_FULL_DUPLEX; /* 全二重 */ Config.ulBps = 9600; /* 9600bps */ 6
Config.ulParity = SIO_NONE_PARITY; /* パリティなし */ Config.ulClen = 8; /* データ長 8bit */ Config.ulBaseClock = SIO_CLK_14_7456; /* 基準クロック 14.7456MHz */ Config.ulSClockSelect = SIO_SCLK_IN; /* 送信クロック内部 */ Config.ulRClockSelect = SIO_RCLK_RT; /* 受信クロック外部 */ nret = SioSetConfig( PORTNO, &Config ); if(nret!= SIO_ERROR_SUCCESS) { printf( SetConfig Error\n ); SioClose( PORTNO ); return -1; /* プログラム終了 */ } /* RS 信号を ON */ nret = SioControl( PORTNO, 0, 0x00000001 ); if(nret!= SIO_ERROR_SUCCESS) { printf( Control Error\n ); SioClose( PORTNO ); return -1; /* プログラム終了 */ } /* データ送信 */ nret = SioSend( PORTNO, "GPC-4101", 8 ); if(nret!= SIO_ERROR_SUCCESS) { printf( Send Error\n ); SioClose( PORTNO ); return -1; /* プログラム終了 */ } /* データ受信 */ ullen = 8; nret = SioReceive( PORTNO, Buffer, &ullen ); if ( nret!= SIO_ERROR_SUCCESS) { printf( Receive Error\n ); SioClose( PORTNO ); return -1; /* プログラム終了 */ } /* 入力データの表示 */ if(ullen > 0) { Buffer[ulLen] = 0; printf(" 入力データ = %s\n", Buffer); } /* ポートの終了処理 */ SioClose( PORTNO ); } return 0; コードの記述が終われば Siotest.c というファイル名で保存しておきます 5. コンパイル作成したプログラムをコンパイルします 下記のコマンドを実行してください #gcc -o Siotest Siotest.c lgpg4101 7
6. 実行コンパイルすることで実行ファイル Siotest ができていますので #./Siotest と入力し プログラムを実行してください ポートオープン 通信設定 RS 信号 ON データ送信 データ受信 ポートクローズ の一連のインタフェースモジュール制御を行います コンソール画面に受信データが表示されます 8
3.2 制御手順 1. 初期化 SioOpen 関数を呼び ポートのオープンを行います 関数が正常終了すると 戻り値として SIO_ERROR_SUCCESS が返されます 複数のポートを使用する場合は 各ポートに対して SioOpen 関数をコールします 初期化したポートに対して アプリケーション終了の際に必ず終了処理 (SioClose 関数 ) をコールしてください int nret; int nportno = SIO_PORTNO_4101_0_1; /* ポート初期化 */ nret = SioOpen(nPortNo); if (nret!= SIO_ERROR_SUCCESS) { /* オープンに失敗 */ return 1; } SioOpen 関数の引数には 型式 チャンネル RSW1 設定値により一意に定まるポート番号をその識別 子で指定します 型式 チャンネル RSW1 設定とポート番号の対応は以下のとおりになります 型式 RSW1 設定値 チャンネル ポート番号 識別子 PCI-4101 0 CN1 1 SIO_PORTNO_4101_0_1 CTP-4101 CN2 2 SIO_PORTNO_4101_0_2 CPZ-4101 1 CN1 3 SIO_PORTNO_4101_1_1 CN2 4 SIO_PORTNO_4101_1_2 F CN1 31 SIO_PORTNO_4101_F_1 CN2 32 SIO_PORTNO_4101_F_2 PCI-4102 0 CN1 33 SIO_PORTNO_4102_0_1 CTP-4102 CN2 34 SIO_PORTNO_4102_0_2 CPZ-4102 1 CN1 35 SIO_PORTNO_4102_1_1 CN2 36 SIO_PORTNO_4102_1_2 F CN1 63 SIO_PORTNO_4102_F_1 CN2 64 SIO_PORTNO_4102_F_2 同一型番の PCI CTP と CPZ は 同一型式として扱われるため 混在させるためには RSW1 設 定値が重ならないように設定する必要があります 例えば PCI-4101 と CPZ-4101 を混在させ る場合 RSW1 設定値が重複しないように設定する必要があります ポートのオープンが完了したら 通信設定構造体 SIO_CONFIG の各メンバに適切な値を設定します SioGetConfig 関数でデフォルトの設定を取得し 必要な項目に対して 構造体のパラメータを変更します SioSetConfig 関数で 設定を行います 設定例を以下に示します int nportno = SIO_PORTNO_4101_0_1; int port_open(void) { int nret; SIO_CONFIG Config; nret = SioOpen(nPortNo); 9
if(nret < SIO_ERROR_SUCCESS) return nret; /* 通信設定構造体取得 */ SioGetConfig(nPortNo, &Config); /* 通信パラメータの格納 */ Config.ulMode = SIO_BISYNC SIO_OUTSYNC_ENABLE; /* BISYNC */ Config.dwSchar = 0x1616; /* 同期キャラクタ 1:16h, 同期キャラクタ 2:16h */ Config.ulLine = SIO_FULL_DUPLEX; /* 全二重 */ Config.ulBps = 9600; /* 9600bps */ Config.ulClen = 8; /* データ長 */ Config.ulParity = SIO_PARITY_NONE; /* パリティなし */ Config.ulEofChar = 0xff; /* EOF キャラクタ FFh */ Config.ulEofLength = 2; /* EOF キャラクタ長 2 */ } /* 通信設定 */ nret = SioSetConfig(nPortNo, &Config); return nret; 2. 送信データ送信する際には SioSend 関数を使用します int nportno = SIO_PORTNO_4101_0_1; int send_data(void) { int nret; unsigned long ulsendlength; char SendBuffer[64]; } /* SendBuffer に 送信データを格納 */ strcpy(sendbuffer, The quick brown fox jumps over the lazy dog. ); /* データ長の取得 */ ulsendlength = strlen(sendbuffer); /* データ送信 */ nret = SioSend(nPortNo, SendBuffer, ulsendlength); if(nret) { printf( The transmission failed. ); } return 0; アプリケーションは送信処理完了まで待たず 関数から即制御が戻ります データ送信処理の完了は SioGetSBSize 関数で確認するか イベントで確認することが出来ます SioGetSBSize 関数で取得される送信バッファサイズが 0 の場合 全ての送信データが通信コントローラに書き込まれ ドライバの送信バッファが空になったことになります int nportno = SIO_PORTNO_4101_0_1; int send_data(void) { int nret; unsigned long ultxbuffercount; 10
} /* データ送信 */ nret = SioSend(nPortNo, 1234567890, 10); if(nret) { printf( The transmission failed. ); return -1; } do { /* 送受信ステータス取得 */ SioGetSBSize(nPortNo, &ultxbuffercount); } while (ultxbuffercount); return 0; 3. 受信受信バッファに格納されているデータを取得するには SioReceive 関数を使用します 現在格納されている受信データのサイズを取得するには SioGetRBSize 関数を使用します #define MAX_RECEIVE_LENGTH 128 int nportno = SIO_PORTNO_4101_0_1; int receive_data(void) { unsigned long ulreceivelength; char ReceiveBuffer[MAX_RECEIVE_LENGTH]; unsigned long ulrxbuffercount; } /* 受信データ長の取得 */ SioGetRBSize(nPortNo, &ulrxbuffercount); ulreceivelength = ulrxbuffercount; if(ulreceivelength > MAX_RECEIVE_LENGTH) { ulreceivelength = MAX_RECEIVE_LENGTH; } /* 受信データの取得 */ if(ulreceivelength > 0) { SioReceive(nPortNo, ReceiveBuffer, &ulreceivelength); } return 0; 4. 制御信号出力状態の設定と取得 SioControl 関数を使用して制御信号の ON/OFF SioStatus 関数を使用して制御信号の入力状態を取得することができます 0 が OFF 1 が ON となっています RS-232C での制御信号操作の例を示します int nportno = SIO_PORTNO_4101_0_1; int SetControl(void) { int nret; /* ポートオープン */ nret = SioOpen(nPortNo); 11
if(nret!= SIO_ERROR_SUCCESS) return nret; /* RS 信号を ON に設定します */ SioControl(nPortNo, 0, 0x00000001); } return 0; 5. 終了処理 SioClose 関数でポートの終了処理を行います int nportno = SIO_PORTNO_4101_0_1; void close_port(void) { SioClose(nPortNo); } ポートの使用を終了する際は必ず SioClose 関数を実行してください 12
3.3 ドライバ組み込みオプションドライバ組み込み時以下のパラメータを設定することができます パラメータ cp4101_txbuffer cp4101_rxbuffer cp4101_debuglevel 内容送信バッファサイズを設定します デフォルトは 4096 バイトです 受信バッファサイズを設定します デフォルトは 4096 バイトです デバッグレベルを設定します オプション指定例は下記のようになります #modprobe cp4101 cp4101_txbuffer=2048 cp4101_rxbuffer=16384 送信バッファサイズを 2048 バイト 受信バッファサイズを 16384 バイトに設定します 13
3.4 デバッグ支援機能ドライバ組み込み時 デバッグレベルを指定することでドライバデバッグ情報が出力されます 本機能を使用することによりユーザアプリケーションの問題追跡に役立つ情報を出力し デバッグ作業を手助けします 指定するには 下記のようにコマンドを打ち込んでください #modprobe cp4101 cp4101_debuglevel=< デバッグレベル > デバッグ 機能 フォーマット レベル 0 デバッグ情報なし 1 関数呼び出しトレース 関数名 パラメータを出力します パラメータは 16 進数の 0x が付けられます ポインタ型のパラメータは [] が付けられます 例 )PCI-4101, RSW1=0 をオープンした場合 SioOpen( 1 ); 2 エラー情報 関数のエラーコードよりも詳細なエラー情報を出力します 例 ) SioSetConfig: Parity parameter error 4 デバイスリソース情報 デバイスリソース情報を出力します 以下の PCI コンフィギュレーション情報を出力します デバイス ID サブシステム ID リビジョン ID I/O アドレス IRQ 番号 オプションが指定されない場合 デバッグレベル 0 となります 複数のデバッグ情報を表示したい場合 デバッグレベル値を OR した値を指定します 例 ) 関数呼び出しトレース デバイスリソース情報を出力したい場合 デバッグレベルとして 5 を指定します ドライバから出力された情報は /var/log/messages に追加されます /var/log/messages を参照することによりドライバデバッグ情報を確認することができます デバッグ情報出力を有効にすると システムの負荷が高くなります これはデバッグ情報を 1 件出力するごとにディスクアクセスが発生するためです デバッグ情報出力はアプリケーションデバッグ時にのみ有効にし リリース環境ではデバッグ情報出力は必ず無効にして下さい 14
3.5 /proc ファイルシステム /proc ファイルシステムを参照することで シリアルポートの認識状況 動作状況を確認することができます 参照できる内容は以下のとおりです 項目 内容 ポート番号 ポート番号を表示します 製品型式 製品型式を表示します 括弧内は RSW1 設定値を表します ボーレート 現在設定されているボーレートを表示します 通信方式 現在設定されている通信方式を表示します RS-485 のみ表示されます FD 全二重通信に設定されています HD2W 2 線式半二重通信に設定されています HD4W 4 線式半二重通信に設定されています 送受信通算バイト数 現在まで送受信したデータの通算バイト数です tx が送信バイト数 rx が受信バイト数です 制御信号状態 現在 ON になっている制御信号を表示します RTS RS-232C RS 信号が ON になっています RS-485 C 信号が ON になっています ER ER 信号が ON になっています CTS RS-232C CS 信号が ON になっています RS-485 I 信号が ON になっています DR DR 信号が ON になっています CI CI 信号が ON になっています CD CD 信号が ON になっています 表示例は下記のようになります #cat /proc/tty/driver/cp4101 1: PCI-4101(bid=0h)CH1 [9600bps] tx:812 rx:4312 RTS CTS 2: PCI-4101(bid=0h)CH2 [9600bps] tx:4312 rx:812 RTS CTS 33: PCI-4102(bid=0h)CH1 [9600bps HD2W] tx:0 rx:0 34: PCI-4102(bid=0h)CH2 [9600bps HD2W] tx:0 rx:0 15
3.6 テストドライバの使用方法本ソフトウェアには デバイスがなくてもドライバを動かすことができるテストドライバ機能がついています テストドライバを使用する場合は libgpg4101.so の代わりに libgpg4101t.so をリンクし コンパイルしてください テストドライバ機能を使用するプログラム test.c をコンパイルする場合のコンパイル例を示します #gcc o test test.c lgpg4101t テストドライバ機能は ループバックコネクタを接続した場合と同じ動作をします SioSend 関数でデータを送信すれば 自身の受信バッファにその送信データが格納されます バッファサイズは 4096 バイトで固定です また 送信したデータはそのまま受信バッファに格納されます 各関数は下記のように動作します No 関数名 機能 1 SioOpen 引数が正常であれば SIO_ERROR_SUCCESS を返します 2 SioClose 引数が正常であれば SIO_ERROR_SUCCESS を返します 3 SioSetConfig 引数が正常であれば SIO_CONFIG 構造体を設定できます 4 SioGetConfig 引数が正常であれば SIO_CONFIG 構造体を取得できます 5 SioSend 引数が正常であれば 送信データをドライバの受信バッファに格納しリターンします このときに 受信バッファに格納されたデータ長が SIO_CONFIG 構造体の ulrxeventtrigger メンバに達した場合 コールバック関数が呼ばれます (SioSetEventMask 関数でイベントをアンマスクしている場合 ) 6 SioReceive 引数が正常であれば 受信バッファのデータを取得します 7 SioGetSBSize 引数が正常であれば 送信バッファ内に残っているデータのサイズを取得します 8 SioGetRBSize 引数が正常であれば 受信バッファ内に残っているデータのサイズを取得します 9 SioSBClear 引数が正常であれば 送信バッファをクリアします 10 SioRBClear 引数が正常であれば 受信バッファをクリアします 11 SioSYNCHunt 引数が正常であれば SIO_ERROR_SUCCESS を返します 12 SioControl RS-232C の場合 ER 信号と RS 信号をセットできます RS-485 の場合 C 信号をセットできます 13 SioStatus 引数が正常であれば 制御信号状態が取得できます 14 SioEnableTransmitter 引数が正常であれば SIO_ERROR_SUCCESS を返します 15 SioSetEventMask SIO_EVT_RXTRIGGER イベントのみ アンマスク時に発生させることが 出来ます 16 SioGetEventMask 引数が正常であれば 設定しているイベントマスク値を取得できま す 17 SioSetRxFifoTrigger 引数が正常であれば 受信 FIFO トリガ値を設定できます 18 SioGetRxFifoTrigger 引数が正常であれば 受信 FIFO トリガ値を取得できます 16
第 4 章リファレンス 4.1 関数一覧 No 関数名 機 能 1 SioOpen ポートをオープンします 2 SioClose ポートをクローズします 3 SioSetConfig 通信設定を行います 4 SioGetConfig 通信設定を取得します 5 SioSend データを送信します 6 SioReceive データを受信します 7 SioGetSBSize 送信バッファ内に残っているデータのサイズを取得します 8 SioGetRBSize 受信バッファ内に残っているデータのサイズを取得します 9 SioSBClear 送信バッファをクリアします 10 SioRBClear 受信バッファをクリアします 11 SioSYNCHunt ハントモードに入ります 12 SioControl 制御信号の設定 ブレーク信号の送信 停止 RS-485 ドライバ制御を行います 13 SioStatus 現在の制御信号 通信エラー発生状態を取り出します 14 SioEnableTransmitter 送受信ラインを切り換えます 15 SioSetEventMask イベントマスクを設定します 16 SioGetEventMask イベントマスクを取得します 17 SioSetRxFifoTrigger 受信 FIFO トリガ値を設定します 18 SioGetRxFifoTrigger 受信 FIFO トリガ値を取得します 17
4.2 関数個別説明 1.SioOpen ポートのオープンを行います int SioOpen( int nportno /* ポート番号 */ ); パラメータ nportno ポート番号を指定します 戻り値正常終了した場合は SIO_ERROR_SUCCESS が返されます 関数が失敗すると 以下のエラー情報が返されます 識別子エラー内容 SIO_ERROR_PORT_NOT_FOUND 指定したポートが見つかりません SIO_ERROR_PORT_ALREADY_OPEN 指定したポートは既に開かれています SIO_ERROR_INVALID_PARAMETER パラメータに誤りがあります 使用例 int nret; nret = SioOpen(SIO_PORTNO_4101_0_1); SIO_PORTNO_4101_0_1 で指定されるポートをオープンします 備考 ポートオープン直後は以下のパラメータで初期化されています SioSetConfig 関数により通信パラメータを適切な値に設定してください パラメータ PCI/CTP/CPZ-4101 PCI/CTP/CPZ-4102 同期方式 調歩同期 (X16) 調歩同期 (X16) 通信方式 全二重 2 線式半二重 ( 手動 ) ボーレート 9600bps 9600bps パリティ パリティなし パリティなし ストップビット長 1 bit 1 bit データ長 8 bit 8 bit 制御信号 すべて OFF データライン 送信ライン無効 受信ライン有効 18
2.SioClose ポートのクローズを行います int SioClose( int nportno /* ポート番号 */ ); パラメータ nportno SioOpen 関数でオープンしたポート番号を指定してください 戻り値正常終了した場合は SIO_ERROR_SUCCESS が返されます 関数が失敗すると 以下のエラー情報が返されます 識別子エラー内容 SIO_ERROR_NOT_OPEN 指定したポートは開かれていません SIO_ERROR_INVALID_PARAMETER パラメータに誤りがあります 使用例 int nret; nret = SioOpen(SIO_PORTNO_4101_0_1); if(nret== SIO_ERROR_SUCCESS){ : : nret = SioClose(SIO_PORTNO_4101_0_1); } SIO_PORTNO_4101_0_1 で指定されるポートをクローズします 19
3.SioSetConfig ポートの通信設定を行います int SioSetCongfig ( int nportno, /* ポート番号 */ PSIO_CONFIG pconfig /* 通信設定構造体 */ ); パラメータ nportno SioOpen 関数でオープンしたポート番号を指定してください pconfig 通信設定が格納された構造体のポインタを指定します 戻り値正常終了した場合は SIO_ERROR_SUCCESS が返されます 関数が失敗すると 以下のエラー情報が返されます 識別子エラー内容 SIO_ERROR_NOT_OPEN 指定したポートは開かれていません SIO_ERROR_NOT_ALLOCATE_MEMORY メモリの割り当てに失敗しました SIO_ERROR_INVALID_PARAMETER パラメータに誤りがあります 使用例 int nret; SIO_CONFIG Config; SioGetConfig(SIO_PORTNO_4101_0_1, &Config); Config.ulBps = 9600; nret = SioSetConfig(SIO_PORTNO_4101_0_1, &Config); ボーレートを 9600bps に設定します 備考通信パラメータの一部のみを変更する場合でも 他のパラメータを適切な値にするため SioGetConfig 関数で通信設定構造体を取得してから該当するパラメータを修正して下さい RS C ER 制御信号はこの関数実行時に OFF になります 20
4.SioGetConfig ポートの通信設定を取得します int SioGetConfig( int nportno, /* ポート番号 */ PSIO_CONFIG pconfig /* 通信設定構造体 */ ); パラメータ nportno SioOpen 関数でオープンしたポート番号を指定してください pconfig 通信設定を格納する構造体のポインタを指定します 戻り値正常終了した場合は SIO_ERROR_SUCCESS が返されます 関数が失敗すると 以下のエラー情報が返されます 識別子エラー内容 SIO_ERROR_NOT_OPEN 指定したポートは開かれていません SIO_ERROR_INVALID_PARAMETER パラメータに誤りがあります 使用例 int nret; SIO_CONFIG Config nret = SioGetConfig(SIO_PORTNO_4101_0_1, &Config); 通信設定を取得します 21
5.SioSend データの送信を行います int SioSend( int nportno, /* ポート番号 */ void *pbuffer, /* 送信データ */ unsigned long ullength /* データ長 */ ); パラメータ nportno SioOpen 関数でオープンしたポート番号を指定してください pbuffer 送信データへのポインタを指定します ullengh 送信データのサイズをバイト単位で指定します 戻り値正常終了した場合は SIO_ERROR_SUCCESS が返されます 関数が失敗すると 以下のエラー情報が返されます 識別子エラー内容 SIO_ERROR_NOT_OPEN 指定したポートは開かれていません SIO_ERROR_INVALID_PARAMETER パラメータに誤りがあります SIO_ERROR_BUFFER_FULL 送信バッファに空きがありません 使用例 int nret; nret = SioSend( SIO_PORTNO_4101_0_1, GPC-4101, 8 ); データを送信します 22
6.SioReceive 受信データの取得を行います int SioReceive( int nportno, /* ポート番号 */ void *pbuffer, /* 受信データ */ unsigned long *ullength /* 受信データ長 */ ); パラメータ nportno SioOpen 関数でオープンしたポート番号を指定してください pbuffer 受信データを格納するバッファへのポインタを指定します ullengh 取得するデータのサイズをバイト単位で指定します 関数実行後実際に取得されたサイズが返されます 受信データが指定されたサイズに満たさない場合 取得できる全データサイズが返されます 戻り値正常終了した場合は SIO_ERROR_SUCCESS が返されます 関数が失敗すると 以下のエラー情報が返されます 識別子エラー内容 SIO_ERROR_NOT_OPEN 指定したポートは開かれていません SIO_ERROR_INVALID_PARAMETER パラメータに誤りがあります 使用例 int nret; char Buffer[128]; unsigned long ullength; ullength = 4; nret = SioReceive( SIO_PORTNO_4101_0_1, &Buffer[0], &ullength ); データを受信します 備考ドライバの受信バッファがフルになるとそれ以降受信されたデータは破棄されます またキャラクタ同期通信時はフルの状態になると自動的にハントモードに入ります 23
7.SioGetSBSize 送信バッファ内に残っているデータのサイズを取得します int SioGetSBSize( int nportno, /* ポート番号 */ unsigned long *ultxbuffercount /* 残り送信データのサイズ格納変数へのポインタ */ ); パラメータ nportno SioOpen 関数でオープンしたポート番号を指定してください ultxbuffercount 送信バッファに残っている送信データのバイト数を返す変数へのポインタを指定します 戻り値正常終了した場合は SIO_ERROR_SUCCESS が返されます 関数が失敗すると 以下のエラー情報が返されます 識別子エラー内容 SIO_ERROR_NOT_OPEN 指定したポートは開かれていません SIO_ERROR_INVALID_PARAMETER パラメータに誤りがあります 使用例 int nret; unsigned long ulbuffercount; nret = SioGetSBSize(SIO_PORTNO_4101_0_1, &ulbuffercount); 送信バッファに格納されているデータのサイズを取得します 24
8.SioGetRBSize 受信バッファ内に残っているデータのサイズを取得します int SioGetRBSize( int nportno, /* ポート番号 */ unsigned long *ulrxbuffercount /* 残り受信データのサイズ格納変数へのポインタ */ ); パラメータ nportno SioOpen 関数でオープンしたポート番号を指定してください ulrxbuffercount 受信バッファに残っている受信データのバイト数を返す変数へのポインタを指定します 戻り値正常終了した場合は SIO_ERROR_SUCCESS が返されます 関数が失敗すると 以下のエラー情報が返されます 識別子エラー内容 SIO_ERROR_NOT_OPEN 指定したポートは開かれていません SIO_ERROR_INVALID_PARAMETER パラメータに誤りがあります 使用例 int nret; unsigned long ulbuffercount; nret = SioGetRBSize( SIO_PORTNO_4101_0_1, &ulbuffercount); 受信バッファに格納されているデータのサイズを取得します 25
9.SioSBClear 送信バッファをクリアします int SioSBClear( int nportno /* ポート番号 */ ); パラメータ nportno SioOpen 関数でオープンしたポート番号を指定してください 戻り値正常終了した場合は SIO_ERROR_SUCCESS が返されます 関数が失敗すると 以下のエラー情報が返されます 識別子エラー内容 SIO_ERROR_NOT_OPEN 指定したポートは開かれていません SIO_ERROR_INVALID_PARAMETER パラメータに誤りがあります 使用例 int nret; nret = SioSBClear( SIO_PORTNO_4101_0_1 ); 送信バッファをクリアします 26
10.SioRBClear 受信バッファをクリアします int SioRBClear( int nportno /* ポート番号 */ ); パラメータ nportno SioOpen 関数でオープンしたポート番号を指定してください 戻り値正常終了した場合は SIO_ERROR_SUCCESS が返されます 関数が失敗すると 以下のエラー情報が返されます 識別子エラー内容 SIO_ERROR_NOT_OPEN 指定したポートは開かれていません SIO_ERROR_INVALID_PARAMETER パラメータに誤りがあります 使用例 int nret; nret = SioRBClear(SIO_PORTNO_4101_0_1); 受信バッファをクリアします 27
11.SioSYNCHunt ハントモードに入り受信バッファをクリアします int SioSYNCHunt( int nportno, /* ポート番号 */ unsigned long ulclearflag /* バッファクリアフラグ */ ); パラメータ nportno SioOpen 関数でオープンしたポート番号を指定してください ulclearflag 受信バッファをクリアするか指定します 識別子内容 SIO_HUNT_NORMAL 受信バッファをクリアしません SIO_HUNT_RBCLEAR 受信バッファをクリアします 戻り値正常終了した場合は SIO_ERROR_SUCCESS が返されます 関数が失敗すると 以下のエラー情報が返されます 識別子エラー内容 SIO_ERROR_NOT_OPEN 指定したポートは開かれていません SIO_ERROR_INVALID_PARAMETER パラメータに誤りがあります SIO_ERROR_NOT_SUPPORTED サポートしていない関数です 使用例 int nret; nret = SioSYNCHunt( SIO_PORTNO_4101_0_1, SIO_HUNT_RBCLEAR ); ハントモードに入り 受信バッファをクリアします 28
12.SioControl 制御信号の出力状態を変更します int SioContol( int nportno, /* ポート番号 */ unsigned long ulcommand, /* 予約 */ unsigned long ulmodemstatus /* 制御信号情報 */ ); パラメータ nportno SioOpen 関数でオープンしたポート番号を指定してください ulcommand 予約です 0 を指定してください ulmodemstatus 制御信号情報を格納した変数です bit31~ bit5 bit4 bit3 bit2 bit1 bit0 bit6 RS-232C 予約 GO4 GO3 GO2 GO1 ER RS RS-485 予約 予約 予約 予約 予約 予約 C 0 = OFF 1 = ON 戻り値正常終了した場合は SIO_ERROR_SUCCESS が返されます 関数が失敗すると 以下のエラー情報が返されます 識別子エラー内容 SIO_ERROR_NOT_OPEN 指定したポートは開かれていません SIO_ERROR_INVALID_PARAMETER パラメータに誤りがあります 使用例 int nret; unsigned long ulmodemstatus; ulmodemstatus = 0x00000001; nret = SioControl(SIO_PORTNO_4101_0_1, 0, ulmodemstatus); RS 信号を ON にします 29
13.SioStatus 制御信号の状態 通信エラー発生状態を取得します int SioStatus( int nportno, /* ポート番号 */ unsigned long ulcommand, /* 予約 */ unsigned long *ulmodemstatus /* 制御信号情報を格納する変数へのポインタ */ ); パラメータ nportno SioOpen 関数でオープンしたデバイス番号を指定してください ulcommand 予約です 0 を指定してください ulmodemstatus 制御信号情報を格納する変数へのポインタを指定します bit31~ bit11 bit10 bit9 bit8 bit7~ bit5 bit4 bit3 bit2 bit1 bit0 RS-232C 予約 FE OVE PE 予約 GI1 CD CI DR CS RS-485 予約 FE OVE PE 予約 予約 予約 予約 予約 I OVE PE FE GI1 CD CI DR CS I 1: オーバランエラーを検出しました 0: オーバランエラーを検出していません 1: パリティエラーを検出しました 0: パリティエラーを検出していません 1: フレーミングエラーを検出しました 0: フレーミングエラーを検出していません 1:GI1 信号が ON です 0:GI1 信号が OFF です 1:CD 信号が ON です 0:CD 信号が OFF です 1:CI 信号が ON です 0:CI 信号が OFF です 1:DR 信号が ON です 0:DR 信号が OFF です 1:CS 信号が ON です 0:CS 信号が OFF です 1:I 信号が ON です 0:I 信号が OFF です 戻り値正常終了した場合は SIO_ERROR_SUCCESS が返されます 関数が失敗すると 以下のエラー情報が返されます 識別子エラー内容 SIO_ERROR_NOT_OPEN 指定したポートは開かれていません SIO_ERROR_INVALID_PARAMETER パラメータに誤りがあります 30
使用例 int nret; unsigned long ulmodemstatus; nret = SioStatus(SIO_PORTNO_4101_0_1, &ulmodemstatus); ポート制御信号情報を取得します 31
14.SioEnableTransmitter RS-485 半二重通信の送受信ラインを切り換えます (RS-485 のみ ) int SioEnableTransmitter ( int nportno, /* ポート番号 */ unsigned long uldatalineflag, /* 送受信データライン状態 */ unsigned long ulclocklineflag /* クロックライン状態 */ ); パラメータ nportno SioOpen 関数でオープンしたポート番号を指定してください uldatalineflag 送受信データライン状態を設定します 識別子内容 SIO_DATALINE_RX 送信ライン (T) 無効受信ライン (R) 有効 SIO_DATALINE_TX 送信ライン (T) 有効受信ライン (R) 無効 ulclocklineflag クロックライン状態を設定します 識別子 SIO_CLOCKLINE_DISABLE SIO_CLOCKLINE_ENABLE 内容 ST 端子からクロックを出力しません ST 端子からクロックを出力します 戻り値正常終了した場合は SIO_ERROR_SUCCESS が返されます 関数が失敗すると 以下のエラー情報が返されます 識別子エラー内容 SIO_ERROR_NOT_OPEN 指定したポートは開かれていません SIO_ERROR_INVALID_PARAMETER パラメータに誤りがあります SIO_ERROR_NOT_SUPPORTED 本 API は呼び出せません 未サポートです 使用例 int nret; nret = SioEnableTransmitter( SIO_PORTNO_4102_0_1, SIO_DATALINE_RX, SIO_CLOCKLINE_DISABLE ); データラインを受信に切り替えます 32
15.SioSetEventMask 割り込みイベントマスクを設定します int SioSetEventMask( int nportno, /* ポート番号 */ unsigned long uleventmask /* イベント発生要因 */ ); パラメータ PortNo ポート番号を指定します uleventmask イベント発生要因のマスク / アンマスクを設定する変数へのポインタを指定します bit31~ bit14 bit13 bit12 bit11 bit10 bit9 bit8 bit15 RS-232C 予約 予約 予約 予約 TXEMPTY 予約 RXT HUNT RS-485 予約 予約 予約 予約 TXEMPTY 予約 RXT HUNT bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 RS-232C CD CI DR CS 予約 PE OVE FE RS-485 予約 予約 予約 I 予約 PE OVE FE 0 = マスク ( イベントは発生しません ) 1 = アンマスク ( イベントが発生します ) ニモニック 説明 識別子 FE フレーミングエラーが発生したとき SIO_EVT_FE OVE オーバランエラーが発生したとき SIO_EVT_OVE PE パリティエラーが発生したとき SIO_EVT_PE CS CS 信号の入力状態に変化があったとき SIO_EVT_CS I I 信号の入力状態に変化があったとき SIO_EVT_CS DR DR 信号の入力状態に変化があったとき SIO_EVT_DR CI CI 信号の入力状態に変化があったとき SIO_EVT_CI CD CD 信号の入力状態に変化があったとき SIO_EVT_CD HUNT 終端パターンを検知しハントモードに入ったとき SIO_EVT_HUNT RXT 受信データ長が SIO_CONFIG 構造体の ulrxeventtrigger SIO_EVT_RXTRIGGER メンバで指定された値に達したとき TXEMPTY 送信バッファがすべて空になったとき SIO_EVT_TXEMPTY 戻り値正常終了した場合は SIO_ERROR_SUCCESS が返されます 関数が失敗すると 以下のエラー情報が返されます 識別子内容 SIO_ERROR_NOT_OPEN 指定したポートは開かれていません SIO_ERROR_INVALID_PARAMETER パラメータに誤りがあります 33
使用例 int nret; nret = SioSetEventMask(SIO_PORTNO_4101_0_1, SIO_EVT_CS); CS 制御信号変化時コールバック関数を呼び出します 34
16.SioGetEventMask 割り込みイベントマスクを取得します int SioGetEventMask( int nportno, /* ポート番号 */ unsigned long *uleventmask /* イベント発生要因 */ ); パラメータ nportno ポート番号を指定します uleventmask イベント発生要因のマスク / アンマスクを取得する変数へのポインタを指定します bit31~ bit14 bit13 bit12 bit11 bit10 bit9 bit8 bit15 RS-232C 予約 予約 予約 予約 TXEMPTY 予約 RXT HUNT RS-485 予約 予約 予約 予約 TXEMPTY 予約 RXT HUNT bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 RS-232C CD CI DR CS 予約 PE OVE FE RS-485 予約 予約 予約 I 予約 PE OVE FE 0 = マスク ( イベントは発生しません ) 1 = アンマスク ( イベントが発生します ) ニモニック 説明 識別子 FE フレーミングエラーが発生したとき SIO_EVT_FE OVE オーバランエラーが発生したとき SIO_EVT_OVE PE パリティエラーが発生したとき SIO_EVT_PE CS CS 信号の入力状態に変化があったとき SIO_EVT_CS I I 信号の入力状態に変化があったとき SIO_EVT_CS DR DR 信号の入力状態に変化があったとき SIO_EVT_DR CI CI 信号の入力状態に変化があったとき SIO_EVT_CI CD CD 信号の入力状態に変化があったとき SIO_EVT_CD HUNT 終端パターンを検知しハントモードに入ったとき SIO_EVT_HUNT RXT 受信データ長が SIO_CONFIG 構造体の ulrxeventtrigger SIO_EVT_RXTRIGGER メンバで指定された値に達したとき TXEMPTY 送信バッファがすべて空になったとき SIO_EVT_TXEMPTY 戻り値正常終了した場合は SIO_ERROR_SUCCESS が返されます 関数が失敗すると 以下のエラー情報が返されます 識別子内容 SIO_ERROR_NOT_OPEN 指定したポートは開かれていません SIO_ERROR_INVALID_PARAMETER パラメータに誤りがあります 35
使用例 unsigned long uleventmask; SioGetEventMask(SIO_PORTNO_4101_0_1, &uleventmask); 割り込みイベントマスクを取得します 36
17.SioSetRxFifoTrigger 受信 FIFO トリガ値を設定します ここでいうトリガとは ドライバ内部で割り込みが発生するタイミングのことをいいますので 通常はこのトリガ値を意識する必要はありません int SioSetRxFifoTrigger( int PortNo, /* ポート番号 */ unsigned long RxFifoTrigger /* 受信 FIFO トリガ値 */ ); パラメータ PortNo ポート番号を指定します RxFifoTrigger 受信 FIFO トリガ値を指定します 下記のいずれかの値が使用できます デフォルトは SIO_RXFIFO_TRIGGER_8 です 識別子 値 内容 SIO_RXFIFO_TRIGGER_1 10h 受信データ数が 0 件 1 件で割り込み発生 SIO_RXFIFO_TRIGGER_2 20h 受信データ数が 1 件 2 件で割り込み発生 SIO_RXFIFO_TRIGGER_4 30h 受信データ数が 3 件 4 件で割り込み発生 SIO_RXFIFO_TRIGGER_8 40h 受信データ数が 7 件 8 件で割り込み発生 SIO_RXFIFO_TRIGGER_16 50h 受信データ数が 15 件 16 件で割り込み発生 SIO_RXFIFO_TRIGGER_32 60h 受信データ数が 31 件 32 件で割り込み発生 SIO_RXFIFO_TRIGGER_64 70h 受信データ数が 63 件 64 件で割り込み発生 SIO_RXFIFO_TRIGGER_128 80h 受信データ数が 127 件 128 件で割り込み発生 SIO_RXFIFO_TRIGGER_256 90h 受信データ数が 255 件 256 件で割り込み発生 SIO_RXFIFO_TRIGGER_512 A0h 受信データ数が 511 件 512 件で割り込み発生 SIO_RXFIFO_TRIGGER_1024 B0h 受信データ数が 1023 件 1024 件で割り込み発生 SIO_RXFIFO_TRIGGER_2047 C0h 受信データ数が 2046 件 2047 件で割り込み発生 戻り値正常終了した場合は SIO_ERROR_SUCCESS が返されます 関数が失敗すると 以下のエラー情報が返されます 識別子内容 SIO_ERROR_NOT_OPEN 指定したポートは開かれていません SIO_ERROR_INVALID_PARAMETER パラメータに誤りがあります 使用例 SioSetRxFifoTrigger(SIO_PORTNO_4101_0_1, SIO_RXFIFO_TRIGGER_2); 受信 FIFO トリガ値を設定します 37
18.SioGetRxFifoTrigger 受信 FIFO トリガ値を取得します ここでいうトリガとは ドライバ内部で割り込みが発生するタイミングのことをいいますので 通常はこのトリガ値を意識する必要はありません int SioGetRxFifoTrigger( int PortNo, /* ポート番号 */ unsigned long *RxFifoTrigger /* 受信 FIFO トリガ値格納変数へのポインタ */ ); パラメータ PortNo ポート番号を指定します RxFifoTrigger 受信 FIFO トリガ値を格納する変数へのポインタ指定します 下記のいずれかの値が取得できます デフォルトは SIO_RXFIFO_TRIGGER_8 です 識別子 値 内容 SIO_RXFIFO_TRIGGER_1 10h 受信データ数が 0 件 1 件で割り込み発生 SIO_RXFIFO_TRIGGER_2 20h 受信データ数が 1 件 2 件で割り込み発生 SIO_RXFIFO_TRIGGER_4 30h 受信データ数が 3 件 4 件で割り込み発生 SIO_RXFIFO_TRIGGER_8 40h 受信データ数が 7 件 8 件で割り込み発生 SIO_RXFIFO_TRIGGER_16 50h 受信データ数が 15 件 16 件で割り込み発生 SIO_RXFIFO_TRIGGER_32 60h 受信データ数が 31 件 32 件で割り込み発生 SIO_RXFIFO_TRIGGER_64 70h 受信データ数が 63 件 64 件で割り込み発生 SIO_RXFIFO_TRIGGER_128 80h 受信データ数が 127 件 128 件で割り込み発生 SIO_RXFIFO_TRIGGER_256 90h 受信データ数が 255 件 256 件で割り込み発生 SIO_RXFIFO_TRIGGER_512 A0h 受信データ数が 511 件 512 件で割り込み発生 SIO_RXFIFO_TRIGGER_1024 B0h 受信データ数が 1023 件 1024 件で割り込み発生 SIO_RXFIFO_TRIGGER_2047 C0h 受信データ数が 2046 件 2047 件で割り込み発生 戻り値正常終了した場合は SIO_ERROR_SUCCESS が返されます 関数が失敗すると 以下のエラー情報が返されます 識別子内容 SIO_ERROR_NOT_OPEN 指定したポートは開かれていません SIO_ERROR_INVALID_PARAMETER パラメータに誤りがあります 使用例 unsigned long RxFifoTrigger; SioGetRxFifoTrigger(SIO_PORTNO_4101_0_1, &RxFifoTrigger); 受信 FIFO トリガ値を取得します 38
19.CallbackProc イベント発生時に呼ばれるコールバックルーチンのプレースホルダです void CallbackProc( unsigned long uleventfactor, /* イベント発生要因 */ unsigned long uluserdata /* ユーザデータ */ ); パラメータ uleventfactor 発生したイベント要因が格納されます bit31~ bit14 bit13 bit12 bit11 bit10 bit9 bit8 bit15 RS-232C 予約 予約 予約 予約 TXEMPTY 予約 RXT HUNT RS-485 予約 予約 予約 予約 TXEMPTY 予約 RXT HUNT bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 RS-232C CD CI DR CS 予約 PE OVE FE RS-485 予約 予約 予約 I 予約 PE OVE FE 0 = イベントが発生していません 1 = イベントが発生しています ニモニック 説明 識別子 FE フレーミングエラーが発生したとき SIO_EVT_FE OVE オーバランエラーが発生したとき SIO_EVT_OVE PE パリティエラーが発生したとき SIO_EVT_PE CS CS 信号の入力状態に変化があったとき SIO_EVT_CS I I 信号の入力状態に変化があったとき SIO_EVT_CS DR DR 信号の入力状態に変化があったとき SIO_EVT_DR CI CI 信号の入力状態に変化があったとき SIO_EVT_CI CD CD 信号の入力状態に変化があったとき SIO_EVT_CD HUNT 終端パターンを検知しハントモードに入ったとき SIO_EVT_HUNT RXT 受信データ長が SIO_CONFIG 構造体の ulrxeventtrigger SIO_EVT_RXTRIGGER メンバで指定された値に達したとき TXEMPTY 送信バッファがすべて空になったとき SIO_EVT_TXEMPTY uluserdata コールバックルーチンに渡されたユーザデータが格納されます 戻り値なし 39
使用例 /* コールバックルーチン */ void CallbackProc(unsigned long EventFactor, unsigned long UserData) { unsigned long ullength; int PortNo = (int)userdata; } if(eventfactor & SOP_EVT_HUNT) { SioGetRBSize(PortNo, &ullength); SioReceive(PortNo, ReceiveBuffer, &ullength); } /* コールバックルーチンの設定 */ SIO_CONFIG Config; SioGetConfig(SIO_PORTNO_4101_0_1, &Config); Config.ulMode = SIO_BISYNC SIO_OUTSYNC_ENABLE; Config.lpCallbackProc = CallbackProc; Config.ulUserData = (unsigned long)portno; SioSetConfig(SIO_PORTNO_4101_0_1, &Config); SioSetEventMask(SIO_PORTNO_4101_0_1, SIO_EVT_HUNT); 受信データサイズが 8 バイトを超えたとき コールバック関数を呼び出します 40
4.3 戻り値一覧 エラー識別子 値 意味 SIO_ERROR_SUCCESS 0 正常終了 SIO_ERROR_PORT_NOT_FOUND C0000001h 指定したポートが見つかりません SIO_ERROR_NOT_OPEN C0000002h 措定したポートは開かれていません SIO_ERROR_PORT_ALREADY_OPEN C0000004h 指定したポートは既に開かれています SIO_ERROR_NOT_ALLOCATE_MEMORY C0001000h メモリの割り当てに失敗しました SIO_ERROR_INVALID_PARAMETER C0001001h パラメータに誤りがあります SIO_ERROR_NOT_SUPPORTED C0001002h サポートしていない関数です SIO_ERROR_BUFFER_FULL C0002001h 送信バッファに空きがありません 41
4.4 構造体 1.SIO_CONFIG 構造体ポートの初期化情報を設定する構造体です typedef struct { unsigned long ulmode; unsigned long ulline; unsigned long ulbps; unsigned long ulparity; unsigned long ulsbit; unsigned long ulclen; unsigned long ulbaseclock; unsigned long ulsclockselect; unsigned long ulrclockselect; unsigned long ulclockout; unsigned long dwschar; unsigned long ulwritetimeout; unsigned long ulreadtimeout; unsigned long uleofchar; unsigned long uleoflength; unsigned long ulrxeventtrigger; unsigned long ultxstartdelay; unsigned long ultxterminatedelay; unsigned long ulhalfduplexperiod; void* lpcallbackproc; unsigned long uluserdata; } SIO_CONFIG, *PSIO_CONFIG; メンバ ulmode 説明調歩同期 / キャラクタ同期を設定します 識別子内容 SIO_ASYNC16 調歩同期 (X16 モード ) SIO_ASYNC1 調歩同期 (X1 モード ) SIO_MONOSYNC キャラクタ同期 (Mono-Sync) SIO_BISYNC キャラクタ同期 (Bi-Sync) 調歩同期 (X1 モード ) は外部からクロックを入力して調歩同期通信を行うものです ( ボーレートファクタ 1 になります ) 一般の調歩同期通信の場合は SIO_ASYNC16 を指定してください キャラクタ同期の場合 同期解放処理を有効にするかどうかも本メンバで設定します ( 調歩同期 / キャラクタ同期設定との OR で指定します ) 識別子内容 SIO_OUTSYNC_DISABLE 同期解放処理を行いません SIO_OUTSYNC_ENABLE 同期解放処理を行います 同期解放条件は特定の 1 文字パターンが何回連続したかで設定されます ulline 全二重 / 半二重 (2 線式 4 線式 ) を設定します 識別子 SIO_FULL_DUPLEX 全二重モード 内容 42
SIO_HALF_DUPLEX_MANUAL 半二重 ( 手動制御 ) モードデータラインの切り替えは SioEnableTransmitter 関数により行います SIO_HALF_DUPLEX_AUTO1 半二重 ( 自動制御 1) モード RS-485 半二重通信の送受信ラインの切り替えを自動的に行います SIO_HALF_DUPLEX_AUTO2 半二重 ( 自動制御 2) モード RS-232C RS 信号を送信データと同期させます データ送信前に RS 信号を ON にし データ送信後 RS 信号を OFF にします RS-485 RS-485 半二重通信の送受信ラインの切り替えを自動的に行います また C 信号を送信データと同期させます データ送信前に C 信号を ON にし データ送信後 C 信号を OFF にします RS-485 半二重の場合 2 線式 /4 線式の切り替えも本メンバで行います ( 全二重 / 半二重設定との OR で指定します ) 識別子内容 SIO_WIRING_4WIRE 4 線式 SIO_WIRING_2WIRE 2 線式 <2 線式半二重 > 下記のような接続で T ラインのみ接続して送受信を行います T: 送信ライン SG: 信号グランド <4 線式半二重 > 下記のような接続で 2 線式と違い T ラインと R ラインを分けて半二重通信を行います T: 送信ライン SG: 信号グランド R: 受信ライン ulbps ulparity ボーレート (bps) を設定します 設定可能範囲は下記のとおりです 調歩同期 4~128000 キャラクタ同期 80~327680 パリティを設定します 識別子 内容 43
SIO_NONE_PARITY SIO_ODD_PARITY SIO_EVEN_PARITY パリティなし奇数パリティ偶数パリティ ulsbit ulclen ulbaseclock ストップビット長を設定します 識別子 SIO_ONESTOPBIT 1 bit SIO_ONE5STOPBITS 1.5 bit SIO_TWOSTOPBITS 2 bit データ長 (bit) を設定します 設定可能範囲は 5~8 です ボーレート基準クロックを設定します 識別子 SIO_CLK_14_7456 14.7456MHz SIO_CLK_9_8304 9.8304MHz SIO_CLK_4_096 4.096MHz SIO_CLK_12_288 12.288MHz 内容 内容 ulsclockselect ulrclockselect ulclockout dwschar 送信クロックを内部 / 外部のどちらから入力するか指定します 識別子 内容 SIO_SCLK_IN 送信クロックを内部にします SIO_SCLK_ST2 RS-232C 送信クロックを ST2 端子から入力します RS-485 送信クロックを ST 端子から入力します SIO_SCLK_RT 送信クロックを RT 端子から入力します 受信クロックを内部 / 外部のどちらから入力するか指定します 識別子 内容 SIO_RCLK_IN 受信クロックを内部にします SIO_RCLK_ST2 RS-232C 受信クロックを ST2 端子から入力します RS-485 受信クロックを ST 端子から入力します SIO_RCLK_RT 受信クロックを RT 端子から入力します クロックをコネクタの ST 端子から出力するかどうかの指定もします RS-485 半二重の場合のみ有効です 識別子内容 SIO_STCLK_NOOUT クロックを ST 端子から出力しません SIO_STCLK_OUT クロックを ST 端子から出力します ( 常時出力 ) SIO_STCLK_OUT_HANDSHAKE クロックを ST 端子から出力します ( 送信に同期 ) 同期キャラクタを設定します ulmode の設定により内容が異なります ulmode 内容 SIO_ASYNC16 本パラメータは無効です SIO_ASYNC1 SIO_MONOSYNC 下位 8bit が同期キャラクタとなります SIO_BISYNC 上位 8bit が同期キャラクタ 1 下位 8bit が同期キャラクタ 2 となります 44
ulwritetimeout ulreadtimeout uleofchar uleoflength ulrxeventtrigger ultxstartdelay ultxterminatedelay ulhalfduplexperiod 予約です 0 を指定してください 予約です 0 を指定してください 同期解放条件の特定の 1 文字パターンを指定します 設定可能範囲は 00h~FFh です 一般的に同期解放パターンはマーク状態 (FFh) を指定します SioSend 関数で同期解放文字は自動で付加されません 送信データに付加してください 同期解放文字数を指定します 設定可能範囲は 1~256 です 例えば文字数を 2 として同期解放文字が連続した場合 2 文字までは受信データとなり それ以降は同期解放されて同期確立待ちとなり その間のデータは受信されません また 同期解放文字はデータとして受信されます 受信バッファトリガレベルを設定します 単位はバイトです 受信バッファサイズがトリガレベルに達したとき イベントが発生します 送信前切り替え時間を指定します (ulline メンバが SIO_HALF_DUPLEX_AUTO1 SIO_HALF_DUPLEX_AUTO2 の場合のみ有効 ) 設定範囲は 0 または 10~999[ms] です 送信後切り替え時間を指定します (ulline メンバが SIO_HALF_DUPLEX_AUTO1 SIO_HALF_DUPLEX_AUTO2 の場合のみ有効 ) 設定範囲は 0 または 10~999[ms] です 半二重送信処理呼び出し周期を指定します 下記の値が設定可能です 識別子内容 SIO_PERIOD_10ms 10ms SIO_PERIOD_50ms 50ms SIO_PERIOD_100ms 100ms 半二重 ( 自動制御 1 または自動制御 2) 通信時 SioSend 関数が呼ばれると バッググラウンドで以下の手順を実行します 下記処理の各フェーズを呼び出す周期を本メンバにより設定します 周期を短くすることで半二重送信処理が短くなりますが 送信処理の負荷が高くなります RS-232C の半二重送信処理 1.RS 信号を ON にします 2. 送信前切り替え時間待ちます 3. 通信コントローラにデータを書き込みます 4. 全データが回線に送出されるまで待ちます 5. 送信後切り替え時間待ちます 6.RS 信号を OFF にします 45
RS-485 の半二重送信処理 1. データラインを送信に切り替えます 2. 自動制御 2 の場合 C 信号を ON にします 3. 送信前切り替え時間待ちます 4. 通信コントローラにデータを書き込みます 5. 全データが回線に送出されるまで待ちます 6. 送信後切り替え時間待ちます 7. データラインを受信に切り替えます 8. 自動制御 2 の場合 C 信号を OFF にします lpcallbackproc uluserdata コールバック関数へのポインタを指定します コールバック関数の第 2 引数に渡されるパラメータ ( ユーザデータ ) を指定します 46
第 5 章サンプルプログラム 5.1 データ送信サンプルプログラムデータ送信を行うサンプルプログラムです RSW1 設定値が 0 の PCI-4101 のチャンネル 1 から キーボードより入力した文字列データを全二重方式で送信します CTRL + \ キーが押されたらプログラムを終了します #cd /usr/src/interface/gpg4101/i386/linux/samples/c/fd_send #make #./fd_send 5.2 データ受信サンプルプログラムデータ受信を行うサンプルプログラムです RSW1 設定値が 0 の PCI-4101 のチャンネル 2 で 送信側からのデータを受信します CTRL + \ キーが押されたらプログラムを終了します #cd /usr/src/interface/gpg4101/i386/linux/samples/c/fd_receive #make #./fd_receive 5.3 調歩同期送信サンプルプログラム調歩同期でデータの送信を行うサンプルプログラムです RSW1 設定値が 0 の PCI-4101 のチャンネル 1 で データを送信します #cd /usr/src/interface/gpg4101/i386/linux/samples/c/sendasync #make #./SendAsync 5.4 調歩同期受信サンプルプログラム調歩同期でデータの受信を行うサンプルプログラムです RSW1 設定値が 0 の PCI-4101 のチャンネル 1 で データを受信します #cd /usr/src/interface/gpg4101/i386/linux/samples/c/receiveasync #make #./ReceiveAsync 5.5 キャラクタ同期送信サンプルプログラムキャラクタ同期でデータの送信を行うサンプルプログラムです RSW1 設定値が 0 の PCI-4101 のチャンネル 1 で データを送信します #cd /usr/src/interface/gpg4101/i386/linux/samples/c/sendsync #make #./SendSync 5.6 キャラクタ同期受信サンプルプログラムキャラクタ同期でデータの受信を行うサンプルプログラムです RSW1 設定値が 0 の PCI-4101 のチャンネル 1 で データを受信します #cd /usr/src/interface/gpg4101/i386/linux/samples/c/receivesync #make #./ReceiveSync 47
5.7 データ送信サンプルプログラムデータ送信を行うサンプルプログラムの Kylix 版です 5.1 と同じく RSW1 設定値が 0 の PCI-4101 のチャンネル 1 から キーボードより入力した文字列データを全二重方式で送信します CTRL + \ キーが押されたらプログラムを終了します #cd /usr/src/interface/gpg4101/i386/linux/samples/kylix/fd_send #make #./fd_send 5.8 データ受信サンプルプログラムデータ受信を行うサンプルプログラムの Kylix 版です 5.2 と同じく RSW1 設定値が 0 の PCI-4101 のチャンネル 2 で 送信側からのデータを受信します CTRL + \ キーが押されたらプログラムを終了します #cd /usr/src/interface/gpg4101/i386/linux/samples/kylix/fd_receive #make #./fd_receive 5.9 調歩同期送信サンプルプログラム調歩同期でデータの送信を行うサンプルプログラムの Kylix 版です 5.3 と同じく RSW1 設定値が 0 の PCI-4101 のチャンネル 1 で データを送信します #cd /usr/src/interface/gpg4101/i386/linux/samples/kylix/sendasync #make #./SendAsync 5.10 調歩同期受信サンプルプログラム調歩同期でデータの受信を行うサンプルプログラムの Kylix 版です 5.4 と同じく RSW1 設定値が 0 の PCI-4101 のチャンネル 1 で データを受信します #cd /usr/src/interface/gpg4101/i386/linux/samples/kylix/receiveasync #make #./ReceiveAsync 5.11 キャラクタ同期送信サンプルプログラムキャラクタ同期でデータの送信を行うサンプルプログラムの Kylix 版です 5.5 と同じく RSW1 設定値が 0 の PCI-4101 のチャンネル 1 で データを送信します #cd /usr/src/interface/gpg4101/i386/linux/samples/kylix/sendsync #make #./SendSync 5.12 キャラクタ同期受信サンプルプログラムキャラクタ同期でデータの受信を行うサンプルプログラムの Kylix 版です 5.6 と同じく RSW1 設定値が 0 の PCI-4101 のチャンネル 2 で データを受信します #cd /usr/src/interface/gpg4101/i386/linux/samples/kylix/receivesync #make #./ReceiveSync 48
第 6 章重要な情報 保証の内容と制限弊社は本ドキュメントに含まれるソースプログラムの実行が中断しないこと またはその実行に誤りが無いことを保証していません 本製品の品質や使用に起因する 性能に起因するいかなるリスクも使用者が負うものとします 弊社はドキュメント内の情報の正確さに万全を期しています 万一 誤記または誤植などがあった場合 弊社は予告無く改訂する場合があります ドキュメントまたはドキュメント内の情報に起因するいかなる損害に対しても弊社は責任を負いません ドキュメント内の図や表は説明のためであり ユーザ個別の応用事例により変化する場合があります 著作権 知的所有権弊社は本製品に含まれるおよび本製品に対する権利や知的所有権を保持しています 本製品はコンピュータソフトウェア 映像 / 音声 ( 例えば図 文章 写真など ) を含んでいます 医療機器 / 器具への適用における注意弊社の製品は人命に関わるような状況下で使用される機器に用いられる事を目的として設計 製造された物では有りません 弊社の製品は人体の検査などに使用するに適する信頼性を確保する事を意図された部品や検査機器と共に設計された物では有りません 医療機器 治療器具などの本製品の適用により 製品の故障 ユーザ 設計者の過失などにより 損傷 / 損害を引き起こす場合が有ります 複製の禁止弊社の許可なく 本ドキュメントの全て または一部に関わらず 複製 改変などを行うことはできません 責任の制限弊社は 弊社または再販売者の予見の有無にかかわらず発生したいかなる特別損害 偶発的損害 間接的な損害 重大な損害について 責任を負いません 本製品 ( ハードウェア, ソフトウェア ) のシステム組み込み 使用 ならびに本製品から得られる結果に関する一切のリスクについては 本製品の使用者に帰属するものとします 本製品に含まれるバグ あるいは本製品の供給 ( 納期遅延 ) 性能もしくは使用に起因する付帯的損害もしくは間接的損害に対して 弊社に全面的に責がある場合でも 弊社はその製品に対する改良 ( 正常に動作する ) 代品交換までとし 金銭面での賠償の責任は負わないものとしますので 予めご了承ください 本製品 ( ソフトウェアを含む ) は 日本国内仕様です 本製品を日本国外で使用された場合 弊社は一切責任を負いかねます また 弊社は本製品に関し 海外での保守サービスおよび技術サポート等は行っておりません 商標 / 登録商標本書に掲載されている会社名 製品名は それぞれ各社の商標または登録商標です 49