Serielle Eingabe

Hallo,

möchte mir ein kleines Interface für den PC sowie für das Smartphone entwickeln. Der Arduino wird über den HC-05 angesteuert.
Ich möchte nicht ständig alle Daten zum Arduino schicken, habe mich somit für eine einfache Kodierung basierend auf Hexzahlen entschieden.

Jeder Regler schickt nun seinen Wert (0-255) an den Arduino wie folgt. 0x(ID(0-F)(Wert(0-FF).
Für einen Wert von 127 für den ersten Regler würde das wie folgt dann im Arduino gehandhabt:
0x07F
Für einen Wert von 255 für den zweiten Regler würde das wie folgt aussehen:
0x1FF
....

Habe nun das Problem, dass die Eingabe über Putty nicht der entsprechenden Auswertung entspricht.

1025
Befehl: 0x401
var:    1

1205
Befehl: 0x00C
hue:    12

1205
Befehl: 0x4B5
var:    181

1205
Befehl: 0x4B5
var:    181
#include <FastLED.h>
#include <stdio.h>
#include <avr/pgmspace.h>

#define NUM_LEDS 36
#define RGB_ORDER GRB
#define DATA_PIN 6
CRGB leds[NUM_LEDS];

static FILE uartout = { 0 };

int uart_putchar(char, FILE);
void setupLeds(void);
void rainbow(int, int, int, bool, int);

int main(void) {
	init();
	setupLeds();
	/* Serielle Verbindung ueber Bluetooth */
	Serial.begin(115200);
	fdev_setup_stream(&uartout, uart_putchar, NULL, _FDEV_SETUP_WRITE);
	stdout = &uartout;

	int hue, saturation, brightness, speed, pairOfLeds;
	int var4, var5, var6, var7, var8, var9, varA, varB, varC, varD, varE, varF;

	hue = 0;
	saturation = 255;
	brightness = 85;
	speed = 5;
	pairOfLeds = 4;

	while (1) {
		if (Serial.available() > 0) {
			int num = Serial.parseInt();
			if (num > 0)  {
				if (num >= 0x000 && num <= 0x0FF) { // 0 - 255
					hue = num;
					printf_P(PSTR("Befehl:\t0x%03X\nhue:\t%i\n\n"), num, hue);
				}
				else if (num >= 0x100 && num <= 0x1FF) { // 256 - 511
					saturation = num - 0x100;
					printf_P(PSTR("Befehl:\t0x%03X\nsaturation:\t%i\n\n"), num, saturation);
				}
				else if (num >= 0x200 && num <= 0x2FF) { // 512 - 767
					brightness = num - 0x200;
					printf_P(PSTR("Befehl:\t0x%03X\nbrightness:\t%i\n\n"), num, brightness);
				}
				else if (num >= 0x300 && num <= 0x3FF) { // 768 - 1023
					speed = num - 0x300;
					printf_P(PSTR("Befehl:\t0x%03X\nspeed:\t%i\n\n"), num, speed);
				}
				else if (num >= 0x400 && num <= 0x4FF) { // 1024 - 1279
					var4 = num - 0x400;
					printf_P(PSTR("Befehl:\t0x%03X\nvar:\t%i\n\n"), num, var4);
				}
				else if (num >= 0x500 && num <= 0x5FF) { // 1280 - 1535 
					var5 = num - 0x500;
					printf_P(PSTR("Befehl:\t0x%03X\nvar:\t%i\n\n"), num, var5);
				}
				else if (num >= 0x600 && num <= 0x6FF) { // 1536 - 1791 
					var6 = num - 0x600;
					printf_P(PSTR("Befehl:\t0x%03X\nvar:\t%i\n\n"), num, var6);
				}
				else if (num >= 0x700 && num <= 0x7FF) { // 1792 - 2047 
					var7 = num - 0x700;
					printf_P(PSTR("Befehl:\t0x%03X\nvar:\t%i\n\n"), num, var7);
				}
				else if (num >= 0x800 && num <= 0x8FF) { // 2048 - 2303 
					var7 = num - 0x800;
					printf_P(PSTR("Befehl:\t0x%03X\nvar:\t%i\n\n"), num, var8);
				}
				else if (num >= 0x900 && num <= 0x9FF) { // 2304 - 2559 
					var7 = num - 0x900;
					printf_P(PSTR("Befehl:\t0x%03X\nvar:\t%i\n\n"), num, var9);
				}
				else if (num >= 0xA00 && num <= 0xAFF) { // 2560 - 2815 
					var7 = num - 0xA00;
					printf_P(PSTR("Befehl:\t0x%03X\nvar:\t%i\n\n"), num, varA);
				}
				else if (num >= 0xB00 && num <= 0xBFF) { // 2816 - 3071 
					var7 = num - 0xB00;
					printf_P(PSTR("Befehl:\t0x%03X\nvar:\t%i\n\n"), num, varB);
				}
				else if (num >= 0xC00 && num <= 0xCFF) { // 3072 - 3327 
					var7 = num - 0xC00;
					printf_P(PSTR("Befehl:\t0x%03X\nvar:\t%i\n\n"), num, varC);
				}
				else if (num >= 0xD00 && num <= 0xDFF) { // 3328 - 3583 
					var7 = num - 0xD00;
					printf_P(PSTR("Befehl:\t0x%03X\nvar:\t%i\n\n"), num, varD);
				}
				else if (num >= 0xE00 && num <= 0xEFF) { // 3584 - 3839 
					var7 = num - 0xE00;
					printf_P(PSTR("Befehl:\t0x%03X\nvar:\t%i\n\n"), num, varE);
				}
				else if (num >= 0xF00 && num <= 0xFFF) { // 3840 - 4095 
					var7 = num - 0xF00;
					printf_P(PSTR("Befehl:\t0x%03X\nvar:\t%i\n\n"), num, varF);
				}

				else {
					printf_P(PSTR("\nBefehl:\t0x%03X\tERROR\n"), num);
					printf_P(PSTR("0x1xx:\t Farbton\t(xx = 00-FF)\n"));
					printf_P(PSTR("0x2xx:\t Saettigung\t(xx = 00-FF)\n"));
					printf_P(PSTR("0x3xx:\t Helligkeit\t(xx = 00-FF)\n"));
					printf_P(PSTR("0x4xx:\t Geschwindigk.\t(xx = 00-FF)\n"));
					printf_P(PSTR("0x5xx:\t ######\t\t(xx = 00-FF)\n"));
					printf_P(PSTR("0x6xx:\t ######\t\t(xx = 00-FF)\n"));
					printf_P(PSTR("0x7xx:\t ######\t\t(xx = 00-FF)\n"));
					printf_P(PSTR("0x8xx:\t ######\t\t(xx = 00-FF)\n"));
					printf_P(PSTR("0x9xx:\t ######\t\t(xx = 00-FF)\n"));
					printf_P(PSTR("0xAxx:\t ######\t\t(xx = 00-FF)\n"));
					printf_P(PSTR("0xBxx:\t ######\t\t(xx = 00-FF)\n"));
					printf_P(PSTR("0xCxx:\t ######\t\t(xx = 00-FF)\n"));
					printf_P(PSTR("0xDxx:\t ######\t\t(xx = 00-FF)\n"));
					printf_P(PSTR("0xExx:\t ######\t\t(xx = 00-FF)\n"));
					printf_P(PSTR("0xFxx:\t ######\t\t(xx = 00-FF)\n"));
				}
			}
		}
		rainbow(brightness, speed, var4, 2, pairOfLeds);
	}
}

int uart_putchar(char c, FILE *stream) {
	Serial.write(c); return 0;
}


void setupLeds(void) {
	FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
	clearLeds();
}

void clearLeds(void) {
	memset(leds, 0, NUM_LEDS * 3);
	FastLED.show();
}

void rainbow(int brightness, int speed, int width, int direction, int pairOfLeds) {
	const int MIN_DURATION = 1E3;
	const int MAX_DURATION = 3E4;
	const int MIN_SPEED = 1;
	const int MAX_SPEED = 5;
	const int SATURATION = 255;

	if (speed < MIN_SPEED) speed = MIN_SPEED;
	else if (speed > MAX_SPEED) speed = MAX_SPEED;
	long duration = (speed - MIN_SPEED) * (MIN_DURATION - MAX_DURATION) / (MAX_SPEED - MIN_SPEED) + MAX_DURATION;

	int numLeds = NUM_LEDS / pairOfLeds;
	if (pairOfLeds > 1) width = width / pairOfLeds;
	int hue[NUM_LEDS];
	int shift = (255 * millis() / duration) % 255;

	if (direction <= 0) {
		for (int i = 0; i < numLeds; i++) hue[i] = (i * 255 / width + shift) % 255;
	}
	else if (direction == 1) {
		for (int i = 0; i < numLeds; i++) hue[numLeds - 1 - i] = (i * 255 / width + shift) % 255;
	}
	else if (direction == 2) {
		if (numLeds % 2 == 0) {
			for (int i = 0; i < numLeds; i++) {
				if (i < numLeds / 2) hue[i] = (i * 255 / width + shift) % 255;
				else hue[i] = ((numLeds - 1 - i) * 255 / width + shift) % 255;
			}
		}
		else {
			for (int i = 0; i < numLeds; i++) {
				if (i <= numLeds / 2) hue[i] = (i * 255 / width + shift) % 255;
				else hue[i] = ((numLeds - 1 - i) * 255 / width + shift) % 255;
			}
		}
	}
	else {
		if (numLeds % 2 == 0) {
			for (int i = 0; i < numLeds; i++) {
				if (i < numLeds / 2) hue[i] = ((numLeds - 1 - i) * 255 / width + shift) % 255;
				else hue[i] = (i * 255 / width + shift) % 255;
			}
		}
		else {
			for (int i = 0; i < numLeds; i++) {
				if (i <= numLeds / 2) hue[i] = ((numLeds - 1 - i) * 255 / width + shift) % 255;
				else hue[i] = (i * 255 / width + shift) % 255;
			}
		}
	}

	// Leds setzen
	for (int i = 0; i < numLeds; i++) {
		int led = i*pairOfLeds;
		leds[led] = CHSV(hue[i], SATURATION, brightness);
		// Wenn "pairOfLeds" > 1 ist, setzte die benachbarten Leds
		for (int j = 1; j < pairOfLeds; j++) leds[led + j] = CHSV(hue[i], SATURATION, brightness);
	}
	FastLED.show();
}
		int id;
		int value;
		if (Serial.available()) {
			int num = Serial.parseInt();
			if (num >= 0x100)  {
				id = num / 0x100;
				value = num - (id * 0x100);
				printf_P(PSTR("Eingabe:\t0x%03X\t%4i\n"), num, num);
				printf_P(PSTR("ID:\t\t0x%X__\t%4i\n"), id, id);
				printf_P(PSTR("Wert:\t\t0x_%02X\t%4i\n\n"), value, value);
			}
		}

Hab den Sketch soweit gekürzt um aufzuteilen, was die ID, und was der Wert ist.

255 // Wird nicht ausgewertet, da der Wert zu klein ist, das soweit schon korrekt.
260 // Wird erfolgreich ausgeführt
Eingabe:        0x104    260
ID:             0x1__      1
Wert:           0x_04      4

260 // Wird nicht mehr ausgeführt :/
261
Eingabe:        0x105    261
ID:             0x1__      1
Wert:           0x_05      5

260 // Jeder Wert, der bereits einmal vorkam wird nicht mehr ausgeführt!
260
261
262
Eingabe:        0x106    262
ID:             0x1__      1
Wert:           0x_06      6

2623
Eingabe:        0x107    263
ID:             0x1__      1
Wert:           0x_07      7

Einstellungen habe ich in Putty soweit fast unversehrt gelassen.
Lediglich folgende Abänderungen
-> Terminal -> Implicit CR in every LF "aktiv" (Ansonsten kommen komische Versätze in der Ausgabe)

EDIT:
Mit dem Serial Monitor aus der Arduino IDE gehts korrekt :frowning:

Eingabe:	0x100	 256
ID:		0x1__	   1
Wert:		0x_00	   0

Eingabe:	0x12C	 300
ID:		0x1__	   1
Wert:		0x_2C	  44

Eingabe:	0x15E	 350
ID:		0x1__	   1
Wert:		0x_5E	  94

Eingabe:	0x15E	 350
ID:		0x1__	   1
Wert:		0x_5E	  94