Un altro bel problema :), ci ho già perso circa 20 ore e nn mi viene fuori nulla...
In pratica, devo mandare un pacchetto all' encoder che sta su serial2 che viene trascritta in rs485...
il pacchetto deve essere composto cosi: ( tutto in HEX )
01 07 35 52 71 04 CRC
dove 01 e 04 soni i byte di inizio e fine
07 sono il numero byte del pacchetto
35 e l'indirizzo del encoder
52 e 71 sono i comandi
Dopo un bel po ho pensato di fare cosi:
byte mex[8] = {01, 07, byte(EncoderAddr), 52, 71, 04, 0}
mex[8] = Tools::crc(mex); //fa il crc dei primi 7 campi e restituisce il byte
Serial2.println(mex, HEX);
ma restituisce error: call of overloaded 'print(byte [8], int)' is ambiguous ......
In pretica devo convertire gli ACSII 52 e 71 (R e q) in esadecimale e inviarli, poi quando mi risponde devo fare il contrario da Hex a int o char e via dicendo
Io vengo dal Java (faticato) e a dire il vero il c++ proprio nn lo sopporto, va bè è ora di impararlo :).
Arduino non mette molte risorse a disposizione per la conversione, sapere come fare??
Per inviare valori esadecimali devi utilizzare Serial.write e non print altrimenti vengono inviati come carattere cioè hai "4F" e non 0x4F che vuoi. Se il protocollo e il modbus esistono anche alcune librerie gia implementate comunque
Sizeof non è una funizone, ma un operatore. In questo caso non ti calcola la lunghezza dell'array ma la dimensione del puntatore(2 credo)...
Ti si resetta perché il tuo codice causa violazioni di accesso alla memoria(stack smashing).
Per scrivere valori "raw" sulla seriale devi fare Serial.write(valore) dove valore è 1 singolo byte, 1 solo!
Ciao
Con queste funzioni fai un giro di 500km per spostarti di 10 m: se hai in memoria un valore numerico tipo int(2word su arduino):
0000 0000 - 1010 1010 = 17010 = AA16
e devi convertirlo in un tipo byte(1word) devi soltanto fare un cast che ti fa perdere tutta la word di sinistra, così ottieni
1010 1010 = 17010 = AA16
Quindi
int valore_int_da_convertire = 170 /* 0xAA */;
byte valore_da_inviare_sulla_seriale = byte(valore_int_da_convertire);
// oppure alla vecchia maniera:
byte valore_da_inviare_sulla_seriale = (byte)valore_int_da_convertire;
"atoi(char *)" non supporta le stringhe contenenti numeri esadecimali, solo decimali, la tua funzione restituirebbe sempre 0
Con "char* buff;" hai dichiarato solo il puntatore a carattere, non hai allocato la memoria necessaria. Se non lo fai causi stack smashing.
In questo caso non è necessario fare il cast al valore che ritorni. Probabilmente il compilatore salta questa operazione.
printf su Arduino non c'è... forse intendevi "sprintf".
tutta la seconda funzione non ha senso... char è già un valore byte non c'è bisogno di convertirlo.
Conclusione: se "scendi" dal java al C/C++, devi studiare... e pure parecchio. Come manuale ti consiglio il Deitel.
Ciao
Beh per partire bisognerebbe andare con più cautela, ma hai la fortuna di sapere già come si programma... una volta afferrati i concetti fondamentali non ti ferma nessuno XD
Ciao