conversione da java ad Arduino

Buonasera a tutti, avrei necessità di connettermi con Arduino ad una linea seriale rs232(regolatore di carica pannello fotovoltaico) per la quale il costruttore mi ha inviato protocollo di comunicazione, il problema è che per il calcolo della checksum viene riportato un esempio scritto in Java.
Qualcuno può aiutarmi a "tradurlo" per Arduino?
Grazie!

//questo è il codice java di esempio

public static String getCheckSum (String.s){
String result = "";
int sum = 0;
for (int i = 0, i < s.length() - 1, i = i+2) {
String temp = s.substring (i, i + 2);
int x = Integer.parseInt (temp, 16);
sum += x;
}
result = Integer.toHexString (sum);
while (result.length() < 4) {
result = "0" + result;
}
return result.toUpperCase();
}

Fai riferimento all'oggetto String di Arduino --> String() - Arduino Reference

curiosità: la stringa "S" che viene passata alla funzione "getCheckSum" ha una lunghezza costante o variabile?

premesso che non conosco java, mi sembra che la funzione si limiti a prendere 2 caratteri per volta, a convertirli in numero esadecimale e sommarli.

se "S" ha lunghezza fissa te la cavi con un array di char. se ha lunghezza variabile... devi lavorarci un po' di più.

void setup() {
  Serial.begin(9600);
  Serial.println(F("CheckSum Test"));
  String test = "19847561948376";
  Serial.print(F("String:")); Serial.println(test);
  String chksum = getCheckSum(test);
  Serial.println(F("ChkSum:")); Serial.println(chksum);
}

void loop() {

}

String getCheckSum (String s) {
  String result = "";
  int sum = 0;
  for (int i = 0; i < (s.length() - 1); i += 2) {
    String temp = s.substring(i, i + 2);
    int x = temp.toInt();
    sum += x;
  }
  // result = Integer.toHexString (sum);
  while (result.length() < 4) {
    result = "0" + result;
  }
  result.toUpperCase();
  return result;
}

Manca la conversione da numero a esadecimale. Non ho idea se funzioni e del risultato. Però compila correttamente. :slight_smile:

Grazie Paolo per la tua risposta, intanto sul tuo codice mio figlio sta studiando..... è una cosa che facciamo insieme, io ho solo vecchie esperienze in assembler z80 lui invece fa il Liceo e sta muovendo i primi passi nel c++ con arduino.
Anche per rispondere a Fratt, si in effetti avrei dovuto mostrare subito il protocollo, comunque eccolo!

Query Command:

Start code_ address_ control_ function_ Data lenght_ Checksum
0x550xAA 0x01 0x00 0x00 0x000x00 2 byte

Return:

Start code_ address_ control_ function_ Data lenght_ Value_ Checksum
0x550xAA 0x01 1Byte 1byte 2Byte ...... 2Byte

anemos59:
Query Command:

Start code_ address_ control_ function_ Data lenght_ Checksum
0x55 0xAA 0x01 0x00 0x00 0x00 0x00 2 byte

Return:

Start code_ address_ control_ function_ Data lenght_ Value_ Checksum
0x55 0xAA 0x01 1Byte 1byte 2Byte ...... 2Byte

Ma ti appare come: 55AA01000000.... ?

mi sembra che prima la stringa sia chiamata "test" mentre nella funzione è chiamata "s".
mi sto sbagliando?

PaoloP:

void setup() {

Serial.begin(9600);
 Serial.println(F("CheckSum Test"));
 String test = "19847561948376";
 Serial.print(F("String:")); Serial.println(test);
 String chksum = getCheckSum(test);
 Serial.println(F("ChkSum:")); Serial.println(chksum);
}

void loop() {

}

String getCheckSum (String s) {
 String result = "";
 int sum = 0;
 for (int i = 0; i < (s.length() - 1); i += 2) {
   String temp = s.substring(i, i + 2);
   int x = temp.toInt();
   sum += x;
 }
 // result = Integer.toHexString (sum);
 while (result.length() < 4) {
   result = "0" + result;
 }
 result.toUpperCase();
 return result;
}




Manca la conversione da numero a esadecimale. Non ho idea se funzioni e del risultato. Però compila correttamente. :)

PaoloP:
Ma ti appare come: 55AA01000000.... ?

ancora non sono in grado di comunicare con il device ma ritengo che debba apparire come: 55AA010000 non so se in coda ci vanno anche i due Byte relativi alla lunghezza......

Comunque provato il codice, credo ci sia un errore nella riga int x = temp.toInt(); dove in x mettiamo la conversione in decimale della substringa esadecimale, praticamente tratta i i due digit AA come 0.

E' il device che manda la query o sei tu che la devi spedire?
Se è il device, pubblica qualche query inviata.

sono io che devo mandare la query al device, quindi mi serve la checksum.

Questo è molto più semplice: converte gli HEX in INT, li somma e riconverte la somma in HEX.

void setup() {
  Serial.begin(9600);
  Serial.println(F("CheckSum Test"));
  String test = "55AA010000000004";
  Serial.print(F("String: ")); Serial.println(test);
  String chksum = checkSum(test);
  Serial.print(F("ChkSum: ")); Serial.println(chksum);
}

void loop() {

}

String toString(int data) {
  String ts;
  ts += char((data / 4096) + 48); data %= 4096;
  ts += char((data / 256) + 48); data %= 256;
  ts += char((data / 16) + 48); data %= 16;
  ts += char((data / 1) + 48);
  return ts;
}

String checkSum(String data) {
  int count = 0;
  for (int x = 0; x < data.length(); x += 4) {
    count += (byte(data.charAt(x + 0) - 48)) * 4096;
    count += (byte(data.charAt(x + 1) - 48)) * 256;
    count += (byte(data.charAt(x + 2) - 48)) * 16;
    count += (byte(data.charAt(x + 3) - 48)) * 1;
  }
  return toString(count);
}

La stringa deve avere una lunghezza multipla di 4.

Grazie Paolo, a questo punto occorre andare sul pratico e provare ad inviare una query con il checksum che risulta dal codice e vediamo se risponde. mi devo procurare un convertitore usb-rs232 e poi attaccarmi al device con hiperterminal.

Allora sono riuscito a fare un data logger della seriale questa è la stringa relativa alla query:

Start code_ address_ control_ function_ Data lenght_ Checksum
0x55 0xAA 0x01 0x00 0x00 0x00 0x00 0x01 0x00

il Data lenght nella query è sempre 0x00 0x00 mentre nella messaggio di ritorno dove ci sono i valori dei vari parametri allora la lunghezza viene calcolata partendo da 0x55 ovvero dalla posizione 0.

Adesso come passo successivo dovrò mettere a punto uno sketch in grado di generare le query e leggere salvando le stringhe di risposta in un buffer, inoltre dovrò realizzare un interfaccia rs232 - ttl