【发布时间】:2016-05-07 00:09:19
【问题描述】:
我正在实现 SAS 协议,其中记录了 SAS 将使用大小为 11 位的数据包进行轮询,其中一个起始位、八个数据位、第九个唤醒位和一个停止位。还记录了当 SAS 发送消息时,它为消息的第一个字节设置唤醒位,之后其他字节消息的唤醒位被清除。 而且我们必须使用奇偶校验位作为唤醒位。
我在接收来自 comport 的数据时遇到问题。 我想得到的数据是:
01 73 1D 00 09 03 00 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 B3 74 A4 02 0E 76
但我得到了
73 1D 00 09 03 00 00 01 02 03 04 05 06
这里的第一个字节是01 没有进入接收到的数据以及06 之后的数据
下面是创建串口对象的代码。
SerialPort _serialPort = new SerialPort("COM1", 19200, Parity.None, 8, StopBits.One);
当我写信给 Comport 时,我将 Parity 设置为 MARK。喜欢:
byte[] f = Response.ToArray();
_serialPort.Parity = Parity.Mark;
_serialPort.Write(f, 0, f.Length);
当我从 comport 阅读时
private void port_DataReceived_1(object sender, SerialDataReceivedEventArgs e)
{
SASobj._serialPort.ParityReplace = 0;
SASobj._serialPort.Parity = Parity.Space;
byte[] data = new byte[SASobj._serialPort.BytesToRead];
SASobj._serialPort.Read(data, 0, data.Length);
InputData = ByteToHex(data);
this.BeginInvoke(new SetTextCallback(SetText), new object[] { InputData });
}
private void SetText(string text)
{
this.txtMessage.Text += text;
}
【问题讨论】:
-
该代码永远不会像您期望的那样工作,不能保证您在读取操作时会收到完整的数据包,看看我对这些问题的回答,它们将帮助您了解如何阅读数据正确:stackoverflow.com/questions/35175874/…stackoverflow.com/questions/35636655/…stackoverflow.com/questions/30499210/…
-
在
DataReceived事件中更改端口Parity是没有意义的;决定是Parity.None/.Space还是.Mark开头。我想这就是为什么你在第一个块之后停止接收数据的原因。还要发布ByteToHex方法,因为它可能有错误。此外,如果您想确保块不会乱序连接,您应该同步(在处理程序内部)将数据排入Queue<byte[]>(甚至是string)。 dispatch 整个队列/string的 UI 更新,因为SetText内部的连接可能会乱序执行。
标签: c# .net serial-port