Lettura valori via rs485 da un BMS

Salve, vorrei leggere i valori e visualizzarli su un LCD da un BMS (Battery Management System) via rs485 con un Mega2560 e una schedina di conversione seriale-rs485 collegata alla seriale n° 3 , ora li leggo con il monitor seriale dell'IDE arduino grazie alle informazioni prese dal forum.
Questo e' il codice

#define LENGHT 13
#define CS_485 44  //pin ablitazione TX e RX della scheda Rs485
byte cmd[LENGHT] = {0xa5, 0x40, 0x90, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d};
unsigned long PREVIOUS = 0;
unsigned long INTERVALL = 2000; //2 sec

void setup() {
  Serial.begin(9600);
  Serial.println("Start!");
  Serial3.begin(9600);
  pinMode(CS_485, OUTPUT);
  digitalWrite(CS_485, HIGH);
}

void loop() {
  if ( (millis() - PREVIOUS) >= INTERVALL ) {
    PREVIOUS = millis();
    txMode();
    for (byte index = 0; index < LENGHT; index++) {
      Serial.print(cmd[index]);
      Serial.print(" ");
      Serial3.write(cmd[index]);
      Serial3.flush();
    }
    Serial.println();
    rxMode();
    while (Serial3.available()) {
      Serial.print(Serial3.read());
      Serial.print(" ");
    }
    Serial.println();
  }
}

void txMode() {
  digitalWrite(CS_485, HIGH);
  delay(1);
}

void rxMode() {
  digitalWrite(CS_485, LOW);
  delay(1);
}

Per quello che ho capito devo leggere la stringa dalla seriale , convertirla da string in char e suddividerla in 13 byte per capire intanto quali valori mi servono, ho letto il codice sulla seriale e alla richiesta del codice inviato il BMS risponde con un codice simile ma con i valori di tensione

Written data (COM9) comando per richiesta lettura tensione corrente
a5 40 90 08 00 00 00 00 00 00 00 00 7d
Read data (COM9) risposta da BMS, 00 84 = tensione, 75 30= corrente, 02 8a= % batteria
a5 01 90 08 00 84 00 84 75 30 02 8a 77

il mio problema ora e' che il display visualizza i 13 byte in decimale tutti tranne quelli che mi servono scrivendo uno zero al posto dal 4° byte al 11° , ho provato a mandare altri comandi per visualizzare altri dati e la risposta e' giusta dal bms , non capisco perche sul monitor seriale sono giusti mentre se li converto solo i valori di tensione e corrente non li visualizza.
questa e' la parte del codice per la lettura

if ( (millis() - PREVIOUS) >= INTERVALL ) {
    PREVIOUS = millis();
    txMode();
    for (byte index = 0; index < LENGHT; index++) {
      Serial3.write(cmd[index]);
      Serial3.flush(); // vuoto la Serial3
    }
    rxMode();
    while (Serial3.available()) {
      myString = Serial3.readString();  
      char Buf[12];  
      myString.toCharArray(Buf, 12);  
      unsigned char posizione1 = Buf[0];
      unsigned char posizione2 = Buf[1];
      unsigned char posizione3 = Buf[2];
      unsigned char posizione4 = Buf[3];
      unsigned char posizione5 = Buf[4];
      unsigned char posizione6 = Buf[5];
      unsigned char posizione7 = Buf[6];
      unsigned char posizione8 = Buf[7];
      unsigned char posizione9 = Buf[8];
      unsigned char posizione10 = Buf[9];
      unsigned char posizione11 = Buf[10];
      unsigned char posizione12 = Buf[11];
      unsigned char posizione13 = Buf[12];

void txMode() {
  digitalWrite(CS_485, HIGH);
  delay(1);
}
void rxMode() {
  digitalWrite(CS_485, LOW);
  delay(1);
}

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.