我正在编写一个应用程序,它通过串行连接从远程无线电接收一些输入。我目前正在使用 SerialPort C# 类来接收和发送数据,但我遇到了一些问题。我注意到我用于接收数据的功能没有正确设置缓冲区字节数组大小。所有数据都以字节码(十六进制)发送。
假设另一个节点发送了 103 个字节的数据。单步执行我的代码并在“Read()”行设置断点,我看到“serialPort1.BytesToRead-1”的计算结果为 103,但 byte[] 数组仅初始化为 17。我对此行为没有任何解释. 结果,只有前 17 个字节被放入数组中。继续执行该步骤,触发了相同的事件,这次“serialPort1.BytesToRead-1”评估为 85(大概是因为仅读取了 103 个字节中的前 17 个。
如果我将数据数组大小硬核为 103,它可以完美地一次通过。但是,目前我无法一次将所有数据存储在我的字节数组中,这导致了很多问题。任何人都知道为什么我的字节数组被初始化为如此任意大小???
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] data = new byte[serialPort1.BytesToRead - 1];
serialPort1.Read(data, 0, data.Length);
DisplayData(ByteToHex(data) /*+ "\n"*/);
}
更新:这是我正在尝试的新方法。isHeader 是一个布尔值,最初设置为 true(因为从数据包接收的前两个字节实际上是数据包的长度)。
const int NUM_HEADER_BYTES = 2;
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
byte[] headerdata = new byte[2];
if (isHeader)
{
serialPort1.Read(headerdata, 0, NUM_HEADER_BYTES);
int totalSize = (headerdata[0] << 8 | headerdata[1]) >> 6;
serialPort1.ReceivedBytesThreshold = totalSize - NUM_HEADER_BYTES;
data = new byte[totalSize - NUM_HEADER_BYTES];
isHeader = false;
}
else
{
serialPort1.Read(data, 0, data.Length);
double[][] results = ParseData(data, data.Length);
serialPort1.ReceivedBytesThreshold = NUM_HEADER_BYTES;
isHeader = true;
DisplayData(ByteToHex(data) /*+ "\n"*/);
}
}