📄 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 + -