使用Windows 10

时间:2017-02-13 12:14:59

标签: winapi serial-port windows-10

我有一些愚蠢的代码来访问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个案例中失败,因此它不是系统错误,而是随机错误!

2 个答案:

答案 0 :(得分:1)

最后:它似乎是一个Windows问题,微软已经破坏了usbser.sys驱动程序。关于这个问题有很多线索:

https://answers.microsoft.com/en-us/windows/forum/windows_10-hardware-winpc/usb-serial-interface-problems-with-windows-10/562943cb-9a65-4900-98ef-03ba453d2742

https://answers.microsoft.com/en-us/insider/forum/insider_wintp-insider_devices/windows-10-serial-usb-problems/438de66f-7294-4c06-b4fb-89b45d005ca0

第二个是最有趣的一个:它结束于"我们仍然有问题" - 然后由MS工作人员关闭。

我个人发现了一个旧的Windows 10安装,其中usbser.sys工作正常 - 在应用了所有可用的Windows补丁(包括usbser.sys的更新)之后,出现了问题。

答案 1 :(得分:0)

当RealTerm在相同的端口上工作时,我们在COM端口上的ReadFile也没有返回任何问题。 事实证明,Windows没有正确激活,导致了这些问题。