CプログラムとWiresharkへのパイプを介してCARなどからCANバスメッセージをストリーミングするロガーがあります。これはうまく機能しますが、場合によっては重大なパケット損失が発生しています。
現在、C コードは一度に 1 バイトを処理します。それがどのタイプのバイトであるかをテストし、それに応じて処理します。互いに接近しているパケットを見逃すため、これが損失の原因である可能性が最も高くなります。
この「パケット フィード」を 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-----------------------