Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#/net中的串行通信编程结构/_C#_.net_Serial Port - Fatal编程技术网

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

c#/net中的串行通信编程结构/,c#,.net,serial-port,C#,.net,Serial Port,我是一名嵌入式程序员,试图为一个通信应用程序编写一点代码,需要一份关于最佳/最简单方法的快速入门指南 我正在成功地发送串行数据包,但需要实现某种形式的发送/响应协议,以避免目标系统溢出,并确保数据包接收正常 现在-我有一个按钮下点击所有的传输代码,它发送没有任何控制整批。 构造此代码的最佳方式是什么,即发送一些数据包-等待响应。。发送更多。。等等,直到一切都完成,然后继续主程序。 我以前没有在这个环境中使用过线程或回调之类的东西,但我会学习的——我只需要一个指向最严格的方法的指针 谢谢 Rob当

我是一名嵌入式程序员,试图为一个通信应用程序编写一点代码,需要一份关于最佳/最简单方法的快速入门指南

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

现在-我有一个按钮下点击所有的传输代码,它发送没有任何控制整批。 构造此代码的最佳方式是什么,即发送一些数据包-等待响应。。发送更多。。等等,直到一切都完成,然后继续主程序。 我以前没有在这个环境中使用过线程或回调之类的东西,但我会学习的——我只需要一个指向最严格的方法的指针

谢谢
Rob

当然有不同的方法

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

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

    • .NET serialport使用缓冲区,请学习如何使用缓冲区

      发送(远)小于发送缓冲区的数据包时,可以不使用线程

      接收可以由DataReceived事件完成,但请注意,它是从另一个线程调用的。您还可以启动自己的线程并从那里使用阻塞读取


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

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

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


      我有一些在线程中进行只读串行通信的代码;给我发电子邮件,我很乐意将其发送给您。

      我想我对串行通信有很长的经验,包括MCU和基于PC的串行通信。
      我强烈反对基于单线程的解决方案,尽管它对光速测试非常严格,但绝对不适合最终版本。
      当然,您可以从几种模式中进行选择,但它们主要围绕一个专用线程进行通信处理,以及一个有限状态机来解析协议(在接收期间)。

      prevoius的答案为您提供了一个如何构建一个简单程序的想法,但这可能取决于协议规范、目标设备、应用范围等。

      从您的问题中,我不确定您是否同时设计了PC和通信链路的嵌入式端,如果是,您可能会觉得有趣