【问题标题】:Does the .NET SerialPort class (C#) behave differently on older systems?.NET SerialPort 类 (C#) 在旧系统上的行为是否不同?
【发布时间】: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 有点狡猾,今天推荐的串行通信方式是什么?也许是第三方库?

标签: c# .net windows


【解决方案1】:

万一有人遇到类似问题;我的问题是我使用了 USB 到串行转换器。这导致时间变得一团糟。我为解决这个问题所做的是订阅SerialPortDataReceived 事件,然后使用serialport.ReadExisting() 获取事件处理程序中的数据(这也清除了接收缓冲区)。所以线程大致会做:

发送数据 -> 等待 DataReceive 触发 -> 处理数据 -> 重复。

请务必在等待循环中设置超时。

【讨论】:

  • 在 x64 和 x32 Windows 7 下有类似的问题,串行端口缓冲区的行为略有不同。
猜你喜欢
  • 2011-11-03
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
  • 2022-07-16
相关资源
最近更新 更多