mehrere Hex-werte über serial eingeben

hallo,
ich möchte einen key-array über serial eingeben. Dieser Key besteht aus 6 Bytes.
Am liebsten möchte ich den ganzen Key (einzelne Bytes getrennt mit , oder /) in HEX eingeben. Leider komme ich da nicht weiter.

byte key[6];

void setup() {
  Serial.begin(9600);
}

void loop() {
  while(!Serial.available()){}
  while(Serial.available() > 0){
    key[0] = (Serial.read()&&110000000000)>>10;
    key[1] = (Serial.read()&&001100000000)>>8;
    key[2] = (Serial.read()&&000011000000)>>6;
    key[3] = (Serial.read()&&000000110000)>>4;
    key[4] = (Serial.read()&&000000001100)>>2;
    key[5] = (Serial.read()&&000000000011)>>0;
  }
  for(int i=0; i<=6; i++){
    Serial.println(key[i],HEX);
  }
  
}

Meine Idee hier ist es, den ganzen Code einzugeben, mit bitweiser Operation und Bitshift den wert zu ermitteln.
Das ganze funktioniert allerdings nicht. Das Problem liegt wahrscheinlich beim einlesen (da meiner meinung nach ascii eingelesen wird).
Wie kann ich es machen, dass HEX eingelesen wird?
Die eingabe sollte dann so
ff,ff,ff,ff,ff,ff
oder so
ff/ff/ff/ff/ff/ff
oder irgendwie anders getrennt aussehen.
(hier wird ja jedes zeichen einzelnd eingelesen)

Chandler

Aus meiner Wühlkiste:

char zahl[] = "80,5a/ff.01"; // Quelle
const int BYTES = 4;
byte feld[BYTES]; // Ziel




void setup() {
  Serial.begin(9600);
  for(int i=0;i<BYTES;i++)
  {
    feld[i] =  strtoul(zahl+i*3,NULL,16);
    Serial.println(feld[i]);
  }  
}

void loop() {}

Serial Monitor so einstellen, dass am Ende ein Linefeed gesendet wird, dann kannst du das alles mit Komma getrennt auf einmal eingeben:

const int SERIAL_BUFFER_SIZE = 20;
char serialBuffer[SERIAL_BUFFER_SIZE];

byte key[6];

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  if (readSerial())
  {
    parseSerial();

    for (int i = 0; i < sizeof(key); i++)
      Serial.println(key[i]);
    Serial.println();
  }
}

bool readSerial()
{
  static byte index;

  while (Serial.available())
  {
    char c = Serial.read();

    if (c >= 32 && index < SERIAL_BUFFER_SIZE - 1)
    {
      serialBuffer[index++] = c;
    }
    else if (c == '\n')
    {
      serialBuffer[index] = '\0';
      index = 0;
      return true;
    }
  }
  return false;
}

void parseSerial()
{
  char* ptr = strtok(serialBuffer, ",");

  for (int i = 0; i < sizeof(key); i++)
  {
    key[i] = strtoul(ptr, NULL, 16);
    ptr = strtok(NULL, ",");
  }
}

Da das alles nicht funktioniert, wie ich es gedacht habe, habe ich noch einmal eine nachfrage. Das Problem ist, dass immer ein Zeichen eingelesen wird, daraufhin der code für dieses zeichen ausgeführt wird und die loop wieder von vorne anfängt und das nächste zeichen einliest. Daher wird alles (soweit schon vorhanden) alles immer und immer wieder ausgegeben. Ist es nicht möglich, dass sofort alles eingelesen wird, und dies dann bearbeiten kann?

Ist es nicht möglich, dass sofort alles eingelesen wird, und dies dann bearbeiten kann?

Je nachdem, wie zeitkritisch alles ist, kannst du einen Sketch so schreiben, dass er erstmal gar nichts macht bevor Serial nicht eine komplette Datenzeile empfangen hat.

Bei 9600 dauert jedes Zeichen ca. 1 ms

"Schöner" ist es generell, wenn in dieser Millisekunde loop() mehrfach durchläuft. Aber es gibt auch delay(), wenn du diese Schönheit nicht haben willst.

Sereniflys Beispiel readSerial() kann beliebig oft und schnell aufgerufen werden und liefert immer false, bis die Zeile fertig eingelesen wurde. Erst dann liefert diese Funktion true zurück und erst dann wird (in seinem Beispiel) parseSerial() aufgerufen und evtl. eine Ausgabe gemacht.

wenn das bei dir anders ist, vergleiche deinen Code nochmal mit dem Beispiel.