我正在尝试在微控制器和c#windows应用程序之间实现串行通信。
我让一切都在计算机上正常工作到微控制器方向。但是我很难弄清楚如何在另一个方向上实现通信。
我的消息由4个字节组成
为了确保收到完整的消息,如果字节之间的间隔超过20毫秒,我就让微控制器放弃收到的当前消息,这似乎运行良好,可以容忍可能导致丢失的通信故障同步。
我不知道如何在c#应用程序中实现这种延迟,因为我知道你对时间的控制要少得多。
我见过其他发送启动和停止字符的ASCII协议,但我不确定如何在发送二进制数据时实现这一点,其中我的值可以在字节中取任何值,并且可能恰好是启动或停止性格是。
我需要保持微控制器端基本,因为我的资源有限,并且控制器主要任务需要非常精确(sub us range),将ascii转换为十进制可能有。
是否有人建议如何从微处理器或计算机端实现此目的。
修改
我在这里看了一些其他问题,但它们似乎都引用了更大的基于ASCII的消息。
答案 0 :(得分:1)
您可以使用以下命令
将read timeout设置为20msserialPort.ReadTimeout = 20;
这将使读取操作在20ms后超时,在这种情况下,您可以执行所需的操作。
不要使用ReadExisting
此超时,因为它不依赖于读取超时,
而是使用Read()
或readByte()
并检查Timeout Exception
即使成功写入,也可以使用WriteTimeout进行相同的操作。所以要小心。
答案 1 :(得分:1)
这是一个非常糟糕的主意。它假设电线另一端的机器能够提供相同的保证。在微控制器上,20毫秒完全没有问题。一台启动Linux或Windows的机器,没办法。忙于写入串行端口的线程很容易丢失处理器数百毫秒。在C#的情况下的垃圾收集。
只是不针对特殊情况进行优化,没有意义。超时应该在 second 范围内,比您预期的最差情况大十倍。通过构建协议使协议更加可靠。始终是一个启动字节,使接收器有机会重新同步。可能还包括一个长度字节,你迟早会需要它。在校验和上支持CRC。检查RFC916是否有可恢复的协议建议,尽管被广泛忽略。当我使用它时工作得很好,虽然它需要额外的工作才能使连接尝试可靠,你必须刷新接收缓冲区。