Serielles Einlesen auf bestimmtes Format prüfen

Hallo,

ich habe nun meine Led Leiste komplett auf APA102C umgerüstet. Habe somit nun endlich die Möglichkeit, das Teil im Hintergrund über Interrupt mit Daten über die UART Schnittstelle zu befeuern. Bei den WS2812b war das ohne Abstriche einfach nicht möglich. Die APA102C betreibe ich mit SPI 4MHz, mehr geht nicht, da ich lediglich einen Attiny841 mit 8MHz int. Clock nutze.

	// Anzahl erwarteter Felder
	const byte SIZE_STR = 11; // "00:00:00:00" (das '\n' wird beim Einlesen bereits als Daten vollständig genutzt und wird nicht weiter gebraucht, deshalb auch abgeschnitten)
	const byte SIZE_DATA = 4;
	byte data[4];

	byte cmd = cmd_evalData(str, SIZE_STR, data, SIZE_DATA);

//...

byte cmd_evalData(char* str, const byte sizeStr, byte *data, const byte sizeData)
{
	const char delimiter[] = ",;:|";      // Trennzeichen
	byte ct = 0;

	if(strlen(str) != sizeStr) return ERR;
	char* ptr = (char*)strtok(str, delimiter);
	while(ptr != NULL)
	{
		if(ct == sizeData) return ERR;
		data[ct++] = strtol(ptr, NULL, 16);
		ptr = strtok(NULL, delimiter);
	}
	if(ct != sizeData) return ERR;

	return data[0];
}

Gibt es hier noch irgendetwas, was man optimieren kann? Ich nutze die UART Schnittstelle mit 8 DataBits, 1 StopBit (ggf. umstieg auf 2) und ohne Paritybit. Die Übertragunsrate beträgt derzeit 38400. Würde umsteigen, sobald meine BT-Module 250k können.

Edit:
Es soll immer das Format "0f:0f:0f:0f" emfpangen werden. 0f ist eine Zahl im Hex-Format von 00 bis ff. Wobei diese immer 2 Zeichen breit ist.

Du könntest auf strtol() verzichten und die Hex-Wandlung per Hand machen. Bei nur zwei Ziffern ist das kein Problem. Aber keine Ahnung ob sich das lohnt.

Auf die String/Stdlib Funktionen habe ich zwischenzeitlich komplett verzichtet, genauso wie auf die Umleitung auf printf. Mir wurde mit den WS2812B (72 Leds) der Speicher einfach zu knapp. Bin dann auf den Mega328P umgestiegen und habe mir auch die Komfortroutinen wieder reingeholt.

Inzwischen sind meine PCBs aus China angekommen und ich habe über Tag alle APA102C darauf verlötet und nun in Betrieb genommen. Der Speicher ist hier nun deutlich geschrumpft, da ich nicht mehr unnötig zwischenspeichern muss (9 APA / WS2812B werden als 1 Led angesprochen). Somit bin ich auch wieder auf meinen Attiny841 zurückgegangen, der für mein Projekt eigentlich auch gedacht war. Siehe da, der Programmspeicher ist von knapp 80% auf 55% runtergegangen, obwohl ich die Stringfunktionen drin habe. Das Teil ist bereits fast fertig und mit diversen Funktionen gefüttert, welche ich über eien C# Gui komplett steuern kann. Bin damit aber auch schon bei ~2500 - 3000 eigenen Code-Zeilen angekommen.