- 01
 - 02
 - 03
 - 04
 - 05
 - 06
 - 07
 - 08
 - 09
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 - 20
 - 21
 - 22
 - 23
 - 24
 - 25
 - 26
 - 27
 - 28
 - 29
 - 30
 - 31
 - 32
 
                        #define COMMAND_MARKER		'\x1B'
#define COMMAND_SET			'='
#define COMMAND_XOR			'^'
#define COMMAND_OR			'|'
#define COMMAND_AND			'&'
void usbWriteOut(uchar *data, int len)
{
	while(len--) {
		uchar c = *data;
		buf[0] = buf[1];
		buf[1] = buf[2];
		buf[2] = buf[3];
		buf[3] = c;
		
		if(buf[0] == COMMAND_MARKER) {
			uint8_t val = (hex2u(buf[2]) << 4) | hex2u(buf[3]);
			if(buf[1] == COMMAND_SET) {
				colorData = val;
			}
			else if(buf[1] == COMMAND_XOR) {
				colorData ^= val;
			}
			else if(buf[1] == COMMAND_OR) {
				colorData |= val;
			}
			else if(buf[1] == COMMAND_AND) {
				colorData &= ~val;
			}
		}
	}
}
                                 
        
ну, data не инкрементируется, это понятно
но buf - нечто циклическое, где [0] - tag, [1] - opcode, [2],[3] - типа аргументы, аргументы при следующих итерациях могут стать опкодами или маркерами? точно len -= 4 не подразумевалось?
ну и да, ваш компилятор не поддерживает конструкцию switch (buf[1])?