Как лучше всего передавать пакеты в Wireshark, например, из CAN

У нас есть регистратор, который передает сообщения шины CAN, например, из CAR через программу на C и по каналу в 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-----------------------

0 ответов

Другие вопросы по тегам