c#/ net /中的串行通信编程结构

时间:2009-10-18 09:42:54

标签: c# .net serial-port

我是一名嵌入式程序员,试图为通信应用程序做一些编码,并需要一个快速入门指南,以最好/最简单的方式做某事。

我正在成功发送串行数据包,但需要采用某种形式的发送/响应协议,以避免目标系统溢出并确保收到数据包。

现在 - 我点击一下按钮就可以获得所有传输代码,并且无需任何控制即可发送整个代码。 构造这段代码的最佳方法是什么,即发送一些数据包 - 等待响应...发送更多......等等,直到完成所有操作,然后继续执行主程序。 我以前没有在这个环境中使用线程或回调等,但是会学习 - 我只需要一个指向最直接的方法的指针。

由于 罗布

5 个答案:

答案 0 :(得分:1)

.NET serialport使用缓冲区,学会使用它们。

发送(远小于)发送缓冲区的数据包无需线程即可完成。

接收可以通过DataReceived事件完成,但要注意从另一个线程调用。您也可以从那里开始自己的线程并使用阻塞读取。

最佳方法取决于您的“数据包”和协议的外观。

答案 1 :(得分:1)

我认为对于基于MCU和PC的串行通信有很长的经验 我强烈反对UNSUGGEST基于单线程的解决方案,虽然它对于光速测试非常困难,但绝对是最终版本。
当然,您可以选择多种模式,但它们主要围绕通信过程的专用线程和有限状态机来解析协议(在接收期间)。
prevoius答案让您了解如何构建一个简单的程序,但它可能取决于协议规范,目标设备,应用程序的范围等。

答案 2 :(得分:0)

当然有不同的方式。

我将基于线程描述基于异步操作的方式:

  • 如果您不使用线程,只要操作正在执行,您的应用就会阻止。这不是用户今天所期望的。由于您正在讨论一系列发送和接收命令,我建议将协议作为线程启动,然后等待它完成。如果需要,您也可以放置一个Abort按钮。设置ReadTimeout值,并在每次接收时准备好捕获异常!创建这样一个工作线程的介绍是here
  • 如果您愿意,请使用异步发送/接收功能而不是线程(例如NetworkStream.BeginRead等)。但这更难,因为你必须在调用之间管理状态:我建议使用有限状态机。实际上,您创建一个枚举(即ProtocolState)并在操作完成时更改状态。然后,您可以使用简单的switch / case语句创建一个执行协议下一步的函数。由于您正在使用远程实体(在您的情况下是串行目标系统),因此您始终必须考虑设备无法正常工作或在协议期间停止工作。通过启动超时计时器(例如设置为2000ms)并在发送每个命令后启动它(假设每个命令将在您的协议中得到答复)来执行此操作。如果成功收到命令或超时,则停止它。

答案 3 :(得分:0)

您还可以在串口上实现低级握手;将串口的Handshake属性设置为rts / cts或xon / xoff。

否则(或另外),使用后台工作线程。对于简单的线程,我喜欢用于管理线程的Monitor.Wait / Pulse机制。

我有一些代码在线程中执行只读串行通信;给我发电子邮件,我很乐意发给你。

答案 4 :(得分:0)

我不确定你的问题是否正在设计通信链接的PC和嵌入式方面,如果你是,你可能会发现this SO question有趣。

相关问题