Serielle Datenvberbindung

Serial.writeprint(23**.**545);

usw. wäre sinnvoller.

Gruß Tommy

Man muß das Rad nicht ein zweites Mal erfinden: RS485 communications, dort besonders die Non-blocking version.

müssen tut man nicht, aber wenn man es selber macht lernt man ja einiges.
Ich hab einfach mal wie vorgeschlagen mit den Serial Basics Beispiel 3 angefangen ein paar Befehle umgesetzt.

// Slave
// decode Serial Telegramm
// https://forum.arduino.cc/index.php?topic=730290.0

/*
  FF 01 77 00 00 00 00 00 EE
  FF                            Startbyte
   01                         Addresse 01-FF ( Abzüglich FF,EE,DD
                              G / T / S / D / Z  G/T/S bedeutet immer das eine Naricht von Master für Slave kommt
      47                      G = Give Slave weis er muss was ausführen;
      54                      T = take Slave Weiß er muss was Senden
      53                      S-Setting Slave geht in einen Einsetllungsmodus
                              D und Z bedeutet das eine NAricht vom Slave zum Master geht
      44                      D = Data Kündigt dem Master an das gleich daten kommen
      5A                      Z = Dient einfach nur als Rückmeldung famit der Master weiß das der Slave alles Richtig gemacht hat

           00 00 00 00 00      Beim Protokoll sollen immer 5 Bytes mitgeschickt werden welche Simple Zustände Übertragen
                              EE   das Endbyte

                              Falls nun aber auch Werte wie Floats gesendet werden müssen ( Im falle eines Slave Sensors zbs)
                              Wird anstelle des Endytes ein DD Byte gesendet welches Die String abfragen einschaltet.
*/

// based on https://forum.arduino.cc/index.php?topic=396450.0
// Example 3 - Receive with start- and end-markers

const char slaveAddress = 0xA0;

const byte numChars = 32;
char receivedChars[numChars];
boolean newData = false;


void setup() {
  Serial.begin(9600);
  Serial.println("<Arduino is ready>");
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
}

void loop() {
  recvWithStartEndMarkers();
  //showNewData();
  if (newData == true) decodeData();
}

void recvWithStartEndMarkers() {
  static boolean recvInProgress = false;
  static byte ndx = 0;
  char startMarker = 0xFF;
  char endMarker = 0xEE;
  char rc;

  while (Serial.available() > 0 && newData == false) {
    rc = Serial.read();

    if (recvInProgress == true) {
      if (rc != endMarker) {
        receivedChars[ndx] = rc;
        ndx++;
        if (ndx >= numChars) {
          ndx = numChars - 1;
        }
      }
      else {
        receivedChars[ndx] = '\0'; // terminate the string
        recvInProgress = false;
        ndx = 0;
        newData = true;
      }
    }

    else if (rc == startMarker) {
      recvInProgress = true;
    }
  }
}

int decodeData()  // decode data  - returns 0 on success
{
  if (receivedChars[0] != slaveAddress)
  {
    Serial.println(F("not for this slave"));
    newData = false;
    return -1;
  }
  else
  {
    switch (receivedChars[1])
    {
      case 'G':
        Serial.println(F("G = Give Slave weis er muss was ausführen;"));
        digitalWrite(9, receivedChars[2]);  // Übernahme der Payload und was ausführen
        digitalWrite(10, receivedChars[3]);
        digitalWrite(11, receivedChars[4]);
        digitalWrite(12, receivedChars[5]);
        digitalWrite(13, receivedChars[6]);
        commandZ();
        break;
      case 'T':
        Serial.println(F("T = take Slave Weiß er muss was Senden"));
        commandD();
        break;
      case 'S':
        Serial.println(F("S-Setting Slave geht in einen Einsetllungsmodus"));
        break;
      case 'D':
        Serial.println(F("D = Data Kündigt dem Master an das gleich daten kommen")); // braucht der Slave eigentlich nicht, im Empfangsteil
        break;
      case 'Z':
        Serial.println(F("Z = Dient einfach nur als Rückmeldung famit der Master weiß das der Slave alles Richtig gemacht hat")); // braucht der Slave eigentlich nicht, im Empfangsteil
        break;
      default:
        Serial.println(F("unknown command"));
        newData = false;
        return -2;
        break;
    }
  }
  newData = false;
  return 0;
}

void commandD()
{
  char payload[5];
  uint16_t analogValue = analogRead(A0);  // irgend ein 2 byte Wert als Demo
  payload[0] = analogValue & 0xFF;
  payload[1] = analogValue >> 8;
  payload[2] = digitalRead(A1);
  payload[3] = digitalRead(A2);
  payload[4] = digitalRead(A3);
  sendTelegram('D', payload);
}

void commandZ()
{
  char payload[5];
  payload[0] = 'o';
  payload[1] = 'k';
  payload[2] = ' ';
  payload[3] = 'o';
  payload[4] = 'k';
  sendTelegram('Z', payload);
}

void sendTelegram(const char mode, const char payload[5])
{
  Serial.write(0xFF);           // Startbyte
  Serial.write(slaveAddress);   // Empfänger= Master (?)
  Serial.write(mode);
  for (byte i = 0; i < 5; i++)
  {
    Serial.write(payload[i]);
  }
  Serial.write(0xEE);           // Endbyte
}


void showNewData() {            // originale Funktion aus Serial Basic nur als Demo
  if (newData == true) {
    Serial.print("This just in ... ");
    Serial.println(receivedChars);
    newData = false;
  }
}

FF A0 47 01 01 01 01 01 EE

schaltet ein paar Ausgänge ein, und schickt das definierte Bestätigsungstelegramm retour

FF A0 47 00 00 00 00 00 EE

schaltet ein paar Ausgänge aus, und schickt das definierte Bestätigsungstelegramm retour

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