我正在开发一个 Windows 实用程序,它使用标准 COM 端口与一些自定义硬件进行通信。通信协议(不受我的控制)要求我发送和接收原始 8 位数据字节。

我目前正在使用以下 Windows API 函数将数据发送到 COM 端口:

WriteFile(hFile, lpBuffer, numberOfBytesToWrite, ...)

在哪里 hFile 是对正确打开的 COM 端口的引用,并且 lpBuffer 是我存储在内存中的字节数组。该代码可以完美运行,直到需要将空字符(ASCII 零)发送到设备。 WriteFile 一旦检测到空字符就停止发送,因为它假设它已到达字符串的末尾。即使我设置了,也会发生这种情况 numberOfBytesToWrite 适当地。

如何使用 Windows API 将原始数据发送到 COM 端口?我更喜欢使用类似于的标准 API 调用 WriteFile, ,但我愿意接受建议。

我目前正在使用 快速Q 构建该实用程序,但它所做的只是直接调用 Windows API 函数。

编辑: 我的设置包括一台通过串行端口连接到自定义硬件模块的 Windows PC。该模块有一个小屏幕,我可以在上面查看传输的字符。我已经使用另一个第三方实用程序测试了此设置。我能够使用这个第三方程序与模块进行通信,并且空字符正确显示。在我自己的程序中,当我使用 WriteFile, ,传输流中任何位置的空字符都会阻止发送流的其余部分。

有帮助吗?

解决方案

我以前做过 Windows 串行端口编程,并且确信我能够通过串行端口发送空字符(否则各种文件传输协议将无法工作)。我可以想到两种可能的解释:

  1. 接收 设备正在使用在第一个空字符处停止的方法打印它接收到的数据。您如何确定传输设备在第一个空值处终止?问题可能出在更远的地方吗?
  2. 串行驱动程序损坏。这不太可能,但却是一个可能的解释。如果您使用一些狡猾的专有第三方串行端口及其驱动程序,那么它们可能会受到怀疑。如果您使用标准内置串行端口和普通 Windows 驱动程序,那么这可能不是问题。

我刚刚快速浏览了一下 RapidQ,还有第三种可能的解释:

  1. RapidQ 在调用 Win32 API 函数的过程中可能进行的封送处理可能会因要发送的数据中嵌入空字符而出现问题。我对RapidQ一无所知,但这是必须考虑的链条中的另一个环节。

其他提示

格雷格可能是正确的,但我还会检查您的 com 端口设置。确保您的 DCB 设置正确。查找 SetCommState 和 GetCommState 以获取信息。

通常,串行为 8N1,但您的设备可能使用其他奇偶校验或停止位配置等。

像格雷格一样,我自己也做了很多关于串行的工作,这通常可能是问题的根源......尝试使用 RS485 和不正确的 DCB 结构进行通信...呵呵..

拉里

附:如果您还没有,我建议您购买一个好的串行接线盒。我在房子周围有一个,它会向您显示所有通信期间所有线路上的所有信号,并且是一个非常强大的调试工具。

我已经在过去使用的WriteFile它工作得很好与空字节。我将挖成RapidQ,它可能是问题。

如果没有这种帮助,你总是可以做我想做的。使用格雷格的COMM代码来测试与设备。还记得QMODEM? :)非常好的工具,测试/调试串行程序。你甚至ccould使用QMODEM和简单QMODEM脚本来读取另一个框(或在同一个盒子的另一个端口)的COM端口,并打印出的每一个十六进制值CHAR发送。等一下。 QMODEM有内置的。:)使用调试ASCII仿真,它会显示每一个遇到的串行端口字符的十六进制值。然后,您至少可以验证,如果你的代码工作正常与否。

现在,问题。是否WriteFile的回报,当它击中了NULL,还是只是坐在那里等待,不知归路?

如果它永远不会返回,那么它可能不是你的代码。 WriteFile的只返回时,它发送的所有dwBytesToWrite,或者如果有一个错误。别的,和它试图写,但在另一端的故障。

要通过串口发送一个NULL字符,你可以使用setEndOfFile()函数,给端口处理器的文件。

如果你有太多的NULL数据要发送,它可能不理想,但它是一个解决办法。

功能细节

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top