[英]Read bytes with 921600 baud C#
我必须通过 RS-422 实时接收和处理 arrays 字节,比特率为 921600。 我一次处理大约 3500 个字节,我的问题是我后来丢失了大约 2800 个字节。
我使用: client.OnReceiving += new EventHandler<DataStreamEventArgs>(receiveHandler);
void receiveHandler(object sender, DataStreamEventArgs e)
{
ReadData(e.Response);
}
void ReadData (byte[] byteBuffer)
{
if (byteBuffer != null)
{
for (int i = 0; i < byteBuffer.Length; i++)
{
if (i < byteBuffer.Length-1 && byteBuffer[i] == 0xAA && byteBuffer[++i] == 0xBA)
{
results = new byte[138];
Buffer.BlockCopy(byteBuffer, i + 1, results, 0, results.Length);
byte[] h = { results[results.Length - 2], results[results.Length - 1] };
ControlSum = (ushort)BitConverter.ToInt16(h, 0);
results = results.Take(results.Count() - 2).ToArray();
ushort u = checkSum.CRC_Calc(results);
PackCounterForAll++;
if (ControlSum == u)
{
int offset = 0;
@float = results.Skip(8)
.ToArray()
.GroupBy(x => offset++ / 4)
.Select(x => BitConverter.ToSingle(x.ToArray(), 0))
.ToArray();
PackCounter++;
}
}
}
}
}
首先,我必须找到两个起始字节,写入一个 138 字节的数据包,并计算其校验和。 据我了解,我通过以下方式处理第一个字节:
public int Receive(byte[] bytes, int offset, int count)
{
int readBytes = 0;
if (count > 0)
{
readBytes = _serialPort.Read(bytes, offset, count);
}
return readBytes;
}
我处理它们,然后我开始丢失它们。 我怎样才能解决这个问题?
这取决于你的情况和愿望。 最简单的方法是使用一些流量控制信号(例如 RTS / CTS)来向您的发送端点发出信号,表明您暂时无法处理数据。 根据您的连接,您可以使用硬件来做到这一点:
硬件流控制使用 RS-232 的 RTS 和 CTS 信号来指示数据传输何时应该暂停或重新开始。 例如,如图所示,当PC1准备接收时,它拉高RTS信号向PC2请求数据
或使用软件(如果您没有连接硬件线或无法控制硬件端口):
软件流控制通过数据通道发送 XON/XOFF 信号来工作。 例如,如下图所示,PC2在准备接收时发送一个XON pattern,然后当它的Rx buffer快满时,它发送一个XOFF pattern请求PC1停止发送
快速搜索显示这个 PDF 为您解释主题,但 inte.net 充满了它(只是谷歌流量控制 RS-244):
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.