⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch375dll.c

📁 CH372USB芯片的动态连接库程序
💻 C
📖 第 1 页 / 共 2 页
字号:
		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 + -