第 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);
}