2

ArduinoからJavaへの通信用のシリアルプロトコルを実装しています(片道)。

Arduinoから送信するすべてのフレームは次のようになります。

"G FF FF FFFF FFFF FFFF FFFF T" (The spaces are not part of the frame)
  • Gフレームが開始し、可能な値は。のみであることを意味しますG
  • sは、FHEX値としてエンコードされたペイロードです。可能な値:[0-F]
  • Tチェックサムです。可能な値:[H-Z]

チェックサムを計算するために、ArduinoとJava用の関数を作成しました。ただし、これらの関数を使用すると、Java側でフレームを受信すると、約50%の破損したフレームが発生します。

この問題は、Java変数の符号を外すことはできないという事実に関係していると思います。間違いを見つけられますか?それとも、単純なシリアル接続で送信したフレームの50%が破損する可能性はありますか?FRAME_LENGTH_WITHOUT_CRC21です。

Javaコード:

char checksum(byte[] frame) {
    short sum = 0;
    for (short i = 0; i < Config.FRAME_LENGTH_WITHOUT_CRC; i++) {
        sum += (char)frame[i];
    }
    return (char) ('H' + sum % 16);
}

Arduino Cコード:

char checksum(const char * str)
{
  uint8_t sum = 0;
  for (uint8_t i = 0; i < FRAME_LENGTH_WITHOUT_CRC; i++) {
    sum += (uint8_t)str[i];
  }
  return 'H' + sum % 16;
}
4

2 に答える 2

1

すべてのデータが到着する前にバッファーを読み取ったため、到着したと想定する21バイト未満のデータを読み取りました。InputStream私は、読み取りが戻る前にin.read(array[], offset, size)すべてのバイトを読み取ると想定しましたが、明らかにそうではありません。size–調光

于 2016-08-30T13:15:35.213 に答える
-2

メッセージは文字列であるため、文字から数字に変換する必要があります。あなたはただ幸運です、あなたは50%で正しいチェックサムを持っていました。

int charFromHex(char x)
{
   if ((x >= '0') && (x <= '9'))
   {
     return x - '0';
   }
   else if ((x >= 'A') && (x <= 'F'))
   {
      return x - 'A' + 10;
   }
   else
   {
     return 0; 
     //somehow handle error!
   }
{
于 2013-03-02T14:13:46.373 に答える