【发布时间】:2014-11-12 20:31:45
【问题描述】:
我有一个相对较短的 C# 程序,它使用以下格式通过 RS232 端口提供数据:
“STX”标头“校验和”“ETX”
“STX”数据1“校验和”“ETX”
'STX' ...'校验和''ETX'
“STX”数据N“校验和”“ETB”
接收端应该在收到 ETX/ETB 时回复一个 ACK 或 NAK 字节。
这在装有 Windows 7 64 位的计算机上运行良好。
但是,让程序在 Win XP 32 机器上启动时出现问题,因为我已将程序构建为面向 .NET 版本 4.5(该版本的 Win XP 显然不支持该程序)。
我将它改为面向 .NET 版本 4,现在程序启动得很好。但是接收端不再用 ACK 或 NAK 响应,只有第一次(在发送数据文件头时)。 我在控制台上打印出字节缓冲区,在 ETX 字节应该存在的地方有一个带有 BASE 符号 (↨) 的向上箭头,它告诉我它以某种方式根本没有发送 ETX。
这很奇怪,它在 Windows 7 机器上运行良好,并且第一次传输(报头)返回一个 ACK 就像它应该的那样,但是当第一个数据包被发送时没有更多的回复......没有 ACK 或NAK。
【问题讨论】:
-
SerialPort出问题并没有什么奇怪的。众所周知,它可以在不同的平台上做很多技巧。查看 connect.microsoft.com 以查看从 4->4.5 升级可能修复了哪些错误(如果 win7 的行为在框架切换上发生了变化,很明显有些问题)。另外,启动你的串口调试器,看看发生了什么。I printed out the byte buffer on the console没有调试:P -
控制台中显示 ↨ 字形,用于 ASCII 代码 23。这是 ETB 控制字符。所以这不是你的问题。在使用 SerialPort 的代码中存在细微的计时错误非常很常见,忽略 Read() 的返回值是一个标准错误。不为 ErrorReceived 事件实现事件处理程序是另一回事。
-
@ChrisEelmaa 我知道我上周五没有时间开始调试,但我会在周一开始。因此,由于 SerialPort 有点狡猾,今天推荐的串行通信方式是什么?也许是第三方库?