Как лучше всего передавать пакеты в 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-----------------------