我们有一个记录器,它通过 C 程序和管道将 CAN 总线消息从例如 CAR 流式传输到 Wireshark。这很好用,尽管我们遇到了一些丢包,在某些情况下很严重。
现在 C 代码一次处理一个字节,包括。测试它是什么类型的字节,然后相应地处理它。这很可能是丢失的原因,因为我们错过了靠近的数据包。
是否有关于如何处理这种“数据包馈送”到 Wireshark 的最佳实践?例如,创建传入字节的“缓冲区数组”会更好,然后通过另一个函数处理这些字节以避免丢失 - 还是有另一个普遍应用的最佳实践?
谢谢你。最好的,马丁
编辑1:
我们似乎在高流量时遇到了这个问题(例如,每 10 毫秒或更频繁的帧)。现在我正在逐字节读取,检查字节以识别帧开始和结束,然后返回帧。当我必须对帧进行这种连续操作并输出它们时,你们中是否有人知道是否有更好的方法来读取数据?
在下面的代码示例中,我删除了所有错误处理和任务取消。
-----------------------TEXT-----------------------
-----------------------C# CODE-----------------------
private bool _listen = true;
private SerialPort _port = new SerialPort();
private async void serialListenStart()
{
if (_port != null && _port.IsOpen == true)
{
try
{
await listenForTraffic().ConfigureAwait(false);
}
catch{}
}
}
private async Task listenForTraffic()
{
while (_listen)
{
try
{
var _task = ReadFrameAsync();
await _task.ConfigureAwait(true);
byte[] frame = _task.Result;
// Do stuff with frame and output to user
}
catch{}
}
return;
}
private async Task<byte[]> ReadFrameAsync()
{
byte[] buffer = new byte[1];
byte[] resultFrame = new byte[32]; // a frame will be less than 32 bytes
int pos = 0;
bool destuffingNeeded = false;
while (true)
{
try
{
// Await a data byte from the serial port
await _port.BaseStream.ReadAsync(buffer, 0, 1).ConfigureAwait(true);
}
catch{}
if (pos == 0)
{
if (buffer[0] == 0x7E) // Identify start of frame byte
{
resultFrame[pos] = buffer[0];
pos++;
}
}
else
{
if (destuffingNeeded) // Do destuffing if needed
{
destuffingNeeded = false;
resultFrame[pos] = (byte)((byte)0x20 ^ buffer[0]); // Complement the byte's 6th bit
pos++;
}
else if (buffer[0] == 0x7D) // Identify byte 7D and transform the subsequent byte to 7D or 7E
{
destuffingNeeded = true; // Ignore byte - just advance to next byte
}
else if (buffer[0] == 0x7E) // Identify end of frame byte
{
resultFrame[pos] = buffer[0];
Array.Resize(ref resultFrame, pos + 1);
return resultFrame;
}
else // all bytes between Start and End that don't need destuffing
{
resultFrame[pos] = buffer[0];
pos++;
}
}
}
}
-----------------------C# CODE-----------------------