串口通信,数据接收

时间:2012-12-10 02:29:06

标签: c# serial-port checksum

我正在尝试使用串口与外部机器通信以及我做了什么,发送命令获得肯定响应然后发送ENQ和输出中的这里应该向我显示最终响应。

第一个问题是输出结果重复3次并且很奇怪,因为我在程序中没有使用任何循环,

第二个问题我想提取结果以计算响应BCC我不知道如何从缓冲区读取和从缓冲区中提取!

1 个答案:

答案 0 :(得分:0)

使用串行通信端口或其他类型的慢速数据传输机制时,必须考虑到CPU可能比通过速度慢得多的通信端口传输数据快得多。

我建议你看看这个堆栈溢出parsing/formatting data from serial port - C#

您将遇到的第二个问题是在字节流上放置一个结构,该结构将字节流中的各种消息分开。通常情况下,方法是拥有一系列软件级别,protocol stack similar to the OSI Model,以便软件的不同区域处理通信问题的不同方面或部分。

使用串行通信端口时,通常会有某种协议指定起始指示符字节,一系列消息字节和结束指示符。

此协议指定传输的实际消息,以便发送方和接收方可以获取字节流并将其切换为单个消息。然后将这些单独的消息提供给其他一些函数,以实际解析并执行某些操作。

阅读您的来源似乎需要重新思考您采用更模块化和更多层次化方法的方法。

例如,您的端口接口层应该处理单个字节,以便将字节组合成一个消息。我将采取的方法是使用finite state machine方法(另见state machines - basic of computer science)。我会使用observer pattern,以便在汇编消息时,任何想要汇编消息的对象都会注册为侦听器,然后提供已汇编的消息。

所以我会有一个处理通信端口事件的对象。该对象将从通信端口读取字节流,然后汇集来自流的各个消息的字节数组。我希望这将是一个单例对象,以确保只有一个对象与通信端口进行交互,因此该对象也可以使用方法将消息写入通信端口。

此对象还将实现观察者模式,以便其他对象可以注册通信端口消息。收到完整的消息后,通信端口对象就会将其提供给所有已注册的侦听器。