ArduinoからJavaへの通信用のシリアルプロトコルを実装しています(片道)。
Arduinoから送信するすべてのフレームは次のようになります。
"G FF FF FFFF FFFF FFFF FFFF T" (The spaces are not part of the frame)
G
フレームが開始し、可能な値は。のみであることを意味しますG
。- sは、
F
HEX値としてエンコードされたペイロードです。可能な値:[0-F]
T
チェックサムです。可能な値:[H-Z]
チェックサムを計算するために、ArduinoとJava用の関数を作成しました。ただし、これらの関数を使用すると、Java側でフレームを受信すると、約50%の破損したフレームが発生します。
この問題は、Java変数の符号を外すことはできないという事実に関係していると思います。間違いを見つけられますか?それとも、単純なシリアル接続で送信したフレームの50%が破損する可能性はありますか?FRAME_LENGTH_WITHOUT_CRC
21です。
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;
}