入ってくる情報をSerialPortでリッスンするC#で書かれた小さなアプリケーションがあります。情報は次のように届きますSTX + data + ETX + BCC
。次に、送信パケットのBCCを計算し、比較します。関数は次のとおりです。
private bool ConsistencyCheck(byte[] buffer)
{
byte expected = buffer[buffer.Length - 1];
byte actual = 0x00;
for (int i = 1; i < buffer.Length - 1; i++)
{
actual ^= buffer[i];
}
if ((expected & 0xFF) != (actual & 0xFF))
{
if (AppTools.Logger.IsDebugEnabled)
{
AppTools.Logger.Warn(String.Format("ConsistencyCheck failed: Expected: #{0} Got: #{1}", expected, actual));
}
}
return (expected & 0xFF) == (actual & 0xFF);
}
そして、それは多かれ少なかれ機能するようです。STXまたはBCCは正確に含まれておらず、計算にはETXが正確に含まれています。非常に大きな割合で動作しているようですが、これを実行しているマシンは少なくとも2台あり、どちらもWindows 2008 64ビットであり、BCC計算が加算されることはありません。私が1バイトに持っていた最近のログからプルして20が送信され、16を計算し、1つは11が送信され、27を計算しました。
私はここで何が起こっているのか絶対に困惑しています。私がここで見逃している64ビットまたはWindows2008の「落とし穴」はおそらくありますか?どんな助けでも、あるいは野蛮な考えさえもいただければ幸いです。
編集:
データを読み取るコードは次のとおりです。
private void port_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
// Retrieve number of bytes in the buffer
int bytes = serialPort.BytesToRead;
// Create a byte array to hold the awaiting data
byte[] received = new byte[bytes];
//read the data and store it
serialPort.Read(received, 0, bytes);
DataReceived(received);
}
そして、DataReceived()
関数はその文字列を受け取り、それをグローバルStringBuilder
オブジェクトに追加します。その後、これらのさまざまな関数に渡されるまで文字列ビルダーとして残り、その時点で.ToString()
が呼び出されます。
EDIT2:文字列ではなくバイト/バイト配列で動作する変更されたルーチンを反映するようにコードを変更しました。
EDIT3:私はまだこれを理解していません、そして私は完全に一貫性のない結果を持っているより多くのテストデータを手に入れました(私が送信チェックサムから外れる量はパターンなしで毎回異なります)。チェックサムの計算が間違っているように感じますが、方法がわかりません。