Forum: Mikrocontroller und Digitale Elektronik Arduino wire Lib liest nur 32 Bytes mit I2C


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Christian S. (solder)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe das gleiche Problem wie in diesem Thread

Beitrag "Arduino TWI mehr als 32 Byte"

Leider gab's damals keine Lösung. Gibt es inzwischen eine, wie ich mehr 
als 32 Bytes einlesen kann? Ich habe einen Touchcontroller, dessen 
Buffer 66 Bytes groß ist und der in einem Durchgang gelesen werden muss, 
damit die INT-Leitung wieder H wird. Laut Logic Analyzer funktioniert 
das Lesen der Werte soweit, nur ist nach 32 Bytes Schluss. Da INT dann 
low bleibt, fängt er beim neuen Auslesen wieder von vorn an usw.
1
void loop() {
2
  
3
  char c1[70];
4
5
  while (digitalRead(intPin)==HIGH) {
6
  }
7
  Serial.println("INT");
8
9
  Wire.requestFrom(0x2a,66);
10
11
  int cnt=0;
12
  
13
  while (Wire.available())
14
  {
15
      c1[cnt] = Wire.read();
16
      cnt++;
17
  }
18
}

von Mick (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich mach das jetzt ungern, weil ich damals bei demselben Problem sehr 
viel Zeit benötigt habe ;-)

Aber hier die Lösung:
 *              #define BUFFER_LENGTH 66 in Wire.h!!
 *              #define TWI_BUFFER_LENGTH 66 in Wire\utility\twi.h!!

von Jim M. (turboj)


Bewertung
0 lesenswert
nicht lesenswert
Hartes Limit in Wire.h ist 32 Bytes - das müsste man ändern und dann neu 
kompilieren, keine Ahnung wie kompliziert sich das bei Arduino Libs 
macht.

Oder man implementiert I²C halt zu Fuß. Hausaufgabe: Raussuchen was 
einfacher ist...


Edit: Zu langsam ;-)

: Bearbeitet durch User
von Patrick J. (ho-bit-hun-ter)


Bewertung
0 lesenswert
nicht lesenswert
Hi

Christian S. schrieb:
> Wire.requestFrom(0x2a,66);

Mick schrieb:
> *              #define BUFFER_LENGTH 66 in Wire.h!!
>  *              #define TWI_BUFFER_LENGTH 66 in Wire\utility\twi.h!!

Dann taugt die LIB aber nicht sonderlich viel!
Wenn schon die Anzahl der zu lesenden Bytes übergeben wird, ist es doch 
ein Leichtes, eine Fehlermeldung zu generieren, wenn der Puffer nicht 
ausreichend ist.

Von der anderen Seite aus gesehen:
Wenn ich eh nur z.B. 5 Byte brauche, belegt die LIB (2x ??) 61 Byte 
unnützen Speicher, Der niemals gebraucht wird? ... dann nutzen sich die 
Speicherzellen auch nicht so ab ...

... fehlen nur noch Mehrkern-µC ... Speicherplatz ist ja heute kein 
Kriterium.

MfG

von Christian S. (solder)


Bewertung
0 lesenswert
nicht lesenswert
@Mick,

vielen Dank. Es funktioniert jetzt. Habe lieber ein paar Bytes mehr 
reserviert. Ich war nicht sicher, ob das mit den 66 Bytes nach 
Datenblatt stimmt, da der Anfang auch schon etwas abweichend zum 
beschriebenen Protokoll war.

@Jim Meba

Ist mein erstes Arduino-Projekt auf dem AVR. Hab's bisher immer in 
Assembler gemacht. Da könnte ich auch I2C, aber ich dachte, mit C++ 
geht's doch etwas komfortabler und schneller, zumal ich die Daten ja 
auch noch auswerten will. War kurz davor, zu Assembler zu wechseln.

@Patrick J.

Sehe ich auch so. Die Lib ist doch schon alt, offensichtlich hat das 
bisher keinen gestört. Damit kann man auch keine EEPROMs mit größerer 
Page in einem Rutsch laden...

von Jim M. (turboj)


Bewertung
0 lesenswert
nicht lesenswert
Patrick J. schrieb:
> Wenn schon die Anzahl der zu lesenden Bytes übergeben wird, ist es doch
> ein Leichtes, eine Fehlermeldung zu generieren, wenn der Puffer nicht
> ausreichend ist.

Auf einem µC, wo es keine standadisierte Ausgabemöglichkeit gibt?
Könnte dann doch etwas komplizierter sein...

von Εrnst B. (ernst)


Bewertung
0 lesenswert
nicht lesenswert
Jim M. schrieb:
> Auf einem µC, wo es keine standadisierte Ausgabemöglichkeit gibt?
> Könnte dann doch etwas komplizierter sein...

Ist doch C++ ... mit ein bischen Template-Magie kriegt man das 
Wire.requestFrom sicher so hin, dass es einen Compile-Time-Fehler bei 
Überschreiten der Buffersize gibt.

von Christian S. (solder)


Bewertung
0 lesenswert
nicht lesenswert
Kann man so eine Lib nicht so bauen, dass man bei wire.begin die 
benötigte Buffergröße mit angibt oder irgendwie anders deklariert? Zumal 
diese 32 Byte Begrenzung nicht beschrieben ist. (Ich habe es in der 
wire-Beschreibung im Internet jedenfalls nicht gesehen.) Man wundert 
sich nur, warum der eigene Code nicht funktioniert und eigentlich auch 
nur, weil ich erst mal ganz primitiv versucht habe, nur diese 66 Bytes 
zu lesen und noch gar nichts auszuwerten.

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
Üblicherweise schreibt man eine solche Funktion so, daß der Aufrufer 
einen Zeiger auf einen Puffer entsprechender Größe übergibt, z.B. bei 
sprintf.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.