ff String zu ff Byte wandeln

Hallo,

ich habe folgendes Problem.
Daten werden vom PC zum Arduino gesendet.
Dieser wertet den String aus und sendet den per ModBus als Byte-Werte weiter

Der Code lautet:

String ModBefehl;
byte dataDrive[] = {0x00, 0x00, 0x00, 0x00,  0x00, 0x00};

...

ModBefehl = char(Serial.read());// + char(Serial.read());
ModBefehl = ModBefehl + char(Serial.read());        // String eintragen

ModBefehl.getBytes (dataDrive[1], 2);                   // String übertragen in Byte-Array

Es wird zwar compiliert und hochgeladen, aber es funktioniert nicht.
Eine Warnung erscheint:
"warning: invalid conversion from 'byte {aka unsigned char}' to 'unsigned char*' [-fpermissive]
ModBefehl.getBytes (dataDrive[1], 2); "

Was ist daran falsch?

Warum benutzt Du String statt char-Array, woDu im Endeffekt ja hin willst?
Warum liest Du zweimal das Zeichen? Damit verlierst Du eins.

Gruß Tommy

Es werden 2 Zeichen gesendet, in ModBefehl eingelesen und diese sollen in ein byte-Array (nicht in ein char-Array).
Der letzte Schritt funktioniert nicht ... :frowning:

"warning: invalid conversion from 'byte {aka unsigned char}' to 'unsigned char*' [-fpermissive]
ModBefehl.getBytes (dataDrive[1], 2); "

Was ist daran falsch?

byte* ist etwas völlig anderes als byte
Was willst du mit dem [1] hinter dataDrive überhaupt erreichen?
Mal abgesehen vom Datentyp String für ModBefehl über den Tommy schon zurecht geschimpft hat.

byte* und char* ist übrigens fast dasselbe. Das was du mit read liest, ist zwar formal ein int, damit du eine -1 als "keine Daten vorhanden" erkennen kannst. Aber wenn es keine -1 ist, kann es genausogut als char wie als byte behandelt werden und in einem entsprechenden Array gespeichert werden.

Rubbernose:
Es werden 2 Zeichen gesendet, in ModBefehl eingelesen und diese sollen in ein byte-Array (nicht in ein char-Array).
Der letzte Schritt funktioniert nicht ... :frowning:

das ist nicht was du oben auszugsweise gepostet hast.

von byte array zu char array wäre z.B. so:

char source[] = {0x30, 0x31};
byte target[2];

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);

  memcpy(target, source, 2) ;

  Serial.print(F("source "));
  Serial.print(source[0], HEX);
  Serial.print(F(" "));
  Serial.println(source[1], HEX);

  Serial.print(F("target "));
  Serial.print(target[0], HEX);
  Serial.print(F(" "));
  Serial.println(target[1], HEX);
}

void loop() {
  // put your main code here, to run repeatedly:

}

Oh, jetzt wirds aufwändig....
"byte* ist etwas völlig anderes als byte" Wo kann man das nachlesen? Unter Arduino.cc habe ich nichts gefunden.

"Was willst du mit dem [1] hinter dataDrive überhaupt erreichen?"
Das ist die zweite Stelle im Array.

Mal abgesehen vom Datentyp String für ModBefehl über den Tommy schon zurecht geschimpft hat.

"byte* und char* ist übrigens fast dasselbe."
Leider nur fast. Die IDE liefert einen Fehlermeldung.

"Das was du mit read liest, ist zwar formal ein int, damit du eine -1 als "keine Daten vorhanden" erkennen kannst. Aber wenn es keine -1 ist, kann es genausogut als char wie als byte behandelt werden und in einem entsprechenden Array gespeichert werden."
Wenn das so einfach ist, wie kann man denn den String "ff" in das Byte-Array bekommen? Ich verstehe es einfach nicht.

@noiasca
ich möchte, von Anfang an, einen String (z.B. FF) in ein byte-Array übertragen. Nicht von byte in char!!!

halte dich genau an

zweimal lesen!
len: the size of the buffer (unsigned int)

Und stelle immer vollständigen Code zur Verfügung!

String ModBefehl;
byte dataDrive[] = {0x00, 0x00, 0x00, 0x00,  0x00, 0x00};

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);

  ModBefehl = "ff";
  ModBefehl.getBytes (dataDrive, 4);

  Serial.print(F("Modbefehl ")); Serial.println(ModBefehl);

  Serial.print(F("dataDrive "));
  Serial.print(dataDrive[0], HEX);
  Serial.print(F(" "));
  Serial.print(dataDrive[1], HEX);
  Serial.print(F(" "));
  Serial.print(dataDrive[2], HEX);
  Serial.print(F(" "));
  Serial.println(dataDrive[3], HEX);

}

du siehst was das .getBytes macht.

Modbefehl ff
dataDrive 66 66 0 0

102 -> 0x66 -> f ... alles das gleiche.

im Buffer ist es, richtig umgehen musst du damit.

Ich verstehe überhaupt nichts mehr.
Der Monitor liefert statt dataDrive[1] = ff (oder 255)

dataDrive 66 66 0 0

Wieso 66? ff = 255 !

Der gesamte Code besteht aus mehreren Seiten und darf nicht veröffentlicht werden!
Ich möchte auch nichts per Serial.print(dataDrive[0], HEX) senden, sondern den hexWert nur in dataDrive[1] schreiben.
Vielleicht ist das zu einfach?

nein ff ist nicht 255.

0xFF ist Dez 255.

ff in einem String Objekt sind zunächst mal zwei Zeichen. Zwei kleine f.

ein kleines f

102 -> 0x66 -> f

ob du es am Serial.Monitor ausgibst oder über Modbus ausgibst ist zunächst nicht relevant. Du musst verstehen was du in deiner Eingabe wirklich hast und was du in der Folge übertragst. Wie willst du sonst wissen was am anderen Ende vom Bus rauskommen wird?

UND DAZU TRÄGT EIN KLEINER KOMPILIERBARER SKETCH BEI, erst recht dann, wenn der Rest geheim bleiben muss.

Gib dir auch ruhig mal deine empfangenen Zeichen als Hex aus bevor du sie an deinen Eingabe-Buffer concatinierst. Na was kommt an wenn du f sendest? Gegencheck: was musst du senden damit (Ox)FF ausgegeben wird?

Rubbernose:
Wo kann man das nachlesen? Unter Arduino.cc habe ich nichts gefunden.

Die Arduino Software ist eine API. Programmiert wird in C/C++. Die Grundlagen der Sprache sollte man schon irgendwann lernen

Rubbernose:
Der gesamte Code besteht aus mehreren Seiten und darf nicht veröffentlicht werden!

Dann bist du in einem OPEN SOURCE Forum an der falschen Stelle.

Zu deinem Problem:

Ist eigentlich ganz einfach, du musst nur..

(Die vollständige Antwort hat mehrere Sätze und darf nicht veröffentöich werden!)

Es funktioniert!
Ich sende vom PC einfach die Dezimalwerte! Im Arduino werden die in Integervariablen abgespeichert, verrechnet und anschließend direkt in ein unsigned char Array eingetragen. Über die crc16.h wird alles dann noch verschlüsselt und der Frequenzumrichter kann programmiert werden! :slight_smile:

Danke an Alle (für die fachkundigen Beschimpfungen)!

Rubbernose:
Über die crc16.h wird alles dann noch verschlüsselt und der Frequenzumrichter kann programmiert werden! :slight_smile:

CRC ist keine Verschlüsselung, sondern eine einfache Form der Kontrolle auf Übertragungsfehler.

Gruß Tommy