• 検索結果がありません。

関数個別説明

ドキュメント内 GPC-4116 (ページ 36-95)

第 4 章 リファレンス(HDLC通信部) 35

4.2 関数個別説明

1. HdlcOpen

【機能】

HDLC インタフェースモジュールのオープンを行い、以後のインタフェースモジュールへのアクセ スを行えるようにします。

【書式】

●C 言語(x86 専用) HANDLE HdlcOpen(

LPCTSTR lpszName, PHDLCNPORTINITDATA pInitData );

●C 言語(x64 専用) HANDLE HdlcOpen(

LPCSTR lpszName, PHDLCNPORTINITDATA pInitData );

●Visual Basic

Declare Function HdlcOpen Lib "FbiHdlc.DLL"( _ ByVal lpszName As String, _

ByRef pInitData As HDLCNPORTINITDATA _ ) As Long

●Delphi

function HdlcOpen(

lpszName: String;

var pInitData: HDLCNPORTINITDATA ):THandle; stdcall; external 'FbiHdlc.DLL';

【パラメータ】

lpszName

オープンするデバイス名を指定します。

pInitData

ポート初期化情報構造体(HDLCNPORTINTIDATA構造体)へのポインタを指定します。

【戻り値】

関数が正常に終了した場合には、有効なハンドルが返されます。

他の関数は、本関数により取得したハンドルを使用してデバイスの制御を行います。

オープンに失敗した場合には、INVALID_HANDLE_VALUE(-1)が返されます。

© 1999, 2016 Interface Corporation. All rights reserved.

37

●UNICODE 文字列について

C 言語(x86 専用)で、HdlcOpen の引数 lpszName に指定する文字列は LPCTSTR 型として定義してい ますが、UNICODE 文字列には対応しておりません。

x86 環境でご使用になる場合、使用例に沿って記述してください。

【使用例】

●C 言語(x86 専用)

HDLCNPORTINITDATA PortInit;

HANDLE hDevice;

/* ポート初期化 */

ZeroMemory(&PortInit, sizeof(HDLCNPORTINITDATA));

PortInit.uLineMode = HDLC_LINE_HALF; /* 半二重 */

PortInit.uTxc = HDLC_SCLK_PTC; /* 送信内部クロック */

PortInit.uRxc = HDLC_RCLK_DPLL; /* 受信 DPLL */

PortInit.uSourceClock = HDLC_CLOCK_32000000; /* 内部クロック 32MHz */

PortInit.uBaudRate = 250000; /* 250kbps */

PortInit.uInterface = HDLC_INTERFACE_485; /* RS-485 */

PortInit.uFormat = HDLC_FORMAT_NRZI; /* 符号化フォーマット NRZI */

PortInit.uFcs = HDLC_FCS_16; /* FCS 生成多項式 ITUT FCS16 */

PortInit.uAddressMode = HDLC_ADDRESS_NONE; /* アドレス検出を行わない */

PortInit.uTxcMode = HDLC_STOUT_NONE; /* クロックを出力しない */

PortInit.uSendTiming = 100 | HDLC_TIME_MICRO_SEC; /* 送信前切り替え時間 100us */

PortInit.uCloseTiming = 100 | HDLC_TIME_MICRO_SEC; /* 送信後切り替え時間 100us */

hDevice = HdlcOpen((LPCTSTR)"FBIHDLC1", &PortInit);

if(hDevice == INVALID_HANDLE_VALUE){

/* オープンに失敗 */

printf("Fail to open the port\n");

} else {

/* 実際に設定された送信前切り替え時間を表示 */

if(PortInit.uSendTiming & HDLC_TIME_MICRO_SEC) {

printf("SendTiming = %ld us", (PortInit.uSendTiming & ~HDLC_TIME_MICRO_SEC));

} else {

printf("SendTiming = %ld ms", PortInit.uSendTiming * 10);

} }

© 1999, 2016 Interface Corporation. All rights reserved.

39 HDLCNPORTINITDATA PortInit;

HANDLE hDevice;

/* ポート初期化 */

ZeroMemory(&PortInit, sizeof(HDLCNPORTINITDATA));

PortInit.uLineMode = HDLC_LINE_HALF; /* 半二重 */

PortInit.uTxc = HDLC_SCLK_PTC; /* 送信内部クロック */

PortInit.uRxc = HDLC_RCLK_DPLL; /* 受信 DPLL */

PortInit.uSourceClock = HDLC_CLOCK_32000000; /* 内部クロック 32MHz */

PortInit.uBaudRate = 250000; /* 250kbps */

PortInit.uInterface = HDLC_INTERFACE_485; /* RS-485 */

PortInit.uFormat = HDLC_FORMAT_NRZI; /* 符号化フォーマット NRZI */

PortInit.uFcs = HDLC_FCS_16; /* FCS 生成多項式 ITUT FCS16 */

PortInit.uAddressMode = HDLC_ADDRESS_NONE; /* アドレス検出を行わない */

PortInit.uTxcMode = HDLC_STOUT_NONE; /* クロックを出力しない */

PortInit.uSendTiming = 100 | HDLC_TIME_MICRO_SEC; /* 送信前切り替え時間 100us */

PortInit.uCloseTiming = 100 | HDLC_TIME_MICRO_SEC; /* 送信後切り替え時間 100us */

hDevice = HdlcOpen("FBIHDLC1", &PortInit);

if(hDevice == INVALID_HANDLE_VALUE){

/* オープンに失敗 */

printf("Fail to open the port\n");

} else {

/* 実際に設定された送信前切り替え時間を表示 */

if(PortInit.uSendTiming & HDLC_TIME_MICRO_SEC) {

printf("SendTiming = %ld us", (PortInit.uSendTiming & ~HDLC_TIME_MICRO_SEC));

} else {

printf("SendTiming = %ld ms", PortInit.uSendTiming * 10);

} }

●Visual Basic Dim hDevice As Long Dim szMessage As String

Dim PortInit As HDLCNPORTINITDATA ' ポート初期化

' 構造体メンバへの代入処理省略

hDevice = HdlcOpen("FBIHDLC1", PortInit) If hDevice = -1 Then

' オープンに失敗

MsgBox("Fail to open the port") Else

' 実際に設定された送信前切り替え時間を表示

If (PortInit.uSendTiming AND HDLC_TIME_MICRO_SEC) <> 0 Then

szMessage = "SendTiming = " & Str(PortInit.uSendTiming AND 65536) szMessage = szMessage & " us"

Else

szMessage = "SendTiming = " & Str(PortInit.uSendTiming * 10) & " ms"

End If

MsgBox(szMessage) End If

© 1999, 2016 Interface Corporation. All rights reserved.

41

●Delphi var

hDevice: THandle;

szMessage: String;

S: String;

PortInit: HDLCNPORTINITDATA;

begin

// ポート初期化

// 構造体メンバへの代入処理省略

hDevice := HdlcOpen('FBIHDLC2', PortInit);

if hDevice = INVALID_HANDLE_VALUE then begin

// オープンに失敗

MessageDlg('Fail to open the port', mtInformation, [mbOK], 0);

end else begin

// 実際に設定された送信前切り替え時間を表示

if (PortInit.uSendTiming and HDLC_TIME_MICRO_SEC) <> 0 then begin

Str(PortInit.uSendTiming and $FFFF,S);

szMessage := 'SendTiming = ' + S;

szMessage := szMessage + ' us';

end else begin

Str(PortInit.uSendTiming * 10,S);

szMessage := 'SendTiming = ' + S + ' us';

end;

MessageDlg(szMessage, mtInformation, [mbOK], 0);

end;

end;

2. HdlcClose

【機能】

ポートのクローズを行い、ポートアクセスのために使用されていた各種リソースの解放を行い、

以後のポートへのアクセスを禁止します。

【書式】

●C 言語

LONG HdlcClose(

HANDLE HDevice );

●Visual Basic

Declare Function HdlcClose Lib "FbiHdlc.DLL" ( _ ByVal HDevice As Long _

) As Long

●Delphi

function HdlcClose(

hDevice: THandle

):Integer; stdcall; external 'FbiHdlc.DLL';

【パラメータ】

hDevice

クローズするデバイスハンドルを指定します。

【戻り値】

正常終了した場合は、FBIHDLC_ERROR_SUCCESSが返されます。

FBIHDLC_ERROR_SUCCESS以外の値が返された場合については、『戻り値一覧』をご参照ください。

【使用例】

●C 言語

HANDLE hDevice;

HDLCNPORTINITDATA PortInit;

LONG Ret;

hDevice = HdlcOpen(“FBIHDLC1”, &PortInit);

: :

Ret = HdlcClose(hDevice);

●Visual Basic

Dim hDevice As Long

Dim PortInit As HDLCNPORTINITDATA Dim Ret As Long

hDevice = HdlcOpen("FBIHDLC1", PortInit) :

Ret = HdlcClose(hDevice)

© 1999, 2016 Interface Corporation. All rights reserved.

43

●Delphi var

hDevice: THandle;

PortInit: HDLCNPORTINITDATA;

Ret: Integer;

hDevice := HdlcOpen('FBIHDLC1', PortInit);

: :

Ret := HdlcClose(hDevice);

3. HdlcSendFrame

【機能】

HDLC フレームの送信を行います。

【書式】

●C 言語

LONG HdlcSendFrame(

HANDLE hDevice, void *lpBuffer, ULONG ulLength, ULONG ulEndFlag, LPOVERLAPPED lpOverlapped );

●Visual Basic バイト型変数によるデータ送信を行う場合 Declare Function HdlcSendFrame Lib "FbiHdlc.DLL" ( _ ByVal hDevice As Long, _

ByRef lpBuffer As Byte, _ ByVal ulLength As Long, _ ByVal ulEndFlag As Long, _

ByRef lpOverlapped As OVERLAPPED _ ) As Long

文字列型変数によるデータ送信を行う場合

Declare Function HdlcSendFrameString Lib "FbiHdlc.DLL" Alias "HdlcSendFrame" ( ByVal hDevice As Long,

ByVal lpBuffer As String, ByVal ulLength As Long, ByVal ulEndFlag As Long, ByRef lpOverlapped As OVERLAPPED ) As Long

●Delphi

function HdlcSendFrame(

hDevice: THandle;

lpBuffer: pointer;

ulLength: Integer;

ulEndFlag: Integer;

lpOverlapped: Poverlapped ):Integer; stdcall; external 'FbiHdlc.DLL';

【パラメータ】

hDevice

データを送信するデバイスハンドルを指定してください。

lpBuffer

送信データ格納変数へのポインタを指定します。(C 言語、Delphi) 送信データ格納変数を指定します。(Visual Basic)

ulLength

送信データのサイズをバイト単位で指定します。

© 1999, 2016 Interface Corporation. All rights reserved.

45 ulEndFlag

続けて送信するフレームがあるかどうかを指定します。

本パラメータは PCI-4116, PCI/CTP-4159 半二重通信時のみ有効です。

値 内容

0 続きのフレームがあるので、データ送信が完了しても受信状態に移行しない

1 このフレームを送信し終わったら受信状態に移行する

lpOverlapped

フレーム送信後、イベントを発生させる場合は指定してください。使用しない場合は NULL ま たは 0 を指定してください。

【戻り値】

正常終了した場合は、FBIHDLC_ERROR_SUCCESS が返されます。

非同期で動作させる場合は、FBIHDLC_ERROR_IO_PENDINGを返します。

それ以外の値が返された場合については、『戻り値一覧』をご参照ください。

【備考】

●Visual Basic にて文字列の送信を行う場合には、HdlcSendFrameString 関数をご使用ください。

文字列以外のデータを送信する場合には、HdlcSendFrame 関数をご使用ください。

●HdlcSendFrame 関数による送信が完了する以前に次の HdlcSendFrame 関数による送信を実行し ても、終結フラグと次に送信するフレームの先頭フラグが共有されることはありません。

終結フラグと先頭フラグは連続せずに間が出来ます。

フラグフィルに設定している場合、フラグは最低 3 つ(終結フラグと先頭フラグを含む)挿入さ れます。

【使用例】

●C 言語

HANDLE hDevice;

OVERLAPPED sOverlapped;

LONG Ret;

ZeroMemory(&sOverlapped, sizeof(OVERLAPPED));

sOverlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

Ret = HdlcSendFrame(hDevice, "1234567890", 10, 1, &sOverlapped);

if(Ret == FBIHDLC_ERROR_IO_PENDING) {

WaitForSingleObject(sOverlapped.hEvent, INFINITE);

}

CloseHandle(sOverlapped.hEvent);

●Visual Basic

Dim hDevice As Long

Dim sOverlapped As OVERLAPPED Dim Ret As Long

sOverlapped.Internal = 0 sOverlapped.InternalHigh = 0 sOverlapped.Offset = 0 sOverlapped.OffsetHigh = 0

sOverlapped.hEvent = CreateEvent(0, True, False, 0)

Ret = HdlcSendFrameString(hDevice, "1234567890", 10, 1, sOverlapped) If Ret = FBIHDLC_ERROR_IO_PENDING Then

WaitForSingleObject sOverlapped.hEvent, -1

End If

CloseHandle sOverlapped.hEvent

●Delphi Var

HDevice: THandle;

sOverlapped: OVERLAPPED;

Ret: Integer;

ZeroMemory(@sOverlapped, SizeOf(TOverLapped));

Soverlapped.hEvent := CreateEvent(nil, True, False, nil);

Ret := HdlcSendFrame(hDevice, '1234567890', 10, 1, @sOverlapped);

if Ret = FBIHDLC_ERROR_IO_PENDING then begin

WaitForSingleObject(sOverlapped.hEvent, -1);

end;

CloseHandle(Overlapped.hEvent);

10 バイトのフレームを送信します。

© 1999, 2016 Interface Corporation. All rights reserved.

47

4. HdlcGetFrameCount

【機能】

受信バッファ内に格納されているフレームの数を取得します。

【書式】

●C 言語

LONG HdlcGetFrameCount(

HANDLE hDevice,

PULONG pulFrameCount );

●Visual Basic

Declare Function HdlcGetFrameCount Lib "FbiHdlc.DLL" ( _ ByVal hDevice As Long, _

ByRef pulFrameCount As Long _ ) As Long

●Delphi

function HdlcGetFrameCount(

hDevice: THandle;

var pulFrameCount: Integer

):Integer; stdcall; external 'FbiHdlc.DLL';

【パラメータ】

hDevice

受信フレーム数を取得するデバイスハンドルを指定します。

pulFrameCount

受信フレーム数を返す変数へのポインタを指定します。(C 言語) 受信フレーム数を返す変数を指定します。(Visual Basic、Delphi)

【戻り値】

正常終了した場合は、FBIHDLC_ERROR_SUCCESSが返されます。

FBIHDLC_ERROR_SUCCESS以外の値が返された場合については、『戻り値一覧』をご参照ください。

【使用例】

●C 言語

HANDLE hDevice;

ULONG ulFrameCount, ulFrameLength;

ULONG n;

LONG Ret;

BYTE Buffer[16384];

Ret = HdlcGetFrameCount(hDevice, &ulFrameCount);

for(n = 0; n < ulFrameCount; n++) {

Ret = HdlcReceiveFrame(hDevice, Buffer, &ulFrameLength);

}

●Visual Basic

Dim hDevice As Long

Dim ulFrameCount, ulFrameLength As Long Dim n As Long

Dim Ret As Long

Dim Buffer(16384) As Byte

Ret = HdlcGetFrameCount(hDevice, ulFrameCount) For n = 0 To ulFrameCount - 1

Ret = HdlcReceiveFrame(hDevice, Buffer(0), ulFrameLength) Next

●Delphi var

hDevice: THandle;

ulFrameCount: Integer;

ulFrameLength: Integer;

n: Integer;

Ret: Integer;

Buffer: array[0..16383] of Byte

Ret := HdlcGetFrameCount(hDevice, ulFrameCount);

for n := 0 to ulFrameCount - 1 do begin

Ret := HdlcReceiveFrame(hDevice, @Buffer[0], ulFrameLength);

end;

受信フレーム数を取得し、取得したフレーム分だけデータを取り出します。

© 1999, 2016 Interface Corporation. All rights reserved.

49

5. HdlcGetFrameLength

【機能】

受信フレームの先頭に格納されているフレームの長さを取得します(FCS は含まれません)。

【書式】

●C 言語

LONG HdlcGetFrameLength(

HANDLE hDevice, PULONG pulFrameLength );

●Visual Basic

Declare Function HdlcGetFrameLength Lib "FbiHdlc.DLL" ( _ ByVal hDevice As Long, _

ByRef pulFrameLength As Long _ ) As Long

●Delphi

function HdlcGetFrameLength(

hDevice: THandle;

var pulFrameLength: Integer

):Integer; stdcall; external 'FbiHdlc.DLL';

【パラメータ】

hDevice

受信フレーム数を取得するデバイスハンドルを指定します。

pulFrameLength

受信フレーム長を返す変数へのポインタを指定します。(C 言語) 受信フレーム長を返す変数を指定します。(Visual Basic、Delphi) 単位はバイトで、0~16384 の値が返されます。

【戻り値】

正常終了した場合は、FBIHDLC_ERROR_SUCCESSが返されます。

FBIHDLC_ERROR_SUCCESS以外の値が返された場合については、『戻り値一覧』をご参照ください。

【使用例】

●C 言語

HANDLE hDevice;

ULONG ulFrameLength;

LONG Ret;

BYTE Buffer[16384];

Ret = HdlcGetFrameLength(hDevice, &ulFrameLength);

if(ulFrameLength > 0) {

Ret = HdlcReceiveFrame(hDevice, Buffer, &ulFrameLength);

}

●Visual Basic

Dim hDevice As Long Dim ulFrameLength As Long Dim Ret As Long

Dim Buffer(16384) As Byte

Ret = HdlcGetFrameLength(hDevice, ulFrameLength) If ulFrameLength > 0 Then

Ret = HdlcReceiveFrame(hDevice, Buffer(0), ulFrameLength) End If

●Delphi var

hDevice: THandle;

ulFrameLength: Integer;

Ret: Integer;

Buffer: array[0..16383] of Byte

Ret := HdlcGetFrameLength(hDevice, ulFrameLength);

if ulFrameLength > 0 then begin

Ret := HdlcReceiveFrame(hDevice, @Buffer[0], ulFrameLength);

end;

受信バッファ内に残っている受信データサイズを取得し、受信フレームが 0 でなければ(データ が残っていれば)受信フレームを取り出します。

© 1999, 2016 Interface Corporation. All rights reserved.

51

6. HdlcReceiveFrame

【機能】

受信バッファに蓄えられた HDLC フレームを取り出します。

【書式】

●C 言語

LONG HdlcReceiveFrame(

HANDLE hDevice, void *lpBuffer, PULONG pulLength );

●Visual Basic バイト型変数によるデータ送信を行う場合 Declare Function HdlcReceiveFrame Lib "FbiHdlc.DLL" ( _ ByVal hDevice As Long, _

ByRef lpBuffer As Byte, _ ByRef pulLength As Long _ ) As Long

文字列型変数によるデータ送信を行う場合

Declare Function HdlcReceiveFrameString Lib "FbiHdlc.DLL" Alias "HdlcReceiveFrame" ( ByVal hDevice As Long,

ByVal lpBuffer As String, ByRef pulLength As Long ) As Long

●Delphi

function HdlcReceiveFrame(

hDevice: THandle;

lpBuffer: pointer;

var pulLength: Integer

):Integer; stdcall; external 'FbiHdlc.DLL';

【パラメータ】

hDevice

受信データを取り出すデバイスハンドルを指定します。

lpBuffer

受信データを返す変数へのポインタを指定してください。(C 言語、Delphi) 受信データを返す変数を指定してください。(Visual Basic)

HdlcGetFrameLength 関数で得られたサイズ以上のバッファを用意してください。

pulLength

lpBuffer へコピーされたバイト数が返されます。

【戻り値】

正常終了した場合は、FBIHDLC_ERROR_SUCCESSが返されます。

FBIHDLC_ERROR_SUCCESS以外の値が返された場合については、『戻り値一覧』をご参照ください。

【備考】

Visual Basic にて文字列の受信を行う場合には、HdlcReceiveFrameString 関数をご使用ください。

文字列以外のデータを受信する場合には、HdlcReceiveFrame 関数をご使用ください。

文字列以外のデータを HdlcReceiveFrameString 関数で受信すると、データ化けが起こります。

受信するデータ型にあわせて関数をご使用ください。

【使用例】

●C 言語

HANDLE hDevice;

ULONG ulFrameCount, ulFrameLength;

ULONG n;

LONG Ret;

BYTE Buffer[16384];

Ret = HdlcGetFrameCount(hDevice, &ulFrameCount);

for(n = 0; n < ulFrameCount; n++) {

Ret = HdlcReceiveFrame(hDevice, Buffer, &ulFrameLength);

}

●Visual Basic

Dim hDevice As Long

Dim ulFrameCount, ulFrameLength As Long Dim n As Long

Dim Ret As Long

Dim Buffer(16384) As Byte

Ret = HdlcGetFrameCount(hDevice, ulFrameCount) For n = 0 To ulFrameCount - 1

Ret = HdlcReceiveFrame(hDevice, Buffer(0), ulFrameLength) Next

●Delphi var

hDevice: THandle;

ulFrameCount: Integer;

ulFrameLength: Integer;

n: Integer;

Ret: Integer;

Buffer: array[0..16383] of Byte

Ret = HdlcGetFrameCount(hDevice, ulFrameCount);

for n := 0 to ulFrameCount - 1 do begin

Ret = HdlcReceiveFrame(hDevice, @Buffer[0], ulFrameLength);

end;

受信フレーム数を取得し、取得したフレーム分だけデータを取り出します。

© 1999, 2016 Interface Corporation. All rights reserved.

53

7. HdlcGetStatus

【機能】

HDLC インタフェースモジュールの各種ステータスを取得します。取得できるステータスは、フレ ーム受信の有無、受信バッファの残り容量、送信フレームの有無、送信バッファの残り容量にな ります。

【書式】

●C 言語

LONG HdlcGetStatus(

HANDLE hDevice, PHDLCNPORTSTATUS pPortStatus );

●Visual Basic

Declare Function HdlcGetStatus Lib "FbiHdlc.DLL" ( _ ByVal hDevice As Long, _

ByRef pPortStatus As HDLCNPORTSTATUS _ ) As Long

●Delphi

function HdlcGetStatus(

hDevice: THandle;

var pPortStatus: HDLCNPORTSTATUS ):Integer; stdcall; external 'FbiHdlc.DLL';

【パラメータ】

hDevice

ステータスを取得するデバイスハンドルを指定します。

pPortStatus

ポートステータス構造体(HDLCNPORTSTATUS構造体)へのポインタを指定します。(C言語) ポートステータス構造体(HDLCNPORTSTATUS構造体)を指定します。(Visual Basic、Delphi)

【戻り値】

正常終了した場合は、FBIHDLC_ERROR_SUCCESSが返されます。

FBIHDLC_ERROR_SUCCESS以外の値が返された場合については、『戻り値一覧』をご参照ください。

【使用例】

●C 言語

HANDLE hDevice;

HDLCNPORTSTATUS PortStatus;

LONG Ret;

BYTE Buffer[16384];

Buffer[0] = 0x02;

Buffer[1] = 0x53;

Ret = HdlcGetStatus(hDevice, &PortStatus);

if(PortStatus.uSendFreeBlock >= 1) {

Ret = HdlcSendFrame(hDevice, Buffer, 2, 1, NULL);

}

ドキュメント内 GPC-4116 (ページ 36-95)

関連したドキュメント