串行消息分离

时间:2013-03-14 03:35:23

标签: c# synchronization serial-port communication microcontroller

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

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

我的消息由4个字节组成

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

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

我不知道如何在c#应用程序中实现这种延迟,因为我知道你对时间的控制要少得多。

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

我需要保持微控制器端基本,因为我的资源有限,并且控制器主要任务需要非常精确(sub us range),将ascii转换为十进制可能有。

是否有人建议如何从微处理器或计算机端实现此目的。

修改
我在这里看了一些其他问题,但它们似乎都引用了更大的基于ASCII的消息。

2 个答案:

答案 0 :(得分:1)

您可以使用以下命令

read timeout设置为20ms
serialPort.ReadTimeout = 20;

这将使读取操作在20ms后超时,在这种情况下,您可以执行所需的操作。

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

即使成功写入,也可以使用WriteTimeout进行相同的操作。所以要小心。

答案 1 :(得分:1)

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

只是不针对特殊情况进行优化,没有意义。超时应该在 second 范围内,比您预期的最差情况大十倍。通过构建协议使协议更加可靠。始终是一个启动字节,使接收器有机会重新同步。可能还包括一个长度字节,你迟早会需要它。在校验和上支持CRC。检查RFC916是否有可恢复的协议建议,尽管被广泛忽略。当我使用它时工作得很好,虽然它需要额外的工作才能使连接尝试可靠,你必须刷新接收缓冲区。