?? ch375dll.c
字號:
return( FALSE );
}
}
BOOL WINAPI CH375ReadData( // 讀取數據塊
ULONG iIndex, // 指定CH375設備序號,必須是0
PVOID oBuffer, // 指向一個足夠大的緩沖區,用于保存讀取的數據
PULONG ioLength ) // 指向長度單元,輸入時為準備讀取的長度,返回后為實際讀取的長度
{
UCHAR mBuffer[ mMAX_COMMAND_LENGTH ];
ULONG mLength;
mPWIN32_COMMAND mpCommand;
if ( *ioLength > mMAX_BUFFER_LENGTH ) *ioLength = mMAX_BUFFER_LENGTH; // 限制最大長度
mpCommand = (PVOID)mBuffer;
mpCommand -> mFunction = mPipeDataUp; // 從數據塊上傳管道讀取數據
mpCommand -> mLength = max( *ioLength, mCH375_PACKET_LENGTH ); // 數據長度,不能小于CH375的數據包長度
mLength = mpCommand -> mLength + mWIN32_COMMAND_HEAD; // 緩沖區長度,數據長度加上命令結構頭的長度
if ( DeviceIoControl( dllHandle, IOCTL_CH375_COMMAND, mpCommand, mWIN32_COMMAND_HEAD, mpCommand, mLength, &mLength, NULL ) ) {
*ioLength = min( mpCommand -> mLength, *ioLength ); // 返回實際讀取數據的長度
CopyMemory( oBuffer, & mpCommand -> mBuffer[0], *ioLength ); // 返回讀取的數據
return( TRUE );
}
else { // 出錯
*ioLength = 0;
return( FALSE );
}
}
BOOL WINAPI CH375AbortRead( // 放棄數據塊讀操作
ULONG iIndex ) // 指定CH375設備序號,必須是0
{
ULONG mLength;
mWIN32_COMMAND mCommand;
mCommand.mFunction = mFuncAbortPipe; // 取消指定的USB管道的數據操作
mCommand.mLength = sizeof( ULONG );
*(PULONG) & mCommand.mBuffer[0] = mPipeDataUp; // 數據塊上傳管道
mLength = sizeof( mWIN32_COMMAND ); // 緩沖區長度,默認命令結構的長度
if ( DeviceIoControl( dllHandle, IOCTL_CH375_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) )
return( TRUE );
else return( FALSE ); // 出錯
}
BOOL WINAPI CH375ResetRead( // 復位數據塊讀操作
ULONG iIndex ) // 指定CH375設備序號,必須是0
{
ULONG mLength;
mWIN32_COMMAND mCommand;
mCommand.mFunction = mFuncResetPipe; // 復位指定的USB管道
mCommand.mLength = sizeof( ULONG );
*(PULONG) & mCommand.mBuffer[0] = mPipeDataUp; // 數據塊上傳管道
mLength = sizeof( mWIN32_COMMAND ); // 緩沖區長度,默認命令結構的長度
if ( DeviceIoControl( dllHandle, IOCTL_CH375_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) )
return( TRUE );
else return( FALSE ); // 出錯
}
BOOL WINAPI CH375WriteData( // 寫出數據塊
ULONG iIndex, // 指定CH375設備序號,必須是0
PVOID iBuffer, // 指向一個緩沖區,放置準備寫出的數據
PULONG ioLength ) // 指向長度單元,輸入時為準備寫出的長度,返回后為實際寫出的長度
{
UCHAR mBuffer[ mMAX_COMMAND_LENGTH ];
ULONG mLength;
mPWIN32_COMMAND mpCommand;
if ( *ioLength > mMAX_BUFFER_LENGTH ) *ioLength = mMAX_BUFFER_LENGTH; // 限制最大長度
mpCommand = (PVOID)mBuffer;
mpCommand -> mFunction = mPipeDataDown; // 向數據塊下傳管道寫出數據
mpCommand -> mLength = *ioLength; // 數據長度
CopyMemory( & mpCommand -> mBuffer[0], iBuffer, *ioLength ); // 準備寫出的數據
mLength = *ioLength + mWIN32_COMMAND_HEAD; // 緩沖區長度,數據長度加上命令結構頭的長度
if ( DeviceIoControl( dllHandle, IOCTL_CH375_COMMAND, mpCommand, mLength, mpCommand, mWIN32_COMMAND_HEAD, &mLength, NULL ) ) {
*ioLength = mpCommand -> mLength; // 返回實際寫出數據的長度
return( TRUE );
}
else { // 出錯
*ioLength = 0;
return( FALSE );
}
}
BOOL WINAPI CH375AbortWrite( // 放棄數據塊寫操作
ULONG iIndex ) // 指定CH375設備序號,必須是0
{
ULONG mLength;
mWIN32_COMMAND mCommand;
mCommand.mFunction = mFuncAbortPipe; // 取消指定的USB管道的數據操作
mCommand.mLength = sizeof( ULONG );
*(PULONG) & mCommand.mBuffer[0] = mPipeDataDown; // 數據塊下傳管道
mLength = sizeof( mWIN32_COMMAND ); // 緩沖區長度,默認命令結構的長度
if ( DeviceIoControl( dllHandle, IOCTL_CH375_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) )
return( TRUE );
else return( FALSE ); // 出錯
}
BOOL WINAPI CH375ResetWrite( // 復位數據塊寫操作
ULONG iIndex ) // 指定CH375設備序號,必須是0
{
ULONG mLength;
mWIN32_COMMAND mCommand;
mCommand.mFunction = mFuncResetPipe; // 復位指定的USB管道
mCommand.mLength = sizeof( ULONG );
*(PULONG) & mCommand.mBuffer[0] = mPipeDataDown; // 數據塊下傳管道
mLength = sizeof( mWIN32_COMMAND ); // 緩沖區長度,默認命令結構的長度
if ( DeviceIoControl( dllHandle, IOCTL_CH375_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) )
return( TRUE );
else return( FALSE ); // 出錯
}
BOOL WINAPI CH375ReadInter( // 讀取中斷數據
ULONG iIndex, // 指定CH375設備序號,必須是0
PVOID oBuffer, // 指向一個足夠大的緩沖區,用于保存讀取的中斷數據
PULONG ioLength ) // 指向長度單元,輸入時為準備讀取的長度,返回后為實際讀取的長度
{
UCHAR mBuffer[ mMAX_COMMAND_LENGTH ];
ULONG mLength;
mPWIN32_COMMAND mpCommand;
if ( *ioLength > mMAX_BUFFER_LENGTH ) *ioLength = mMAX_BUFFER_LENGTH; // 限制長度
mpCommand = (PVOID)mBuffer;
mpCommand -> mFunction = mPipeInterUp; // 從中斷數據上傳管道讀取數據
mpCommand -> mLength = max( *ioLength, mCH375_PKT_LEN_SHORT ); // 數據長度,不能小于CH375的數據包長度
mLength = mpCommand -> mLength + mWIN32_COMMAND_HEAD; // 緩沖區長度,數據長度加上命令結構頭的長度
if ( DeviceIoControl( dllHandle, IOCTL_CH375_COMMAND, mpCommand, mWIN32_COMMAND_HEAD, mpCommand, mLength, &mLength, NULL ) ) {
*ioLength = min( mpCommand -> mLength, *ioLength ); // 返回實際讀取數據的長度
CopyMemory( oBuffer, & mpCommand -> mBuffer[0], *ioLength ); // 返回讀取的數據
return( TRUE );
}
else { // 出錯
*ioLength = 0;
return( FALSE );
}
}
BOOL WINAPI CH375AbortInter( // 放棄中斷數據讀操作
ULONG iIndex ) // 指定CH375設備序號,必須是0
{
ULONG mLength;
mWIN32_COMMAND mCommand;
mCommand.mFunction = mFuncAbortPipe; // 取消指定的USB管道的數據操作
mCommand.mLength = sizeof( ULONG );
*(PULONG) & mCommand.mBuffer[0] = mPipeInterUp; // 中斷數據上傳管道
mLength = sizeof( mWIN32_COMMAND ); // 緩沖區長度,默認命令結構的長度
if ( DeviceIoControl( dllHandle, IOCTL_CH375_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) )
return( TRUE );
else return( FALSE ); // 出錯
}
BOOL WINAPI CH375ResetInter( // 復位中斷數據讀操作
ULONG iIndex ) // 指定CH375設備序號,必須是0
{
ULONG mLength;
mWIN32_COMMAND mCommand;
mCommand.mFunction = mFuncResetPipe; // 復位指定的USB管道
mCommand.mLength = sizeof( ULONG );
*(PULONG) & mCommand.mBuffer[0] = mPipeInterUp; // 中斷數據上傳管道
mLength = sizeof( mWIN32_COMMAND ); // 緩沖區長度,默認命令結構的長度
if ( DeviceIoControl( dllHandle, IOCTL_CH375_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) )
return( TRUE );
else return( FALSE ); // 出錯
}
BOOL WINAPI CH375SetIntRoutine( // 設定中斷服務程序
ULONG iIndex, // 指定CH375設備序號,必須是0
mPCH375_INT_ROUTINE iIntRoutine ) // 指定中斷服務回調程序,為NULL則取消中斷服務,否則在中斷時調用該程序
{
HANDLE mHandle;
dllIntRoutine = NULL;
while ( dllIntThreadId ) { /* 已經創建線程 */
CH375AbortInter( 0 ); // 放棄在此之前的等待中斷,等待線程結束
Sleep( 20 ); // 延時20毫秒
}
if ( iIntRoutine == NULL ) return( TRUE ); // 取消中斷服務
dllIntRoutine = iIntRoutine;
mHandle = CreateThread( NULL, 0, dllInterruptThread, (PVOID)dllDeviceName, 0, & dllIntThreadId ); // 創建線程模擬中斷事件
if ( mHandle ) { // 線程創建成功
SetThreadPriority( mHandle, THREAD_PRIORITY_TIME_CRITICAL ); // 為了縮短中斷服務回調程序響應時間,應該提高線程的優先級
return ( TRUE );
}
else return ( FALSE ); // 操作成功
}
BOOL WINAPI CH375WriteAuxData( // 寫出輔助數據
ULONG iIndex, // 指定CH375設備序號,必須是0
PVOID iBuffer, // 指向一個緩沖區,放置準備寫出的數據
PULONG ioLength ) // 指向長度單元,輸入時為準備寫出的長度,返回后為實際寫出的長度
{
UCHAR mBuffer[ mMAX_COMMAND_LENGTH ];
ULONG mLength;
mPWIN32_COMMAND mpCommand;
if ( *ioLength > mMAX_BUFFER_LENGTH ) *ioLength = mMAX_BUFFER_LENGTH; // 限制最大長度
mpCommand = (PVOID)mBuffer;
mpCommand -> mFunction = mPipeAuxDown; // 向輔助數據下傳管道寫出數據
mpCommand -> mLength = *ioLength; // 數據長度
CopyMemory( & mpCommand -> mBuffer[0], iBuffer, *ioLength ); // 準備寫出的數據
mLength = *ioLength + mWIN32_COMMAND_HEAD; // 緩沖區長度,數據長度加上命令結構頭的長度
if ( DeviceIoControl( dllHandle, IOCTL_CH375_COMMAND, mpCommand, mLength, mpCommand, mWIN32_COMMAND_HEAD, &mLength, NULL ) ) {
*ioLength = mpCommand -> mLength; // 返回實際寫出數據的長度
return( TRUE );
}
else { // 出錯
*ioLength = 0;
return( FALSE );
}
}
BOOL WINAPI CH375ResetAux( // 復位輔助數據寫操作
ULONG iIndex ) // 指定CH375設備序號,必須是0
{
ULONG mLength;
mWIN32_COMMAND mCommand;
mCommand.mFunction = mFuncResetPipe; // 復位指定的USB管道
mCommand.mLength = sizeof( ULONG );
*(PULONG) & mCommand.mBuffer[0] = mPipeAuxDown; // 輔助數據下傳管道
mLength = sizeof( mWIN32_COMMAND ); // 緩沖區長度,默認命令結構的長度
if ( DeviceIoControl( dllHandle, IOCTL_CH375_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) )
return( TRUE );
else return( FALSE ); // 出錯
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -