2012-12-10 135 views
0

我想与外部机器使用串行端口进行通信,我做了什么,发送命令获得正面响应,然后发送ENQ,并在输出中显示最终响应。串行端口通信,数据接收

第一个问题是输出结果重复3次,因为我不是使用程序中的任何循环的怪异,

第二个问题是我想的结果提取到计算响应BCC我不是当然,我可以从缓冲区读取数据并从缓冲区中提取数据!

+0

我可以看到你真的不知道DataReceived是如何工作的。我在使用串口时遇到了非常类似的问题。如果你像我一样使用win32第三方串行端口控件,你应该已经看到.NET SerialPort DataReceived不能像你的win32程序那样工作。我们认为DataReceived只会在所有传入字节进入其缓冲区时触发,但事实并非如此。它几乎是随机的。实际上,一旦DataReceived看到缓冲区中的任何字节,就会触发它。这意味着你必须将所有字节排入缓冲区或等待一段时间,然后读取 – ThN

+0

这里有一篇很好的文章,由微软网站上的其他程序员在SerialPort上发布 - http://social.msdn.microsoft.com/Forums/en -US/vbgeneral /线程/ a709d698-5099-4e37-9e10-f66ff22cdd1e /#e8bbfd3d-06c6-40b3-9183-45913538aea1 – ThN

回答

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,以便在消息汇编时,任何想要汇编消息的对象都将注册为侦听器,然后提供汇编的消息。

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

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