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


von Christian S. (solder)


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)


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)


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)


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)


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)


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)


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)


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)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.