如果不写任何数据,WriteFile如何成功?

时间:2012-02-24 09:53:48

标签: c++ windows serial-port modem writefile

我正在呼叫WriteFile将数据发送到调制解调器:

BOOL writeResult = WriteFile(m_hPort, p_message, length, &numOut, NULL);

其中:

  • m_hPort是有效的HANDLE
  • p_message是unsigned char*,其中包含ate0\r
  • 长度为int,值为5
  • numOut是unsigned long初始化为0

我偶尔会看到这种方法成功但是numOut!= length

WriteFile如何在不发送任何数据的情况下返回成功?

编辑这就是我创建句柄的方式:

HANDLE hPort = CreateFileA("\\\\.\\COM5", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

我已经检查了返回,并且它不是INVALID_HANDLE_VALUE,这表明它是有效的。

2 个答案:

答案 0 :(得分:1)

文档说明:

When writing to a non-blocking, byte-mode pipe handle with insufficient buffer space, WriteFile returns TRUE with *lpNumberOfBytesWritten < nNumberOfBytesToWrite

当您发送数据的速度比传输速度快时,调制解调器会有类似的行为吗?

答案 1 :(得分:1)

毕竟是硬件问题。

对转换器进行电源循环会清除硬件缓冲区,导致我们怀疑该设备的驱动程序存在问题。根据Hans的建议,我们放弃了超时,然后开始更详细地探讨错误报告。

将超时减少到合理的意义,这意味着我们能够确定缓冲区已经填满,直到他们能够“采取更多”为止!这就是为什么功率循环转换器固定它的原因(我们尝试通过工程重新布线功率并反转极性,但异常,并未解决问题)。

根本原因是一些不稳定的硬件流控制导致软件无限期地阻塞。禁用流量控制解决了这个问题。