我有一些愚蠢的代码来访问Windows COM端口(只是一些最相关功能的伪代码):
// open device:
COMMTIMEOUTS timeouts;
DCB ComSettings;
memset(&ComSettings,0,sizeof(ComSettings));
ComSettings.DCBlength=sizeof(DCB);
*fd=CreateFile(serialParams>port,GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
GetCommState(*fd,&ComSettings);
ComSettings.BaudRate=9600;
ComSettings.ByteSize=8;
ComSettings.Parity=NOPARITY;
ComSettings.fParity=0;
ComSettings.StopBits=ONESTOPBIT;
ComSettings.fOutX=FALSE;
ComSettings.fInX=FALSE;
ComSettings.fBinary=TRUE;
ComSettings.fDtrControl=DTR_CONTROL_DISABLE;
ComSettings.fRtsControl=RTS_CONTROL_DISABLE;
ComSettings.fAbortOnError=FALSE;
SetCommState(*fd,&ComSettings);
timeouts.ReadIntervalTimeout =MAXDWORD;
timeouts.ReadTotalTimeoutMultiplier =0;
timeouts.ReadTotalTimeoutConstant =0;
timeouts.WriteTotalTimeoutMultiplier=0;
timeouts.WriteTotalTimeoutConstant =250;
SetCommTimeouts(*fd, &timeouts);
使用
从串口读取数据ReadFile()
并用
写作WriteFile()
在我的特定情况下,该设备是一个USB小工具,它作为串行接口连接,速度设置和其他事情并不重要。
此代码适用于所有Windows变体(包括8.1),但对于Windows 10,某些用户报告无法与该设备进行通信。不幸的是,我没有相关的Win10版本进行测试。
所以我的问题:Windows 10中是否存在某些问题/重要更改可能导致此类行为或需要对串行端口通信进行一些更改?
谢谢!
****** 更新 ********************************* *********************************
就像更新一样:函数SetCommState()失败并出现错误87(ERROR_INVALID_PARAMETER)。如果我设置自己的参数,如果我使用从GetCommState()接收的数据,或者我是否完全初始化和配置DCB结构,则无关紧要。那么......这是Win 10的SetCommState()中的已知错误吗?
请注意:它仅在5个案例中的4个案例中失败,因此它不是系统错误,而是随机错误!
答案 0 :(得分:1)
最后:它似乎是一个Windows问题,微软已经破坏了usbser.sys驱动程序。关于这个问题有很多线索:
第二个是最有趣的一个:它结束于"我们仍然有问题" - 然后由MS工作人员关闭。
我个人发现了一个旧的Windows 10安装,其中usbser.sys工作正常 - 在应用了所有可用的Windows补丁(包括usbser.sys的更新)之后,出现了问题。
答案 1 :(得分:0)
当RealTerm在相同的端口上工作时,我们在COM端口上的ReadFile也没有返回任何问题。 事实证明,Windows没有正确激活,导致了这些问题。