
Zitat von
Defiant
Das mit dem "darf" war jetzt nicht so wörtlich gemeint. Ich habe nur das Gefühl ich gehe euch ein wenig damit auf die Nerven.
Eigentlich nicht. Solange wir hier ROS als eine Alternative aus mehreren Möglichkeiten behandeln können, kann ich vergleichen und Dir Löcher in den Bauch fragen.
Apropos Löcher:
Im Nachbarthread hattest Du beschrieben, dass auch Du Spannung und Strom vom Akku misst. Magst Du vielleicht einmal beschreiben, wie bei Dir in ROS der Weg dieser Werte bis in die Oberfläche aussieht (Messaufbau brauchste nicht zu beschreiben, aber so ab dem Teil, ab dem die Werte an irgendeinem AD-Wandlerpin landen)?

Zitat von
Moppi
...
Naja, so richtig auf der Suche bin ich nicht. Ich dachte nur, es kommen schon praktische Implementierungen von Euch, bevor ich die von mir angewendete Lösung vorstelle.
Wenn ich Nachrichten übertragen oder lesen will, möchte ich dies möglichst benutzerfreundlich in meinem Code gestalten.
Anwendungsspezifisch schreibe ich z.B. eine Struktur von Typ DUMMY auf die UART:
Code:
//Anywhere from header
#define MagicID_DummyTelegram 0x42
typedef struct
{
uint8_t CmdID; //0
uint8_t Mode; //1
uint16_t Val; //2
}__attribute__ ((packed)) Dummy_t; //Length 4 Byte
//Anywhere in declaration
Dummy_t dummy;
//Anywhere in code
dummy.CmdID = MagicID_DummyTelegram;
dummy.Mode = 0x80;
Dummy.Val = 0xEEFF;
SendTelegram((uint8_t*) &dummy, sizeof(dummy));
Auf dem Empfängercontroller könnte die Empfangsroutine so aussehen
Code:
//Anywhere from header
#define MagicID_DummyTelegram 0x42
typedef struct
{
uint8_t CmdID; //0
uint8_t Mode; //1
uint16_t Val; //2
}__attribute__ ((packed)) Dummy_t; //Length 4 Byte
//Anywhere in code
void TelegramReceived(uint8_t *data, uint8_t len)
{
switch (data[0]) // get CmdID
{
case MagicID_DummyTelegram:
{
Dummy_t* dummy = (Dummy_t*) &data[0]; //Cast
if (dummy->Mode == 0x80) //and do something
SetLEDBrightness(dummy->Val);
}
break;
case AnotherMagicID:
.
.
.
}
}
Ein mögliches Protokoll dazu:
- Ein Telegramm beginnt mit einem Startbyte (0xFF)
- Ist ein Byte in den Telegrammdaten gleich dem Startbyte, wird es doppelt gesendet
- Ohne Kenntnis über Länge und Bedeutung des Telegrammes benötigt die Empfangsroutine eine Längenangabe.
Über den Draht gehen aus dem obigen Beispiel also:
0xFF (Startbyte)
0x04 (Strukturlänge)
0x42, 0x80, 0xEE, 0xFF, 0xFF (Strukturinhalt, Beachte: 1. Element ist die CmdID, 0xFF in den Strukturwerten wird doppelt gesendet)
Genauere Implementierungsdetails (was bei mir bezüglich FIFO und Parsen zwischen den Endpunkten SendTelegram und TelegramReceived liegt) findet Ihr z.B. im VL53L1X-Thread...

Zitat von
Holomino
...wobei mich aus meiner beschränkten Sicht heraus z.B. der Vergleich und die Kompatibilität zu ROS, Arduinoprogrammierung oder Bascom interessieren würde.
Lesezeichen