我正在写一个应用程序,通过串行连接接收来自远程无线电的一些输入。我目前使用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"*/);
}
}
你有没有想过将serialPort1.Read()方法改为serialPort1.ReadAllBytes() – MethodMan
我没有。我担心的是,如果出于任何原因,在接收到新数据包之前没有及时处理数据包,整个数据包将被接收,并且我的解析函数会随着异常和不正确的数据发生。然而,我可能是错的。 – Burzum619