0

我们有一个记录器,它通过 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-----------------------
4

0 回答 0