INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Serial.write
27.07.2016, 20:24
Beitrag #1
Serial.write
Was ist im folgendem Code nicht C++ konform ?
Code:
typedef union {
    signed short Integer;
    unsigned char binary[2];
} binaryInt;

binaryInt adc[2];

void loop(void) {
  Serial.write(adc, 4);                  // geht nicht
  Serial.write(adc[0].binary, 4);   // geht, aber mit Warnung
}
Die erste Variante wird mit folgendem Fehler quittiert:
Code:
../ADS1150_abgespeckt.ino:89:23: error: no matching function for call to 'HardwareSerial::write(binaryInt [2], int)'
    Serial.write(adc, 4);

Bei der zweiten Variante kommt folgendes:
Code:
Invalid arguments ' Candidates are: unsigned int write(unsigned long int) unsigned int write(long int) unsigned int write(unsigned int) unsigned int write(int) ? write(?) unsigned int
write(const char *) ? write(const ? *, ?) ? write(const char *, ?) unsigned int write(unsigned char) '
Aber der Kompiler frisst es trotzdem.

Was noch interesant ist, der 2- Fehler kommt nur in Eclipse, die Arduino-IDE hat da nichts zu motzen. Sad
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.07.2016, 21:19
Beitrag #2
RE: Serial.write
Hey!

Jede Funktion hat eine Parameterliste, in der definierte Variablen mit einem Typen übergeben werden. In Nr. 1 ist dieser Typ "binaryInt" (jeder typedef, union, enum, etc. ist ein Variabletyp). Die Funktion write() hat keine keine Parameterliste mit diesem Typ (binaryInt) und kann somit auch keine zugehörige Funktion finden.


Code:
// Funktion definieren
int
HandleInt(int variable)
{
    return variable + 1;
}

// Variablen deklarieren
float a_float = 3.14;
int an_int = 3;

// Funktionsaufruf
HandleInt(a_float); // wird einen Error ausgeben, da Variablentyp kein int ist
HandleInt(an_int); // funktioniert

In deinem Falle müsste eine Funktion-Definiton von dieser Art vorhanden sein:
Code:
write(binaryInt *a_binaryInt_pointer, int buffer_length)
{
    // ...
}
Der Pointer kommt daher, dass du einen Array hast (an_array[2]) aber der Parameter ohne Index übergeben wird (an_array <- ist ein Pointer, an_array[0] <- ist kein Pointer).

Bei Nr. 2 wird das Problem sein, dass du eine Länge von 4 Elementen hast, der Array jedoch nur 2 Elemente beinhaltet. D.h. die ersten 2 Elemente sind definiert, die nachfolgenden 2 Elemente können jedoch auf IRGENDWAS zeigen, was dir evtl. nicht bekannt ist. Somit wirst du 2 Werte wie gewollt sehen (am Monitor), die danach könnten zufällige Werte beinhalten.

mfg Scheams
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.07.2016, 16:04
Beitrag #3
RE: Serial.write
Zitat: Somit wirst du 2 Werte wie gewollt sehen (am Monitor), die danach könnten zufällige Werte beinhalten.
Wieso sollten die werte danach zufällig sein, adc ist eine Array aus 2 Elemeten ?
Oder sind bei C++ die Elemente eine Array nicht alles schön hintereinander ?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.07.2016, 16:37
Beitrag #4
RE: Serial.write
Hey!

Du hast bei Serial.write(wert, Elemente/Buffer-Länger) aber angegeben, dass adc[0].binary 4 Elemente (write(XY, 4)) hat, was nicht stimmt, da der Array "binary" in der Union nur 2 Elemente behinhaltet.
(27.07.2016 21:19)Scheams schrieb:  ...
D.h. die ersten 2 Elemente sind definiert, die nachfolgenden 2 Elemente können jedoch auf IRGENDWAS zeigen, was dir evtl. nicht bekannt ist.
...

Ähnliches Beispiel
Code:
char a_char_array[] = "HELLO WORLD";
Serial.println(a_char_array[20]);
Das hier wird auch auf einen Wert zugreifen, der dir warscheinlich unbekannt ist, weil der Index 20 außerhalb des beschriebenen Bereichs liegt.

mfg Scheams
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.07.2016, 18:51
Beitrag #5
RE: Serial.write
Zitat:Du hast bei Serial.write(wert, Elemente/Buffer-Länger) aber angegeben, dass adc[0].binary 4 Elemente (write(XY, 4)) hat, was nicht stimmt, da der Array "binary" in der Union nur 2 Elemente behinhaltet.
Die Array hat schon 2 Elemente à 2 Integer, macht 4 Byte Länge.
Oder bezieht sich die 4 auf Array-Elemente ?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.07.2016, 12:58
Beitrag #6
RE: Serial.write
Hey!

Also ich sehe hier einen Array von 2 Elementen von dem Typ unsigned char ("unsigned char binary[2]" = 2 * 1Byte).
Pointer zeigen auf einen Variabletyp, nicht auf ein Byte und somit wird springt man, durch erhöhen der Adresse, auf das nächste Element. Bei einem Integer dann also um 2 Bytes weiter.

mfg Scheams
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.07.2016, 17:06 (Dieser Beitrag wurde zuletzt bearbeitet: 29.07.2016 17:09 von Mathias.)
Beitrag #7
RE: Serial.write
Hier wird wie erwartet eine 4 ausgegeben.
Code:
Serial.println(sizeof(adc));

Wen ich hie gucke: https://www.arduino.cc/en/Serial/Write
Dann wäre dies eine Serie von 4 Bytes, da adc 4 Bytes gross ist.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Ausgabe Serial Monitor zu viele Byt`s Hannes 0 98 12.11.2016 20:29
Letzter Beitrag: Hannes
  If-Bedingung funktioniert nicht bei Serial1.write Datatom 6 227 16.09.2016 20:36
Letzter Beitrag: Datatom
  Speicher sparen bei serial.print?? DL1AKP 3 197 02.09.2016 13:32
Letzter Beitrag: hotsystems
  Serial Monitor ASCII 1 schreiben BennIY 11 582 01.08.2016 16:42
Letzter Beitrag: Mathias
  Serial Monitor Rudi 5 638 02.06.2016 11:37
Letzter Beitrag: Bitklopfer
  Serial.printeln, Stellen verschwinden Mathias 6 261 27.05.2016 17:44
Letzter Beitrag: Mathias
  Kommunikation Serial Monitor --> Arduino BennIY 7 357 24.05.2016 07:48
Letzter Beitrag: hotsystems
  Serial Monitor Eingabe über Code Maxi290997 4 523 12.05.2016 18:57
Letzter Beitrag: SkobyMobil
  Software serial umschaltzeit BennIY 3 385 13.03.2016 18:51
Letzter Beitrag: hotsystems
  Frage zu Serial SMoTH 3 464 09.03.2016 18:13
Letzter Beitrag: SMoTH

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste