Serial.writeprint(23**.**545);
usw. wäre sinnvoller.
Gruß Tommy
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.