Ricezione/invio seriale

buonasera a tutti:

ricevo serialmente, da un apparecchio che trasmette in RS232, con questo codice ed un adattatore RS232/TTL

#include <M5Stack.h>


void setup() {

  M5.begin();

  Serial.begin(115200);

  // Serial2.begin(unsigned long baud, uint32_t config, int8_t rxPin, int8_t txPin, bool invert)
  Serial2.begin(9600, SERIAL_8N1, 21, 22);
  pinMode(5, OUTPUT);
  digitalWrite(5, 1);
}

void loop() {

 if(Serial.available()) {
   int ch = Serial.read();
   Serial2.write(ch);
 }

 if(Serial2.available()) {
   int ch = Serial2.read();
   Serial.write(ch);
 }
}

e sul serial monitor ho un output del genere:

  
  |0  60
  |1  92
  |0  70
  |1 209
  |0  50
  |1H0RN
  |0  50
  |1----

a questo punto estrapolo le informazioni che mi interessano e le elaboro... fin qui tutto bene
il problema sussiste quando cerco di ricostruire la stringa per mandarla al TTL/RS232 e quindi al macchinario che si aspetta una stringa come quella che ho ricevuto io...

con i Serial.write ed i valori esadecimali funziona (il macchinario riceve il dato; in questo caso 600 )

void sparaft() { //manda sulle due seriali 6 ft

  Serial.write(124); // |
  Serial.write(48); // 0
  Serial.write(32); // spazio
  Serial.write(32); // spazio
  Serial.write(55); // "7"0 ft
  Serial.write(48); // 7"0" ft
  Serial.write(13); //  CR '\r'
  Serial.write(10); //  LF '\n'

  Serial.write(124); // |
  Serial.write(49); // 1
  Serial.write(48); // 0
  Serial.write(54); // 6
  Serial.write(48); // 0
  Serial.write(48); // 0
  Serial.write(13); //  CR '\r'
  Serial.write(10); //  LF '\n'

  //|0  70
  Serial2.write(124); // |
  Serial2.write(48); // 0
  Serial2.write(32); // spazio
  Serial2.write(32); // spazio
  Serial2.write(55); // "7"0 ft
  Serial2.write(48); // 7"0" ft
  Serial2.write(13); //  CR '\r'
  Serial2.write(10); //  LF '\n'
  
  //|0 600
  Serial2.write(124); // |
  Serial2.write(49); // 1
  Serial2.write(48); // zero o spazio, 48 o 32 ???
  Serial2.write(54); // 6
  Serial2.write(48); // 0
  Serial2.write(48); // 0
  Serial2.write(13); //  CR '\r'
  Serial2.write(10); //  LF '\n'

}

il problema sussiste quando cerco di sostituire al valore esadecimale ,argomento dei serial write, una variabile...

tipo:

byte decineft = 0;
byte unitaft = 6;
byte dodicineinc = 0;
byte unitainc = 0;

  Serial2.write(124); // |
  Serial2.write(48); // 0
  Serial2.write(32); // spazio
  Serial2.write(32); // spazio
  Serial2.write(55); // "7"0 ft
  Serial2.write(48); // 7"0" ft
  Serial2.write(13); //  CR '\r'
  Serial2.write(10); //  LF '\n'
  Serial2.write(124); // |
  Serial2.write(49); // 1
  Serial2.write(decineft); //
  Serial2.write(unitaft); //
  Serial2.write(dodicineinc); //
  Serial2.write(unitainc); //
  Serial2.write(13); //  CR '\r'
  Serial2.write(10); //  LF '\n'

il macchinario non riceve nulla o comunque qualche cosa che non capisce.....

cosa sto sbagliando??

grazie

Se non capisco male, nel primo esempio invii l'ascii del carattere che ti serve.
'0' = 48
'7' = 55
'\r' = 13
e così via.
Prova ad aggiungere 48 alle tue variabili

Serial2.write(decineft + 48);

por qué no lo haces: Perché non lo fai:

void sparaft() {
  Serial.println("|0  70");
  Serial.println("|10600");
  Serial.println("|0  70");
  Serial.println("|0 600");
}

... sei nella sezione Italiana del forum ... cortesemente usa l'Italiano. Grazie.

Guglielmo

ooops ho corretto

La stessa identica cosa della discussione di un anno fa (https://forum.arduino.cc/t/serial-read-per-pivelli/639659): confondi valori trasmessi come stringhe di caratteri con valori rappresentati direttamente da byte binari. In quella discussione riguardava la ricezione, qui esattamente l'opposto.

Prova questo

  byte decineft = 0;
  byte unitaft = 6;
  byte dodicineinc = 0;
  byte unitainc = 0;

  Serial2.write(124); // |
  Serial2.write(48); // 0
  Serial2.write(32); // spazio
  Serial2.write(32); // spazio
  Serial2.write(55); // "7"0 ft
  Serial2.write(48); // 7"0" ft
  Serial2.write(13); //  CR '\r'
  Serial2.write(10); //  LF '\n'
  Serial2.write(124); // |
  Serial2.write(49); // 1
  Serial2.write('0' + decineft); //
  Serial2.write('0' +  unitaft); //
  Serial2.write('0' +  dodicineinc); //
  Serial2.write('0' +  unitainc); //
  Serial2.write(13); //  CR '\r'
  Serial2.write(10); //  LF '\n'

o prova quello

  byte decineft = 0;
  byte unitaft = 6;
  byte dodicineinc = 0;
  byte unitainc = 0;

  Serial2.println("|0  70");
  Serial.print("|1");
  Serial.print(decineft); //
  Serial.print(unitaft); //
  Serial.print(dodicineinc); //
  Serial.println(unitainc); //

azz, allora pensavo anche di aver capito !!! (gia un anno!!! ... anche questi miei tempi biblici generano ulteriore confusione)

come ho un po di tempo mi ci rimetto....

grazie a tutti non vedo l'ora di riprovarci...

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