Arduino serial.read von binary Daten nach integer

Moin moin,

ich kann über eine serielle Verbindung erfolgreich hexadezimale Kommandos schicken und bekomme auch die korrekte hexadezimale Antwort , die dann per serial.print per DEC oder HEX ausgegeben wird (siehe unten).

Jetzt möchte ich einen Wert in Integer umwandeln, um damit weiter zu arbeiten. Ich habe schon einige Stunden gegoogled, gelesen und probiert, aber ohne Hilfe wird das nichts. Einfache Zuweisungen führen nicht zum erhoften Ergebnis. Für Hilfe bin ich dankbar.

Ausgabe:

I received: 1 : F0
I received: 2 : 6
I received: 3 : 3F
I received: 4 : A8
I received: 5 : 23
I received: 6 : 1
I received: 7 : 0
I received: 8 --> 12 C 
I received: 9 : DD
I received: 10 : FF

Source:

int incomingByte = 0; // for incoming serial data

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


void loop() {
  
  delay(5000);

 // Kommando an den anderen Microcontroller schicken

  Serial.write(0xF0);
  Serial.write(0x06);
  Serial.write(0x3F);
  Serial.write(0xA8);
  Serial.write(0x23);
  Serial.write(0x01);
  Serial.write(0x00);
  Serial.write(0xCF);
  Serial.write(0xFF);
  delay(100);

// Antwort vom anderen Microcontroller einlesen

  int count = 0;
  while (Serial.available() > 0) {

    count++;
    incomingByte = Serial.read();

    Serial.print("I received: ");
    Serial.print(count);
    if (count == 9) { 
      Serial.print(" --> ");
      Serial.println(incomingByte, DEC);   
    }
    else Serial.print(" : ");
    Serial.println(incomingByte, HEX);
  }
}

Hardware: Arduino Nano

Guten Morgen,

Ich habe nicht ganz verstanden, was Sie tun wollten. Können Sie bitte Ihre Werte aufschreiben und zeigen, was Sie daraus machen möchten?

Ich spreche kein Deutsch, ich verwende eine Übersetzung. Seien Sie so klar wie möglich (Diagramme sind Text vorzuziehen)

Was ist für dich ein "int"?

Es fehlt eine wichtige Information!

einen Integerwert mit dem man weiter arbeiten und rechnen kann.

Wo soll der her kommen?

Merke:
Die Information die du (versehentlich?) geheim hältst, fehlt auch mir.

Hallo mark41

Jeder Wert aus einer Variable kann in jedem Format dargestellt werden.

Eine Variable enthält die Zahl, die im vereinbarten Datentyp abgelegt worden ist.

Jedes Byte für sich? Dann ist incomingByte schon das Ding, mit dem man rechnen kann. Vielleicht willst Du es noch in einer anderen Variablen für später aufheben.

Mehrere aufeinander folgende Bytes zusammen?
Dann musst Du wissen:

  • welche
  • wie viele
  • "low" oder "high" endian

Dann kannst Du sie passend zusammenbauen - oder ggf. in Byte-Array(s) zusammen mit den Integer in einer union speichern.

Wenn Du eine Zahl bekommst dann ist es eine Zahl, dann kann die Zahl aumgewandelt werden.
Wenn Du einen Wert Byteweise bekommst mußt Du ihn wieder zusammenstellen. Bei 10 Byte weiß ich nicht welches Zahlenformat Du erhalten willst.
Andererseits kannst Du auch den ashii-Wert der Zahl übertragen und diese in einen Wert umwandeln. Das scheint aber nicht der Fall zu sein weil die gezeigten Werte keine Zahlen-Buchstaben sind.

Also Bitte mehr Info.
Was sind das für empfangene Werte; was soll daraus werden?

Grüße Uwe

Versuche mal dies:

  // Antwort vom anderen Microcontroller einlesen

  int count = 0;
  while (Serial.available() > 0) {

    count++;
    incomingByte = Serial.read();

    Serial.print("I received: ");
    Serial.print(count);
    Serial.print(" : ");
    Serial.println(incomingByte, HEX);

    if (count == 8) intWert = incomingByte * 256;
    if (count == 9) {
      intWert += incomingByte;
      Serial.print("intWert: ");
      Serial.print(intWert, HEX);
      Serial.print('\t');
      Serial.println(intWert, DEC);
    }
  }
I received: 1 : F0
I received: 2 : 6
I received: 3 : 3F
I received: 4 : A8
I received: 5 : 23
I received: 6 : 1
I received: 7 : 0
I received: 8 : CF
I received: 9 : FF
intWert: CFFF	53247

Ist auf AVR leider kein gültiger int

Es fehlt auf jeden Fall noch wichtige Information

Mark, gehe zunächst das Tutorial durch

da wird sehr genau darauf eingangen wie man zuverlässlich Werte über die Serielle Schnittstelle einliest.

Wenn du uns anschließend dann noch genau beschreibst, welches Gerät du da auslesen möchtest und Beschreibungen zum verwendeten Protokoll hier postest, kann man besser helfen.

Verstehe ich nicht.
Entweder ist das dann ein Phantasiewert ohne jeden Sinn ...
oder Du sendest konkrete Werte über die Schnittstelle, die Du auf der Sendeseite in hexadezimale Bytegruppen zerlegen musst. Dann kannst Du das gleiche Verfahren auf der Empfangsseite revers verenden????

cu

Ich bin ein Versager!
Ich versage daran, aus einem Byte Datenstrom, welcher über die Serielle hereintropft, ein int heraus zu destillieren.
Eigentlich eine ganz einfache Geschichte.

Warum versage ich daran so elendig, obwohl ich Jahrzehnte Erfahrung mit genau sowas habe?

Ganz einfach:
Meine telepathischen Fähigkeiten sind zu schwach entwickelt, um den Kontext der Geschichte zu erfassen.

@ combie
Ist doch nicht schlimm, meistens kannst Du ja mit Deinem Fundierten Wissen helfen. :wink: :wink:
Grüße Uwe

Hallo
Wie die Werte dargestellt werden spielt dabei doch keine Rolle..Ob Hex Dec , Oct, oder binär an dem eigentlichen Wert ändert sich doch nichts. Das ist doch nur eine Darstellungsart, da muss nichts umgerechnet werden.

Du kannst deinem Wert incomingByte einfach nutzen und damit rechnen. z.B

Int A =IncomingByte +10;

Wenn dann incomingByte z.B 0X0A ist also Dec 10 dann kommt da eben 20 raus.

Heinz
Nachtrag
Das gilt natürlich nur solange du nur mit einen einzelnen Byte arbeitest.