0

我正在尝试在微控制器和 ac# windows 应用程序之间实现串行通信。

我在计算机到微控制器的方向上一切正常。但是我很难弄清楚如何在另一个方向上实现通信。

我的消息由 4 个字节组成

  • B0 – 正在发送的值的地址/名称
  • B1 – 高字节
  • B2 – 低字节
  • B3 – 校验和 = 字节 0-2 相加

为了确保接收到完整的消息,如果字节之间的时间超过 20 毫秒,我让微控制器放弃正在接收的当前消息,这似乎运行良好,并且可以容忍可能导致同步丢失的通信故障。

如果完全从 ac# 应用程序中,我不确定如何实现此延迟,因为我知道您对时间的精细控制要少得多。

我见过其他发送开始和停止字符的 ASCII 协议,但我不确定在发送二进制数据时如何实现这一点,其中我的值可以采用字节中可能的任何值,并且可能恰好是开始或停止字符是什么。

由于资源有限,我需要保持微控制器方面的基本功能,并且控制器的主要任务需要非常精确(低于我们的范围),将 ascii 转换为十进制可能具有。

是否有人对我应该如何从微处理器或计算机端实现这一点提出建议。

编辑
我在这里查看了其他一些问题,但它们似乎都指的是更大的基于 ASCII 的消息。

4

2 回答 2

1

您可以使用以下命令将读取超时设置为 20ms,

serialPort.ReadTimeout = 20;

这将使读取操作在 20 毫秒后超时,在这种情况下,您可以为所欲为。

不要使用ReadExisting此超时,因为它不依赖于读取超时,
而是使用Read()orreadByte()并检查超时异常

即使写入成功, WriteTimeout也可以这样做。所以要注意这一点。

于 2013-03-14T12:28:47.863 回答
1

这是一个非常糟糕的主意。它假设电线另一端的机器能够提供相同的保证。在微控制器上,20 毫秒根本不是问题。一台启动 Linux 或 Windows 的机器,没办法。忙于写入串行端口的线程很容易丢失处理器数百毫秒。C# 中的垃圾收集。

只是不要针对特殊情况进行优化,没有意义。超时应该在第二个范围内,比您预期的最坏情况大十倍。通过构建协议使协议更加可靠。总是一个开始字节,让接收者有机会重新同步。还不如包括一个长度字节,你迟早会需要它。优先使用 CRC 而不是校验和。查看 RFC916 以获得可恢复的协议建议,尽管被广泛忽略。我使用它时效果很好,虽然它需要额外的工作才能使连接尝试可靠,但您必须刷新接收缓冲区。

于 2013-03-14T13:45:11.523 回答