Arduino Compiler Warung I2C Libary

Hallo zusammen,

leider bekomme ich beim kompilieren meines Arduino Sketches ein paar Warnungen:

In file included from C:\Users\simon\Desktop\Projekt Fitnessstudio\Arduino Code\gy521-read-angle_neu\gy521-read-angle_neu.ino:2:0:
C:\Users\simon\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.2\libraries\Wire/Wire.h: In function 'void loop()':
C:\Users\simon\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.2\libraries\Wire/Wire.h:71:13: note: candidate 1: uint8_t TwoWire::requestFrom(int, int, int)

  • uint8_t requestFrom(int, int, int);*
  • ^*
    C:\Users\simon\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.2\libraries\Wire/Wire.h:65:12: note: candidate 2: size_t TwoWire::requestFrom(uint8_t, size_t, bool)
  • size_t requestFrom(uint8_t address, size_t size, bool sendStop);*
  • ^*
    C:\Users\simon\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.2\libraries\Wire/Wire.h:71:13: note: candidate 1: uint8_t TwoWire::requestFrom(int, int, int)
  • uint8_t requestFrom(int, int, int);*
  • ^*
    C:\Users\simon\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.2\libraries\Wire/Wire.h:65:12: note: candidate 2: size_t TwoWire::requestFrom(uint8_t, size_t, bool)
  • size_t requestFrom(uint8_t address, size_t size, bool sendStop);*
  • ^*
    Der Sketch verwendet 269528 Bytes (26%) des Programmspeicherplatzes. Das Maximum sind 1023984 Bytes.
    Globale Variablen verwenden 27424 Bytes (33%) des dynamischen Speichers, 54496 Bytes für lokale Variablen verbleiben. Das Maximum sind 81920 Bytes.
    esptool.py v2.6
    2.6
    esptool.py v2.6
    Serial port COM4
    Connecting....
    Chip is ESP8266EX
    Features: WiFi
    MAC: 84:f3:eb:ee:4c:6e
    Uploading stub...
    Running stub...
    Stub running...
    Changing baud rate to 460800
    Changed.
    Configuring flash size...
    Auto-detected Flash size: 4MB
    Flash params set to 0x0340
    Compressed 273680 bytes to 199025...
    Writing at 0x00000000... (7 %)
    Writing at 0x00004000... (15 %)
    Writing at 0x00008000... (23 %)
    Writing at 0x0000c000... (30 %)
    Writing at 0x00010000... (38 %)
    Writing at 0x00014000... (46 %)
    Writing at 0x00018000... (53 %)
    Writing at 0x0001c000... (61 %)
    Writing at 0x00020000... (69 %)
    Writing at 0x00024000... (76 %)
    Writing at 0x00028000... (84 %)
    Writing at 0x0002c000... (92 %)
    Writing at 0x00030000... (100 %)
    Wrote 273680 bytes (199025 compressed) at 0x00000000 in 4.6 seconds (effective 478.0 kbit/s)...
    Hash of data verified.
    Leaving...
    Hard resetting via RTS pin...

Wenn ich mir nun die erste Warnung ansehe, steht dort als Hinweis "Wire.h:71". D.h. ich gehe in die Zeile 71 der Libary, wo der Aufbau der Funktion "requestFrom" beschrieben ist.

Aber wo ist nun der Fehler? Das Beispielprogramm habe ich in den Anhang gepackt.

gy521-read-angle_neu.ino (2.7 KB)

Aber wo ist nun der Fehler?

Dein Aufruf Wire.requestFrom(MPU6050_ADRESS, 7*2, true);  passt auf beide Deklarationen.

Mit const byte MPU6050_ADRESS = 0x68; anstelle der #define - Zeile wird es vielleicht besser ? Das Beispiel wurde evtl. nicht für einen ESP geschrieben...

michael_x:
Dein Aufruf Wire.requestFrom(MPU6050_ADRESS, 7*2, true);  passt auf beide Deklarationen.

Mit const byte MPU6050_ADRESS = 0x68; anstelle der #define - Zeile wird es vielleicht besser ? Das Beispiel wurde evtl. nicht für einen ESP geschrieben...

leider bleiben die Warnungen nach dem ersetzen der Zeile die gleichen.

Wie ist es denn möglich, den Aufruf auf eine Deklaration zu beschränken? Ich gehe mal nicht davon aus, dass die Datei wire.h angepasst werden muss.

Ich sehe gerade, dass dieses Thema schonmal disktutiert wurde:

https://forum.arduino.cc/index.php?topic=561464.0

Leider bleiben die Warnungen bei mir nach Anpassung der MPU_ADRESS auf den Datentyp"uint_t" weiter vorhanden...

Wie michael_x geschrieben, vermute ich, der Sketch ist nicht kompatibel zum ESP8266.

Hast du den denn schon mal für den Uno kompiliert ?

Habe den Fehler gefunden:

Die Methode "Wire.requestFrom" hat einen falschen Datentyp als 2. Argument erhalten.

Vorher:
Wire.requestFrom(MPU6050_ADRESS, 17*2, true);

So gehts:
const size_t registergroesse = 14;
Wire.requestFrom(MPU6050_ADRESS, registergroesse, true);

EDIT: Ich frage mich dennoch, wie dieses Beispielprogramm auf einem anderen Arduino ohne Warnungen funktioniert haben soll. Dieser Fehler hat ja nichts mit dem ESP8266 zutun, meiner Meinung nach.

Prima und danke für die Rückmeldung.

Eine Frage möchte ich hier noch stellen:

Am Ende meines Sketches steht "delay(100);".

Nun möchte ich aber nicht 10 Messwerte, sondern 100 Messwerte pro Sekunde aufnehmen.

Ändere ich es in "delay(10) ab, wird in der seriellen Konsole trotzdem nicht mehr an Daten rausgegeben.

Wodrann liegt das?

Bei 9600 Baud braucht 1 Zeichen ca. 1 ms. Nun zähle mal, wieviele Du ausgibst.
Setze die Baudrate hoch und gib nicht soviel Fülltext aus.

Gruß Tommy

Tommy56:
Bei 9600 Baud braucht 1 Zeichen ca. 1 ms. Nun zähle mal, wieviele Du ausgibst.
Setze die Baudrate hoch und gib nicht soviel Fülltext aus.

Gruß Tommy

Folgende Anpassung habe ich vorgenommen:

//Serial.begin(9600);
Serial.begin(19200);

Leider gibt der serielle Monitor dann nur noch Kauderwelsch aus :frowning:

Du musst auch den seriellen Monitor umstellen. Probier mal bei beiden mit 115200.

Gruß Tommy

Tommy56:
Du musst auch den seriellen Monitor umstellen. Probier mal bei beiden mit 115200.

Gruß Tommy

super, danke dir :slight_smile:

Hallo,

die Wire Lib ist etwas kaputt wenn man das vorsichtig sagen darf. Jedenfalls sind 2 Methoden drin die eben Mist machen und Warnungen erzeugen. Kommentiere diese in der .h und .cpp aus und Ruhe ist. Warum die überhaupt drin sind kann ich dir nicht sagen. Machen eh nur ein versteckten cast von int auf byte. Der Sinn erschließt sich mir nicht, weil das Vortäuschung falscher Tatsachen wäre.

.h
//uint8_t requestFrom(int, int);
//uint8_t requestFrom(int, int, int);

.cpp
/*
uint8_t TwoWire::requestFrom(int address, int quantity)
{
  return requestFrom((uint8_t)address, (uint8_t)quantity, (uint8_t)true);
}

uint8_t TwoWire::requestFrom(int address, int quantity, int sendStop)
{
  return requestFrom((uint8_t)address, (uint8_t)quantity, (uint8_t)sendStop);
}
*/

Gegen die anderen 3 Warnungen habe ich keine Lösung.

C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\src\utility\twi.c: In function '__vector_39':
C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\src\utility\twi.c:447:49: warning: this statement may fall through [-Wimplicit-fallthrough=]
  447 |       twi_masterBuffer[twi_masterBufferIndex++] = TWDR;
      |                                                 ^
C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\src\utility\twi.c:448:5: note: here
  448 |     case TW_MR_SLA_ACK:  // address sent, ack received
      |     ^~~~
C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\src\utility\twi.c:529:9: warning: this statement may fall through [-Wimplicit-fallthrough=]
  529 |       if(0 == twi_txBufferLength){
      |         ^
C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\src\utility\twi.c:534:5: note: here
  534 |     case TW_ST_DATA_ACK: // byte sent, ack returned

Dafür hat erst C++17 eine Lösung:
https://en.cppreference.com/w/cpp/language/attributes/fallthrough

Hallo,

jetzt wo du es sagst. Hatte ich doch letztens erst in einem Thread selbst verwendet, aber weil 99% der User hier kein C++17 verwenden können, ging das nach hinten los. combie meinte irgendwann einmal das mit der IDE 1.9 (derzeit beta) eine neue Compilerversion Standard ist. Sollte dann C++17 können.

Hallo,

habe das heute im Zuge der 1.8.10 Installation versucht mit [[falltrough]] zu fixen. Klappt nicht. Man handelt sich tausend neue Warnungen und Fehler ein. Möglicherweise liegst an den .c Files statt .cpp. Umbenennen hilft auch nicht. Man kommt vom Hunderten ins Tausende. "undefined reference" usw.
Die Wire ist .cpp
und die utility\twi ist .c

Standardmäßig bekommen 4 Warnungen.

C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\src\utility\twi.c: In function '__vector_39':
C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\src\utility\twi.c:447:49: warning: this statement may fall through [-Wimplicit-fallthrough=]
  447 |       twi_masterBuffer[twi_masterBufferIndex++] = TWDR;
      |                                                 ^
C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\src\utility\twi.c:449:5: note: here
  449 |     case TW_MR_SLA_ACK:  // address sent, ack received
      |     ^~~~
C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\src\utility\twi.c:530:9: warning: this statement may fall through [-Wimplicit-fallthrough=]
  530 |       if(0 == twi_txBufferLength){
      |         ^
C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\src\utility\twi.c:535:5: note: here
  535 |     case TW_ST_DATA_ACK: // byte sent, ack returned

Jetzt füge ich zwischen Zeile 447 und 448 ein

[[fallthrough]];		// hinzugefuegt

damit sollte die erste Warnung weg sein. Ne, man erhält

C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\src\utility\twi.c: In function '__vector_39':
C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\src\utility\twi.c:448:4: error: expected expression before '[' token
  448 |    [[fallthrough]];  // hinzugefuegt
      |    ^
C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\src\utility\twi.c:448:6: error: 'fallthrough' undeclared (first use in this function)
  448 |    [[fallthrough]];  // hinzugefuegt
      |      ^~~~~~~~~~~
C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\src\utility\twi.c:448:6: note: each undeclared identifier is reported only once for each function it appears in
C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\src\utility\twi.c:447:49: warning: this statement may fall through [-Wimplicit-fallthrough=]
  447 |       twi_masterBuffer[twi_masterBufferIndex++] = TWDR;
      |                                                 ^
C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\src\utility\twi.c:449:5: note: here
  449 |     case TW_MR_SLA_ACK:  // address sent, ack received
      |     ^~~~
C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\src\utility\twi.c:530:9: warning: this statement may fall through [-Wimplicit-fallthrough=]
  530 |       if(0 == twi_txBufferLength){
      |         ^
C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\src\utility\twi.c:535:5: note: here
  535 |     case TW_ST_DATA_ACK: // byte sent, ack returned
      |     ^~~~
Mehrere Bibliotheken wurden für "docINA233.h" gefunden
 Benutzt: C:\Users\Doc\Documents\Arduino\libraries\docINA233
Mehrere Bibliotheken wurden für "Wire.h" gefunden
 Benutzt: C:\Program

Verstehe ich nicht. Als wenn er vor fallthrough warnen möchte aber es das Attribut nicht kennt bzw. erkennt.

habe das heute im Zuge der 1.8.10 Installation versucht mit [[falltrough]] zu fixen. Klappt nicht.

Da gibts eine GCC Spezialität, welche alle anderen Compiler wenigstens tolerieren können, auch wenn sie es nicht verstehen:
Versuche mal statt [[fallthrough]] dieses /* fall through */
(ist ja schließlich C und nicht C++, also ist die C++ Doku nicht anwendbar)

twi.c (17 KB)

Hallo,

wie kommt man denn darauf? :slight_smile:
Der Kommentar /* fall trough */ hilft. Jetzt ist Ruhe. Vielen Dank.
Jetzt werden schon Kommentare verarbeitet. Verrückte Welt.

Doc_Arduino:
Hallo,

wie kommt man denn darauf? :slight_smile:
Der Kommentar /* fall trough */ hilft. Jetzt ist Ruhe. Vielen Dank.
Jetzt werden schon Kommentare verarbeitet. Verrückte Welt.

Durch Problem haben und dann unter Zuhilfenahme von Google einkreisen.
Dann stößt man u.U. auf sowas https://developers.redhat.com/blog/2017/03/10/wimplicit-fallthrough-in-gcc-7/