HID设备使用中的串口读写处理小结

MSDN相关网址:
CreateFileW:https://docs.microsoft.com/zh-cn/windows/desktop/api/fileapi/nf-fileapi-createfilew
ReadFile/WriteFile:https://docs.microsoft.com/zh-cn/windows/desktop/api/fileapi/nf-fileapi-readfile

ReadFile/WriteFile函数在操作的时候要设置超时机制,网上推荐的是GetCommTimeouts和SetCommTimeouts,但是本人在实际使用的时候总是会出现“invalid function”这种错误,从而导致无法正常使用,目前未找到相关原因。关于设置重叠(FILE_FLAG_OVERLAPPED)操作的相关操作,也存在一些问题,WaitForSingleObject()函数返回的值不正确,导致操作一直在不断循环(这里可能是我操作的时候没有注意细节导致的)。ReadFile最后一个参数需要有CreateEVent(NULL,TRUE,FALSE,NULL)(事件对象设置为人工重置)。
最后实在没有办法了,于是就用了多线程的方式,对读写操作都是用线程处理,用WaitForSingleObjiect()来监控,这样WriteFile和ReadFile操作都没有阻塞了,但是在CancelHandle()的时候,CancelHandle会出现阻塞。在别人的博客上看到对ReadFile调用线程使用CancelSynchronousIo()(取消读操作)就可以了,试了下,该方法是可以正常运行的。

//创建一个供ReadFile使用的线程,防止读取数据出现阻塞
// 为防止读写操作阻塞, 使用多线程进行串口读写操作
typedef struct _S_Param
{
HANDLE mhDev;
DWORD mr;
struct HidRptXdataEx *mopHidXdataEx;
}S_Param;

static void WINAPI HidRpt_iReadFile(volatile S_Param * oParam)
{
ReadFile(oParam->mhDev, oParam->mopHidXdataEx, 65, &oParam->mr, 0);
}
HANDLE han_readfile = (HANDLE)_beginthreadex(NULL, 128 * 1024, (unsigned (WINAPI )(void)) &HidRpt_iReadFile, (void *)&o_param, 0, NULL);

关于CreateFile打开设备时需要设置的参数在MSDN中都有详细描述。

若有哪位知道Window API使用中出现的“invalid function”的原因,还望不吝赐教!

相关博客地址:
http://www.cnblogs.com/findumars/p/5636108.html

你可能感兴趣的:(HID设备使用中的串口读写处理小结)