Während meiner Ausbildung habe ich gerne DDR-Bücher gelesen, die eine Einführung enthielten, warum dieses Buch für den Sozialismus der DDR von Nutzen sei. In Erinnerung daran möchte ich das auch mal auf dieses Thema bezogen tun.
Da die NRF24 des Themenstellers wohl wieder aus dem Keller hervorgeholt werden, ich aber keine NRF24 habe, versuche ich die Situation mit der Beschränkung auf wenige Bytes (NRF24 maximal 32) mittels ESP-NOW nachzustellen. Ob es sich um ein sinnvolles Unterfangen handelt, weiß man erst, wenn man ESP-NOW auf NRF24 umgestellt bekommen hat.
Der Aufbau entspricht #25 und #26, nur die Software von ESP-NOW-Sender und -Empfänger ändert sich.
Übertragene Zeichen:
BRZ:15,015;BRF:Paul Mustermann;BRS:4;AR1:0;RZ1:0,000;F1:Friedhelm Busch;AR2:0;RZ2:0,000;F2:Max Jägermeister;AR3:0;RZ3:0,000;F3:Paul Mustermann;AR4:0;RZ4:0,000;F4:Thorsten Hesse;
Grundsätzlich könnte man Teilzeichenketten von Semikolon zu Semikolon bilden und diese übertragen. Da es aber durchaus sinnvoll erscheint, die Zeichenkette vor dem Doppelpunkt in ein Byte zu komprimieren, und dieses Thema ja das Wort "Struktur" enthält, wandle ich im ESP-NOW-Sender eine Teilzeichenkette in eine Struktur aus einem Byte und einer Zeichenkette um. Die Struktur wird zum ESP-NOW-Empfänger übertragen und dort interpretiert. RZ1 (=0x21) wird auf dem Display angezeigt.
Zur Veranschaulichung zeigt der serielle Monitor viele Informationen an.
ESP-NOW-Sender:
#include <esp_now.h>
#include <WiFi.h>
/* verwendet wird Hardware Serial2
ESP32 UART2 RX = GPIO16
ESP32 UART2 TX = GPIO17
*/
// REPLACE WITH YOUR ESP RECEIVER'S MAC ADDRESS
uint8_t broadcastAddress1[] = {0x8C, 0xAA, 0xB5, 0x8C, 0x1C, 0x20};
//uint8_t broadcastAddress2[] = {0xFF, , , , , };
//uint8_t broadcastAddress3[] = {0xFF, , , , , };
// Variablen für die zu versendenen Daten
const byte MAXZEICHEN = 26;
const byte SPUREN = 4;
bool ausgabe = false; // Wartet auf Vollständigkeit
struct renn_struct {
uint8_t bed; // Bedeutung des nachfolgenden Textes
char txt[MAXZEICHEN]; // Text
} myData;
void readSerial() {
char readChar; // Einzelnes Zeichen
static byte pos = 0; // Position im Array
static char buf[MAXZEICHEN] = {0}; // Zwischenspeicher
while (Serial2.available() > 0) {
readChar = Serial2.read(); // Einlesen
//Serial.print(readChar);
if (readChar == ';') { // Feldende
//Serial.println();
teileBuf(buf); // Übergeben zum teilen
pos = 0; // Position im Array rücksetzen
} else {
if (!isControl(readChar)) { // Zeichen ist kein Steuierzeichen
buf[pos] = readChar; // Dann aufnehmen
if (pos < MAXZEICHEN - 1) pos++; // neue Position setzen (geändert 18.4.21)
buf[pos] = '\0'; // CharArray abschliessen
}
}
}
}
void teileBuf(char *buf) { // Teilt den Puffer
Serial.print("buf: "); Serial.println(buf);
char *c; // Zeiger innerhalb des Puffers
c = strtok(buf, ":"); // Übernehme bis Trennzeichen 1
myData.bed = 0;
if (!strncmp(c, "BRZ", 3)) { // Feldname
myData.bed = 0x10; // BRZ
strncpy(myData.txt, strtok(NULL, ":"), MAXZEICHEN);
}
else if (!strncmp(c, "BRF", 3)) { // Feldname
myData.bed = 0x20; // BRF
strncpy(myData.txt, strtok(NULL, ":"), MAXZEICHEN);
}
else if (!strncmp(c, "BRS", 3)) { // Feldname
myData.bed = 0x30; // BRS
strncpy(myData.txt, strtok(NULL, ":"), MAXZEICHEN);
}
else if (!strncmp(c, "AR", 2)) { // Feldname
myData.bed = 0x10 + (c[2] - '0'); // ARn
strncpy(myData.txt, strtok(NULL, ":"), MAXZEICHEN);
}
else if (!strncmp(c, "RZ", 2)) {
myData.bed = 0x20 + (c[2] - '0'); // RZn
strncpy(myData.txt, strtok(NULL, ":"), MAXZEICHEN);
}
else if (!strncmp(c, "F", 1)) {
myData.bed = 0x30 + (c[1] - '0'); // Fn
strncpy(myData.txt, strtok(NULL, ":"), MAXZEICHEN);
}
serMon(c);
senden();
memset(buf, 0, MAXZEICHEN);
}
void serMon(char * c) {
Serial.print(" c: "); Serial.println(c);
Serial.print("myData.bed: 0x"); Serial.println(myData.bed, HEX);
Serial.print("myData.txt: "); Serial.println(myData.txt);
}
void senden() {
esp_err_t result = esp_now_send(0, (uint8_t *) &myData, sizeof(renn_struct));
Serial.println(result == ESP_OK ? "Sent with success" : "Error sending the data");
}
// callback when data is sent
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
char macStr[18];
Serial.print("Packet to: ");
// Copies the sender mac address to a string
snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
Serial.print(macStr);
Serial.print(" send status:\t");
Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}
void setup() {
Serial.begin(115200);
Serial2.begin(9600); // zum Empfang der Daten; UNO anstelle PC
delay(1000);
Serial.println("Start ESP-NOW sender");
WiFi.mode(WIFI_STA);
if (esp_now_init() != ESP_OK) {
Serial.println("Error initializing ESP-NOW");
return;
}
esp_now_register_send_cb(OnDataSent);
// register peer
esp_now_peer_info_t peerInfo;
peerInfo.channel = 0;
peerInfo.encrypt = false;
// register first peer
memcpy(peerInfo.peer_addr, broadcastAddress1, 6);
if (esp_now_add_peer(&peerInfo) != ESP_OK) {
Serial.println("Failed to add peer");
return;
}
/*
// register second peer
memcpy(peerInfo.peer_addr, broadcastAddress2, 6);
if (esp_now_add_peer(&peerInfo) != ESP_OK){
Serial.println("Failed to add peer");
return;
}
/// register third peer
memcpy(peerInfo.peer_addr, broadcastAddress3, 6);
if (esp_now_add_peer(&peerInfo) != ESP_OK){
Serial.println("Failed to add peer");
return;
}
*/
}
void loop() {
readSerial();
}
EDIT Zeile 40: MAXZEICHEN - 1