Hallo
Ja, stimmt! Ist eigentlich alles 0 und 1, aber allein wegen der Lesbarkeit des Sketchs wäre es von Vorteil. Aber das ist ja auch egal, am Ende muss er ja was senden und das selbe wieder Empfangen.
Ich habe heute mal den Sketch von mir statt mit strtok, mit strtok_r abgeändert. Nun empfange ich gar nichts mehr. Ich sehe momentan grad nicht was fehlt. Könnte da mal jemand einen Blick drüber werfen? Ich schau mir das ganze morgen nochmals an, hab für heute genug :neutral_face:
Sender:
int wert = 1023;
int wert2 = 825;
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.print(0x7E);
Serial.print(' ');
Serial.print(0x89);
Serial.print(' ');
Serial.print(0x00);
Serial.print(' ');
Serial.print(0x01);
Serial.print(' ');
Serial.print("A");
Serial.print(',');
Serial.print(wert);
Serial.print(' ');
Serial.print("B");
Serial.print(',');
Serial.println(wert2);
Serial.flush();
}
Ich habe überall Serial.print drin gelassen. Habe mal gelesen, dass Serial.print in Serial.write umgewandelt wird? Spielt aber nicht so eine Rolle, oder? Ist ja doof im Sendeteil Für HEX write zu nehmen und für die Zeichen dann wieder print...
Empfänger:
const int SERIAL_BUFFER_SIZE = 20; //Speicher für 20 gesendete Werte
char serialBuffer[SERIAL_BUFFER_SIZE]; //Array serialBuffer
int startDelimeter;
int lengthByte;
int apiIdentifier;
int apiFrameId;
int A;
int B;
void setup()
{
Serial.begin(9600);
}
void loop()
{
if (readSerial())
{
parseSerial();
Serial.print("serialBuffer = ");
Serial.println(serialBuffer);
Serial.print("startDelimeter = ");
Serial.println(startDelimeter);
Serial.print("lengthByte = ");
Serial.println(lengthByte);
Serial.print("apiIdentifier = ");
Serial.println(apiIdentifier);
Serial.print("apiFrameId = ");
Serial.println(apiFrameId);
Serial.print("A = ");
Serial.println(A);
Serial.print("B = ");
Serial.println(B);
}
}
bool readSerial()
{
static byte index;
while (Serial.available())
{
char c = Serial.read();
if (c >= 0 && index < SERIAL_BUFFER_SIZE - 1)
{
serialBuffer[index++] = c; //Array serialBuffer [index +1] gleich gelesene Daten c
}
else if (c == '\n') //wenn c gleich "Ende der Daten" erkannt...
{
serialBuffer[0] = '\0'; //Array auf null zurücksetzen
index = 0;
return true; //Daten wurden gelesen
}
}
return false; //Daten wurden noch nicht gelesen
}
void parseSerial()
{
char* ptr, * p, * savePtr, * saveP;
char first;
char def;
int wert;
ptr = strtok_r(serialBuffer, ' ', &savePtr); //separiert gelesenen String serialBuffer bis zum Leerschlag und speichert es in ptr und savePtr
while(ptr != NULL){
if (strchr(ptr,',')){ //wenn in ptr ein , drin ist, dann...
p = strtok_r(ptr,',',&saveP); //separiert String ptr beim , und speichert es in p und saveP
if (p != NULL){
def = p[0]; //erster Teil Bezeichnung
}
p = strtok_r(NULL, ',', &saveP); //separiert nächsten Abschnitt im String p bis zum , und speichert es in p und saveP
if (p != NULL){
wert = atoi(p); //konvertiert zweiten Teil des separierten Strings p zu int
}
}
else { //wenn kein , vorhanden
first = ptr; //speichert separierten String ptr in first (HEX Werte)
}
switch (first, def){
case 0x7E: startDelimeter = first;
break;
case 0x89: lengthByte = first;
break;
case 0x00: apiIdentifier = first;
break;
case 0x01: apiFrameId = first;
break;
case 'A': A = wert;
break;
case 'B': B = wert;
break;
}
ptr = strtok_r(NULL, ' ', &savePtr); //separiert nächsten Abschnitt im String ptr bis zum Leerzeichen
}
}
Grüsse
Stef