📄 ch375dll.c
字号:
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 + -