1

入ってくる情報を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:私はまだこれを理解していません、そして私は完全に一貫性のない結果を持っているより多くのテストデータを手に入れました(私が送信チェックサムから外れる量はパターンなしで毎回異なります)。チェックサムの計算が間違っているように感じますが、方法がわかりません。

4

3 に答える 3

2

バッファは文字列として定義されます。送信しているデータはバイトだと思いますが。バイト配列を使用することをお勧めします(ascii / utf /その他のエンコーディングを送信している場合でも)。次に、チェックサムが有効になったら、データを文字列に変換します

于 2009-10-09T19:12:14.953 に答える
1

BCCの計算は標準ではありませんが、「顧客定義」です。私たちはお客様のためにインターフェースをプログラムし、sum、xor、マスキング、stx、etx、またはその両方を分離する、またはすべての既知のバイトを分離するなど、さまざまなアルゴリズムを何度も見つけました。たとえば、パッケージ構造は「stx、マシンコード、コマンドコード、データ、...、データ、etx、bcc」であり、bccの計算は(顧客指定!)「コマンドコードからのすべてのバイトのバイナリ合計」です。最後のデータ(包括的)、およびすべて0xCDでマスクされています。つまり、最初にすべての不明なバイトを追加する必要があります(stx、etx、またはマシンコードを追加しても意味がありません。これらのバイトが一致しない場合、フレームはとにかく破棄されます!それらの値は、取得時にテストされます。フレームが正しく開始、終了し、受信側のマシンにアドレス指定されていることを確認してください。この場合は、フレーム内で変更できるバイトのみをbccする必要があります。これにより、時間が短縮されます。多くの場合、4ビットまたは8ビットの低速マイクロコントローラーで動作します。注意してください。これはバイトを合計するものであり、それらをxorするものではありません。単なる例ですが、他の顧客は何か他のものを望んでいます)、次に、合計(加算中に切り捨てられない場合は16ビットになる可能性があります)を取得した後、キー(この例では0xCD)でマスク(ビット単位のAND)します。この種のものは、暗号化などに加えて、保護上の理由などで、たとえばATM(シリアルキーボードをATMに接続する)など、あらゆる種類の近接システムで頻繁に使用されます。したがって、2台のマシンが(非標準の)BCCをどのように計算しているかを実際に確認(「クラック」と読む)する必要があります。多くの場合、4ビットまたは8ビットの低速マイクロコントローラーを使用しますが、注意してください。これはバイトを合計するものであり、それらをxorするものではありません。これは単なる例であり、他の顧客は何か他のものを望んでいます)。加算中に切り捨てられない場合は16ビットになる可能性があります)、キー(この例では0xCD)でマスクします(ビット単位のAND)。この種のものは、暗号化などに加えて、保護上の理由などで、たとえばATM(シリアルキーボードをATMに接続する)など、あらゆる種類の近接システムで頻繁に使用されます。したがって、2台のマシンが(非標準の)BCCをどのように計算しているかを実際に確認(「クラック」と読む)する必要があります。多くの場合、4ビットまたは8ビットの低速マイクロコントローラーを使用しますが、注意してください。これはバイトを合計するものであり、それらをxorするものではありません。これは単なる例であり、他の顧客は何か他のものを望んでいます)。加算中に切り捨てられない場合は16ビットになる可能性があります)、キー(この例では0xCD)でマスクします(ビット単位のAND)。この種のものは、暗号化などに加えて、保護上の理由などで、たとえばATM(シリアルキーボードをATMに接続する)など、あらゆる種類の近接システムで頻繁に使用されます。したがって、2台のマシンが(非標準の)BCCをどのように計算しているかを実際に確認(「クラック」と読む)する必要があります。合計(加算中に切り捨てられない場合は16ビットになる可能性があります)を取得した後、キー(この例では0xCD)でマスク(ビット単位のAND)します。この種のものは、暗号化などに加えて、保護上の理由などで、たとえばATM(シリアルキーボードをATMに接続する)など、あらゆる種類の近接システムで頻繁に使用されます。したがって、2台のマシンが(非標準の)BCCをどのように計算しているかを実際に確認(「クラック」と読む)する必要があります。合計(加算中に切り捨てられない場合は16ビットになる可能性があります)を取得した後、キー(この例では0xCD)でマスク(ビット単位のAND)します。この種のものは、暗号化などに加えて、保護上の理由などで、たとえばATM(シリアルキーボードをATMに接続する)など、あらゆる種類の近接システムで頻繁に使用されます。したがって、2台のマシンが(非標準の)BCCをどのように計算しているかを実際に確認(「クラック」と読む)する必要があります。

于 2011-04-20T07:02:13.780 に答える
0

ポート設定コードのどこかでnullバイトを受け入れるようにポートが設定されていることを確認してください。(これはおそらくデフォルト値ですが、よくわかりません。)

port.DiscardNull = false;

また、シリアルポートに到着するバイトのタイプを確認し、データのみを受け入れます。

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    if (e.EventType == SerialData.Chars)
    {
        // Your existing code
    }
}
于 2009-10-10T09:42:58.487 に答える