Zur Kommunikation von PC oder RasPi per WLAN oder Kabel mit meinen Platine/n.
Primäres Merkmal: Die Telegramme können unterschiedliche Länge haben.
Sekundär: Die Übertragung über interruptbasierte UART+FIFO geht störungsfrei, mittlerweil mit nem bescheidenen Sende-/Empfangspuffer von 32 Bytes; waren mal 128 Bytes.
Kurz der Aufbau und ein paar Codeschnippsel als Skizze:
Definition der einzelnen Telegramme, Beispiel:
Code:
#define KOMMANDO_DATS 'd' // (aktuelle) Daten der Motoren
#define KOMMANDO_DATS_LEN 1 // Kommandolänge
#define KOMMANDO_MOSTL 'M' // Fahrbefehl Motoren Mnikkk. Mot1 = re
#define KOMMANDO_MOSTL_LEN 6 // n = {1, 4, 5}, Motor 1re, 4li, 5beide
// i = { r, l } Drehrichtung
// kkk Stellwert für MotorPWM
Empfang initialisieren:
Code:
zeiger = 0;
telegrammlaenge = 0;
Empfang eines Telegramms abwarten:
Code:
if ( ! ukbhit0 () )
continue;
...
zeichen_aus_fifo = ugetchar0();
... und nun die Auswertung:
Code:
if (zeiger == telegrammlaenge)
{
zeiger = 0;
telegrammlaenge = 0;
/* Die Funktionen koennen nun gemuetlich das
Telegramm auswerten. */
...
// - - - - - - - - - - - - - - - - - - - -
// Wurde "KOMMANDO_DATS" = "D" erkannt ? DatenAusgabe
if (mein_rx_buff [0] == KOMMANDO_DATS) // Tastatur-Eingabe "D"
{ //
dat_aus (); // Motordaten ausgeben
} // Ende if (mein_rx_buff [0] == KOMMANDO_DATS)
// - - - - - - - - - - - - - - - - - - - -
// KOMMANDO_MOSTL MOtoren STeLlen : Mnikkk, Motor n = {1, 4, 5} 1, 4, beide
// i { +, 0, p, t, x } Drehrichtung 0/+ => math. pos, - => math. neg
// p = aus, x = Schnellstop/Brems
// kkk Stellwert für MotorPWM und Rampentimer
if (mein_rx_buff [0] == KOMMANDO_MOSTL)
{ // Motor 1=re/12 oder 4=li/34 oder 5=beide ?
do_MOSTL2 (mein_rx_buff); // Motoren stellen/ansteuern r1n
} // Ende if (mein_rx_buff [0] == KOMMANDO_MOSTL)
...
Das macht die Testerei wegen der einfachen Kommunikation PC<=>Platine wirklich leicht.
Noch etwas Gutes ist dabei: Ich kann natürlich dem UART-Puffer ein I²C-Telegramm "unterschieben" - sprich: eine Funktion ist testbar per PC-basierter Kommunikation, sie läuft im praktischen (z.B. autonomen) Betrieb genau gleich über I²C-Telegramm ab.
Dank an Sterntaler für Hilfen, Diskussionen, Korrekturen, Zusprachen.
Lesezeichen