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

📄 ch375dll.c

📁 CH375 是南京沁恒公司开发的一个USB总线的通用接口芯片
💻 C
📖 第 1 页 / 共 2 页
字号:
	mLength = *ioLength + mWIN32_COMMAND_HEAD;  // 缓冲区长度,数据长度加上命令结构头的长度
	if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH375_COMMAND, mpCommand, mWIN32_COMMAND_HEAD, mpCommand, mLength, &mLength, NULL ) ) {
		*ioLength = mpCommand -> mLength;  //  返回实际读取数据的长度
		CopyMemory( oBuffer, & mpCommand -> mBuffer[0], *ioLength );  // 返回读取的数据
		return( TRUE );
	}
	else {  // 出错
		*ioLength = 0;
		return( FALSE );
	}
}

BOOL	WINAPI	CH375ReadInter(  // 读取中断数据
	ULONG			iIndex,  // 指定CH375设备序号
	PVOID			oBuffer,  // 指向一个足够大的缓冲区,用于保存读取的中断数据
	PULONG			ioLength )  // 指向长度单元,输入时为准备读取的长度,返回后为实际读取的长度
{
	UCHAR			mBuffer[ mDEFAULT_COMMAND_LEN ];
	ULONG			mLength;
	mPWIN32_COMMAND	mpCommand;
	if ( *ioLength > mDEFAULT_BUFFER_LEN ) *ioLength = mDEFAULT_BUFFER_LEN;  // 限制长度
	mpCommand = (PVOID)mBuffer;
	mpCommand -> mFunction = mPipeInterUp;  // 从中断数据上传管道读取数据
	mpCommand -> mLength = max( *ioLength, mCH375_PACKET_LENGTH );  // 数据长度,不能小于CH375的数据包长度
	mLength = mpCommand -> mLength + mWIN32_COMMAND_HEAD;  // 缓冲区长度,数据长度加上命令结构头的长度
	if ( DeviceIoControl( dllHandle[ iIndex ], 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设备序号
{
	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[ iIndex ], IOCTL_CH375_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) )
		return( TRUE );
	else return( FALSE );  // 出错
}

BOOL	WINAPI	CH375SetIntRoutine(  // 设定中断服务程序
	ULONG			iIndex,  // 指定CH375设备序号
	mPCH375_INT_ROUTINE	iIntRoutine )  // 指定中断服务程序,为NULL则取消中断服务,否则在中断时调用该程序
{
	HANDLE			mHandle;
	dllIntRoutine[ iIndex ] = NULL;
	while ( dllIntThreadId[ iIndex ] ) {  /* 已经创建线程 */
		CH375AbortInter( iIndex );  // 放弃在此之前的等待中断,等待线程结束
		Sleep( 20 );  // 延时20毫秒
	}
	if ( iIntRoutine == NULL ) return( TRUE );  // 取消中断服务
	dllIntRoutine[ iIndex ] = iIntRoutine;
	mHandle = CreateThread( NULL, 0, dllInterruptThread, (PVOID)iIndex, 0, & dllIntThreadId[ iIndex ] );  // 创建线程模拟中断事件
	if ( mHandle ) {  // 线程创建成功
		SetThreadPriority( mHandle, THREAD_PRIORITY_TIME_CRITICAL ); // 为了缩短中断服务程序响应时间,应该提高线程的优先级
		return ( TRUE );
	}
	else return ( FALSE );  // 操作成功
}

BOOL	WINAPI	CH375ReadData(  // 读取数据块
	ULONG			iIndex,  // 指定CH375设备序号
	PVOID			oBuffer,  // 指向一个足够大的缓冲区,用于保存读取的数据
	PULONG			ioLength )  // 指向长度单元,输入时为准备读取的长度,返回后为实际读取的长度
{
	UCHAR			mBuffer[ mDEFAULT_COMMAND_LEN ];
	ULONG			mLength;
	mPWIN32_COMMAND	mpCommand;
	if ( *ioLength <= mDEFAULT_BUFFER_LEN ) mpCommand = (PVOID)mBuffer;  // 不超过默认缓冲区长度
	else {  // 超过则需要另外分配内存
		if ( *ioLength > mMAX_BUFFER_LENGTH ) *ioLength = mMAX_BUFFER_LENGTH;  // 限制最大长度
		mpCommand = (mPWIN32_COMMAND)LocalAlloc( LMEM_FIXED, mMAX_COMMAND_LENGTH );  // 分配内存
		if ( mpCommand == NULL ) {  // 分配内存失败则仍然使用默认缓冲区
			mpCommand = (PVOID)mBuffer;
			*ioLength = mDEFAULT_BUFFER_LEN;  // 限制长度
		}
	}
	mpCommand -> mFunction = mPipeDataUp;  // 从数据块上传管道读取数据
	mpCommand -> mLength = max( *ioLength, mCH375_PACKET_LENGTH );  // 数据长度,不能小于CH375的数据包长度
	mLength = mpCommand -> mLength + mWIN32_COMMAND_HEAD;  // 缓冲区长度,数据长度加上命令结构头的长度
	if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH375_COMMAND, mpCommand, mWIN32_COMMAND_HEAD, mpCommand, mLength, &mLength, NULL ) ) {
		*ioLength = min( mpCommand -> mLength, *ioLength );  //  返回实际读取数据的长度
		CopyMemory( oBuffer, & mpCommand -> mBuffer[0], *ioLength );  // 返回读取的数据
		if ( (PUCHAR)mpCommand != mBuffer ) LocalFree( mpCommand );  // 如果是分配的内存则释放
		return( TRUE );
	}
	else {  // 出错
		*ioLength = 0;
		if ( (PUCHAR)mpCommand != mBuffer ) LocalFree( mpCommand );  // 如果是分配的内存则释放
		return( FALSE );
	}
}

BOOL	WINAPI	CH375AbortRead(  // 放弃数据块读操作
	ULONG			iIndex )  // 指定CH375设备序号
{
	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[ iIndex ], IOCTL_CH375_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) )
		return( TRUE );
	else return( FALSE );  // 出错
}

BOOL	WINAPI	CH375WriteData(  // 写出数据块
	ULONG			iIndex,  // 指定CH375设备序号
	PVOID			iBuffer,  // 指向一个缓冲区,放置准备写出的数据
	PULONG			ioLength )  // 指向长度单元,输入时为准备写出的长度,返回后为实际写出的长度
{
	UCHAR			mBuffer[ mDEFAULT_COMMAND_LEN ];
	ULONG			mLength;
	mPWIN32_COMMAND	mpCommand;
	if ( *ioLength <= mDEFAULT_BUFFER_LEN ) mpCommand = (PVOID)mBuffer;  // 不超过默认缓冲区长度
	else {  // 超过则需要另外分配内存
		if ( *ioLength > mMAX_BUFFER_LENGTH ) *ioLength = mMAX_BUFFER_LENGTH;  // 限制最大长度
		mpCommand = (mPWIN32_COMMAND)LocalAlloc( LMEM_FIXED, mMAX_COMMAND_LENGTH );  // 分配内存
		if ( mpCommand == NULL ) {  // 分配内存失败则仍然使用默认缓冲区
			mpCommand = (PVOID)mBuffer;
			*ioLength = mDEFAULT_BUFFER_LEN;  // 限制长度
		}
	}
	mpCommand -> mFunction = mPipeDataDown;  // 向数据块下传管道写出数据
	mpCommand -> mLength = *ioLength;  // 数据长度
	CopyMemory( & mpCommand -> mBuffer[0], iBuffer, *ioLength );  // 准备写出的数据
	mLength = *ioLength + mWIN32_COMMAND_HEAD;  // 缓冲区长度,数据长度加上命令结构头的长度
	if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH375_COMMAND, mpCommand, mLength, mpCommand, mWIN32_COMMAND_HEAD, &mLength, NULL ) ) {
		*ioLength = mpCommand -> mLength;  //  返回实际写出数据的长度
		if ( (PUCHAR)mpCommand != mBuffer ) LocalFree( mpCommand );  // 如果是分配的内存则释放
		return( TRUE );
	}
	else {  // 出错
		*ioLength = 0;
		if ( (PUCHAR)mpCommand != mBuffer ) LocalFree( mpCommand );  // 如果是分配的内存则释放
		return( FALSE );
	}
}

BOOL	WINAPI	CH375AbortWrite(  // 放弃数据块写操作
	ULONG			iIndex )  // 指定CH375设备序号
{
	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[ iIndex ], IOCTL_CH375_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) )
		return( TRUE );
	else return( FALSE );  // 出错
}

BOOL	WINAPI	CH375WriteRead(  // 先写出标准的数据块(命令),再读取标准的数据块(应答)
	ULONG			iIndex,  // 指定CH375设备序号
	PVOID			iBuffer,  // 指向一个缓冲区,放置准备写出的数据,长度不大于mCH375_PACKET_LENGTH
	PVOID			oBuffer,  // 指向一个足够大的缓冲区,长度不小于mCH375_PACKET_LENGTH,用于保存读取的数据
	PULONG			ioLength )  // 指向长度单元,不大于mCH375_PACKET_LENGTH,输入时为准备写出的长度,返回后为实际读取的长度
{
	ULONG			mLength;
	mWIN32_COMMAND	mCommand;
	if ( *ioLength > mCH375_PACKET_LENGTH ) *ioLength = mCH375_PACKET_LENGTH;  // 限制长度
	mCommand.mFunction = mPipeDataDown;  // 向数据块下传管道写出数据
	mCommand.mLength = *ioLength;  // 数据长度
	CopyMemory( & mCommand.mBuffer[0], iBuffer, *ioLength );  // 准备写出的命令数据
	mLength = *ioLength + mWIN32_COMMAND_HEAD;  // 缓冲区长度,数据长度加上命令结构头的长度
	if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH375_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) ) {
		mCommand.mFunction = mPipeDataUp;  // 从数据块上传管道读取数据
		mCommand.mLength = mCH375_PACKET_LENGTH;  // 数据长度,CH375的数据包长度
		mLength = sizeof( mWIN32_COMMAND );  // 缓冲区长度,默认命令结构的长度
		if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH375_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) ) {
			*ioLength = min( mCommand.mLength, mCH375_PACKET_LENGTH );  //  返回实际读取数据的长度
			CopyMemory( oBuffer, & mCommand.mBuffer[0], *ioLength );  // 返回读取的应答数据
			return( TRUE );
		}
	}
	*ioLength = 0;
	return( FALSE );  // 出错
}

BOOL	WINAPI	CH375GetStatus(  // 通过CH375直接输入数据和状态
	ULONG			iIndex,  // 指定CH375设备序号
	PULONG			iStatus )  // 指向一个双字单元,用于保存状态数据
// 位7-位0对应CH375的D7-D0引脚,位9对应CH375的RXD#引脚,位10对应CH375的REQ#引脚
{
	ULONG			mLength;
	mWIN32_COMMAND	mCommand;
	mCommand.mFunction = mPipeDeviceCtrl;  // 综合控制管道
	mCommand.mLength = sizeof( mUSB_SETUP_PKT );  // 数据长度,指写入综合控制管道的命令请求包的长度
	mCommand.mSetupPkt.mUspReqType = mCH375_VENDOR_READ;  // 请求类型,供应商读请求
	mCommand.mSetupPkt.mUspRequest = mCH375_GET_STATUS;  // 请求码,输入状态信号
	mCommand.mSetupPkt.mUspValue = 0x0000;  // 保留
	mCommand.mSetupPkt.mUspIndex = 0x0000;  // 保留
	mCommand.mSetupPkt.mLength = mCH375_PACKET_LENGTH;  // 需要返回一个标准的数据包
	mLength = sizeof( mWIN32_COMMAND );  // 缓冲区长度,默认命令结构的长度
	if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH375_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) ) {
		*iStatus = mCommand.mBuffer[0] | ( mCommand.mBuffer[1] & ( mBitInputRxd | mBitInputReq ) ) << 8;
		return( TRUE );
	}
	else return( FALSE );  // 出错
}

BOOL	WINAPI	CH375SetTimeout(  // 设置USB数据读写的超时
	ULONG			iIndex,  // 指定CH375设备序号
	ULONG			iWriteTimeout,  // 指定USB写出数据块的超时时间,以毫秒mS为单位,0xFFFFFFFF指定不超时(默认值)
	ULONG			iReadTimeout )  // 指定USB读取数据块的超时时间,以毫秒mS为单位,0xFFFFFFFF指定不超时(默认值)
{
	ULONG			mLength;
	mWIN32_COMMAND	mCommand;
	mCommand.mFunction = mFuncSetTimeout;  // 设置USB通讯超时
	mCommand.mLength = sizeof( ULONG ) * 2;
	*(PULONG) & mCommand.mBuffer[0] = iWriteTimeout;  // 下传超时
	*(PULONG) & mCommand.mBuffer[4] = iReadTimeout;  // 上传超时
	mLength = sizeof( mWIN32_COMMAND );  // 缓冲区长度,默认命令结构的长度
	if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH375_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) )
		return( TRUE );
	else return( FALSE );  // 出错
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -