Frage zu Serial.write

Hallo zusammen,

ich bekomme bei diese Zeile

Serial3.write(transmit.transmitBytes, sizeof(transmit.transmitBytes);

die Fehlermeldung:

Invalid arguments ’
Candidates are:
unsigned int write(unsigned long int)
unsigned int write(long int)
unsigned int write(unsigned int)
unsigned int write(int)
unsigned int write(const char *)
unsigned int write(unsigned char)

das entspr. typedef union sieht so aus:

typedef union {
byte transmitBytes[TRANSMIT_BYTES]; ///< 18 * 4 Bytes(float) = 68
float sendToCockpit[TRANSMIT_VALUES]; ///< Number(18) Values sent to Cockpit.
} transmit_u;

Das Programm arbeitet korrekt, d.h. Daten werden korrekt gesendet und empfangen. Die Fehlermeldung scheint falsch zu sein.

Was kann das sein?

Gruß Willi

Da fehlt eine schließende Klammer gegen Ende

typedef braucht man hier nicht

Danke für die schnell Antwort.
Sorry, die Klammer fehlt nur hier.
Wenn ich aber typedef entferne, kommt eine andere Fehlermeldung.

Dann machst du generell mit den Datentypen und Variablen was falsch.

OK überprüfe ich. Melde mich noch einmal. Aber wie gesagt, Daten werden korrekt gesendet und empfangen.

Gruß Willi

combie:
Für den Type " byte[TRANSMIT_BYTES]", gibt es keine passende write() Funktion.

Gibt es schon in der Print Klasse:

virtual size_t write(const uint8_t *buffer, size_t size);

size_t write(const char *buffer, size_t size) {
      return write((const uint8_t *)buffer, size);
}

Und wenn man es richtig macht geht das auch:

union Transmit_u
{
  byte transmitBytes[4];
  float sendToCockpit;
} transmit;


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

  transmit.sendToCockpit = 10.0;
  Serial.write(transmit.transmitBytes, sizeof(transmit));
}

Ich glaube, du möchtest gar nicht Serial3.write(transmit.transmitBytes, sizeof(transmit.transmitBytes) verwenden, sondern Serial3.print(transmit.transmitBytes, sizeof(transmit.transmitBytes).

In Print.h sehe ich allerdings:

    virtual size_t write(const uint8_t *buffer, size_t size);

size_t write(const char *buffer, size_t size) {
      return write((const uint8_t *)buffer, size);
    }

Wäre das kein geeigneter Kandidat ?

byte data[] = {65, 66, 0, 67, 68};
void setup() {
   Serial.begin(9600);
   Serial.write(data, sizeof(data));
}
void loop() {}

Das kompiliert jedenfalls problemlos

Sorry, die Klammer fehlt nur hier.

Testbaren Code posten!

Du schreibst jetzt 100 mal:
“Ich gelobe nur noch testbaren Code zu posten!”

die Fehlermeldung:

Bei einem Error wird nicht weiter kompiliert!
Also:
Entweder ist es ein Warning, oder eine Fehlermeldung.
Beides geht nicht.

Du schreibst jetzt 100 mal:
“Ich gelobe nur noch unverstümmelte Meldungen zu posten!”

Denn folgender Code geht ohne Meldung durch:

#define TRANSMIT_VALUES 18
#define TRANSMIT_BYTES (4 * TRANSMIT_VALUES)

typedef union {
   byte transmitBytes[TRANSMIT_BYTES];        ///< 18 * 4 Bytes(float) = 68
   float sendToCockpit[TRANSMIT_VALUES];      ///< Number(18) Values sent to Cockpit.
} transmit_u;

transmit_u transmit;


void setup() 
{
  Serial.begin(9600);
  Serial.println("Start");

  memset(transmit.transmitBytes,'A',sizeof(transmit.transmitBytes));
  Serial.write(transmit.transmitBytes,sizeof(transmit.transmitBytes));
}

void loop() 
{

}

Gibt es schon in der Print Klasse:
In Print.h sehe ich allerdings:

Das ist allerdings wahr, darum habe ich das Posting auch gelöscht, weil, vom falschen Ansatz ausgegangen.
Ein Irrtum, es war…

Habe mich von der Verstümmelungstaktik verirren lassen.
Code und Meldungen verstümmelt.
Das stufe ich als grob fahrlässig ein.
Im Wiederholungsfall, als vorsätzlich.

combie:
Testbaren Code posten!

Du schreibst jetzt 100 mal:
"Ich gelobe nur noch testbaren Code zu posten!"

Aber ohne Copy & Paste! :wink:

Gruß Tommy

Du kannst auch einen Sketch schreiben der 100 mal "Ich gelobe nur noch testbaren Code zu posten!" schreibt. :wink: :wink: :wink:

... aber nicht mit blockierender while ...

irgendwie muß man aber nach 100 aufhören...

Das geht sicher irgendwie mit millis()
:slight_smile: :slight_smile:

Guten Morgen,
danke an alle, das muss ich erst einmal verarbeiten. Wie ich jetzt die entsprechen Codezeilen excludieren kann, damit der Code ausführbar wird, muss ich noch versuchen. Der ganze Code wäre sicherlich zu komplex.
Melde mich dann wieder
Gruß Willi

Hallo Combie,

"Bei einem Error wird nicht weiter kompiliert!
Also:
Entweder ist es ein Warning, oder eine Fehlermeldung.
Beides geht nicht.
"
Geht doch, siehe Anhang. Oder sehe ich was falsch?

P.S.
Ich benutze die Sloeber IDE.

Geht doch, siehe Anhang. Oder sehe ich was falsch?

Kenne deine IDE nicht.

Und nein, wenn ein Error auftritt kann keine neue HEX Datei erstellt und hochgeladen werden.
Keine mir mir bekannte Entwicklungsumgebung kann dann noch lauffähigen Code erzeugen.
Egal für welche Sprache.

Wenn deine IDE das können tun würde, dann stufe ich das unter "Wunder" ein.

Das wäre für mich der wesentliche Unterschied zwischen “error” und “warning”:

Keine Entwicklungsumgebung sollte dann Code erzeugen.
Egal welche.

(Um combie’s Aussage mal leicht abzuwandeln.)

Benutzt du benutzt eine alte Version von sloeber? Hiernach war das eine hervorragende Verbesserung in Version 3.

Hallo zusammen,
das war ja der Grund, warum ich diese Frage gestellt habe. Der Code wird compiliert und funktioniert einwandfrei.
Deshalb habe ich auch den “verstümmelten” Code gepostet. Es ging mir nur um die Meldung. Sorry, wenn ich euch verwirrt habe.

Ich benutze die Sloeber V4.2_win64.2017-11-20_02-16-52.

Gruß Willi

Wie schon gesagt...
Für mich ist das ein Wunder!

Das wäre für mich der wesentliche Unterschied zwischen "error" und "warning":

Für mich auch!

  • Bei einem Error bricht es ab.
  • Bei einem Warning "kann" der Code versagen.

So kenne ich es, und nicht anders.
Egal welche Umgebung.
Egal welche Sprache.


Ich habe dir doch eine paar Postings vorher einen 'Fehlerfreien Code überreicht.
Kommt die Meldung auch bei dem?

Habe ich noch nicht probiert. Mache ich aber noch. Aber erst einmal Sohnemanns Polterabend :slight_smile:

Gruß Willi