2

ArduinoイーサネットR3にこのRFIDモジュールを使用していますが、タグの外側に書き込まれているカード( TAG )IDをソフトウェアシリアルから取得する必要があります。モジュールのデータシートには、14バイトがArduinoに送信されると記載されています。最初はヘッダー、最後はフッター、フッターの2バイト前はチェックサム、残りの10バイトはタグIDを含むASCIIデータです。

カードのIDを再作成し、チェックサムを制御するにはどうすればよいですか?たとえば、次のIDを持つタグの場合:0013530444、Arduinoの応答は次のとおりです。

I received: 2
I received: 51
I received: 67
I received: 48
I received: 48
I received: 67
I received: 69
I received: 55
I received: 53
I received: 52
I received: 67
I received: 67
I received: 66
I received: 3

しかし、Arduinoが読み取ったIDを画面に印刷する方法がわかりません。チェックサムの計算方法は?

http://www.seeedstudio.com/wiki/index.php?title=125Khz_RFID_module_-_UART

誰か助けてもらえますか?

4

2 に答える 2

3

チェックサムの計算方法のウォークスルーは次のとおりです。

カード番号を取得します(これはテキストから直接引用されています)

I received: 2
I received: 51
I received: 67
I received: 48
I received: 48
I received: 67
I received: 69
I received: 55
I received: 53
I received: 52
I received: 67
I received: 67
I received: 66
I received: 3

これにより、次のような数値が得られます。

2 51 67 48 48 67 69 55 53 52 67 67 66 3

最初の数字(2)は、これが要求の始まりであることを示します。

最後の数字(3)は、これがリクエストの終わりであることを示しています。

2 51 67 48 48 67 69 55 53 52 67 67 66 3

チェックサムを計算するために、これら2つの数値を削除します。つまり、新しい番号は次のようになります。

51 67 48 48 67 69 55 53 52 67 67 66

あなたが持っている最後の2つの数字はあなたのチェックサムです。残りの番号はあなたのカード番号です。それで:

カード番号は次のとおりです。

51 67 48 48 67 69 55 53 52 67

そして、チェックサムは次のとおりです。

67 66

次に、カード番号とチェックサムをASCII値に変換する必要があります。

カード番号は次のとおりです。

3 C 0 0 CE 7 5 4 C

そして、チェックサムは次のとおりです。

CB

次に、各番号をペアにまとめます。

カード番号は次のとおりです。

3C 00 CE 75 4C

そして、チェックサムは次のとおりです。

CB

次に、各ペアを16進値として扱い、それらに対してXORを実行する必要があります。したがって、基本的に次のことを証明する必要があります。

3C ^ 00 ^ CE ^ 75 ^ 4C == CB

(3C ^ 00)= 3C

3C ^ CE ^ 75 ^ 4C == CB

(3C ^ CE)= F2

F2 ^ 75 ^ 4C == CB

(3C ^ CE)= 87

87 ^ 4C == CB

(87 ^ 4C)= CB

CB == CB

CB == CBであるため、これは有効なトランザクションです。

他の誰かがこれよりも優れたアプローチを思い付くことができることは間違いありませんが、自分で作成するのに十分な擬似コードがここにあるはずです。

于 2012-10-04T17:21:29.477 に答える
0

Arduinoに実装されているこのブログを見つけました。動作するように調整しましたがJava、結果は良好です。ビット単位の演算がたくさんあるので、私はhttp://www.miniwebtool.com/bitwise-calculator/を使用して、何が起こっているのかを理解しようとしました。私はそれを除いてすべてを理解して(val | (tempbyte << 4))います。つまり、ステートメントが何をするのかを理解しているということです。それがどのように私が望む結果を生み出すのかを理解するのに苦労しています。

void loop () {
  byte i = 0;
  byte val = 0;
  byte code[6];
  byte checksum = 0;
  byte bytesread = 0;
  byte tempbyte = 0;

  if(Serial.available() > 0) {
    if((val = Serial.read()) == 2) {
      // check for header 
      bytesread = 0; 
      while (bytesread < 12) {
        // read 10 digit code + 2 digit checksum
        if( Serial.available() > 0) {
          val = Serial.read();
          if((val == 0x0D)||(val == 0x0A)||(val == 0x03)||(val == 0x02)) {
            // if header or stop bytes before the 10 digit reading
            break;
            // stop reading
          }
          // Do Ascii/Hex conversion:
          if ((val >= '0') && (val <= '9')) {
            val = val - '0';
          } else if ((val >= 'A') && (val <= 'F')) {
            val = 10 + val - 'A';
          }
          // Every two hex-digits, add byte to code:
          if (bytesread & 1 == 1) {
            // make some space for this hex-digit by
            // shifting the previous hex-digit with 4 bits to the left:
            code[bytesread >> 1] = (val | (tempbyte << 4));
            if (bytesread >> 1 != 5) {
              // If we're at the checksum byte,
              checksum ^= code[bytesread >> 1];
              // Calculate the checksum... (XOR)
            };
          } else {
            tempbyte = val;
            // Store the first hex digit first...
          };
          bytesread++;
          // ready to read next digit
        }
      }
      // Output to Serial:
      if (bytesread == 12) {
        // removed code for clarity
        LCD.print("Check:");
        LCD.print(code[5], HEX);
        LCD.print(code[5] == checksum ? "-passed" : "-error");
      }
      bytesread = 0;
    }
  }
}

私のJava/AndroidポートはをリッスンしていBluetoothSocketます。BlueTermのコードをベースとして使用していますが、このコードはに含まれていConnectedThreadます。すべてのばかげたコメントについてお詫びしますが、私はまだJavaを学んでいます)。

//assume you have checksum as int and code as int array. it will overflow if bytes are used like above example
public void run() {
  Log.d(TAG, "BEGIN mConnectedThread");
  byte[] buffer = new byte[1024];
  int bytes;
  // Keep listening to the InputStream while connected
  while (true) {
    Log.d(TAG, "Running");
    try {
      // Read from the InputStream
      bytes = mmInStream.read(buffer);
      for (int i = 0; i < bytes; i++) {
        Log.d(TAG, "Reading: " + i + " of " + bytes + " from input stream");
        byte b = buffer[i];
        try {
          if(bytesread >= 0) {
            //just printing ASCII
            char printableB = (char) b;
            if (b < 32 || b > 126) printableB = ' ';
            Log.d(TAG, "'" + Character.toString(printableB) + "' (" + Integer.toString(b) + ")");
            if((b == 0x0D)||(b == 0x0A)||(b == 0x03)||(b == 0x02)) {
              // if header or stop bytes before the 10 digit reading
              Log.e(TAG, i + " Unexpected header while processing character " + Integer.toString(b));
            } else {
              // Do ASCII/Hex conversion
              if ((b >= '0') && (b <= '9')) {
                b = (byte) (b - '0');
              } else if ((b >= 'A') && (b <= 'F')) {
                b = (byte) (10 + b - 'A');
              }
              if ((bytesread & 1) == 1) {
                //if isOdd(bytesread)
              // make some space for this hex-digit by shifting the previous hex-digit with 4 bits to the left:
              code[bytesread >> 1] = (b | (tempbyte << 4));
              if (bytesread >> 1 != 5) {
                // If we're not at the checksum byte,
                checksum ^= code[bytesread >> 1];
                // Calculate the checksum... (XOR)
              }
            } else {
              // Store the first hex digit first
              tempbyte = b; 
            }
          }
          bytesread++;
        } else if(b == 2) {
          bytesread = 0;
          Log.d(TAG, "Header found!");
        }
        if(bytesread == 12) {
          String check = (code[5] == checksum ? "-passed" : "-error");
          String r = "";
          for(int j = 0; j < 5; j++){
            r += Integer.toString(code[i]);
          }
          Log.d(TAG, "Check:" + Integer.toString(code[5]) + check);
          init();
        } else if(bytesread > 12){
          Log.e(TAG, "Too many bytes!");
        }
      } catch (Exception e) {
        Log.e(TAG, i + " Exception while processing character " + Integer.toString(b), e);
      }
    }
    String a = buffer.toString();
    a = "";
  } catch (IOException e) {
    Log.e(TAG, "disconnected", e);
    connectionLost();
    break;
  }
}
Log.i(TAG, "END mConnectedThread");
}
于 2013-08-31T16:01:29.110 に答える