[erledigt] Wire-Frage zu requestFrom/onRequest

Hallo allerseits!

Ich brech’ mir schier einen ab beim Schreiben dieser Anleitung.

Beim Querlesen ist mir nun eine (vermeintliche?) Ungereimtheit aufgefallen:

Wenn man per requestFrom() Daten anfordert, gibt man an, wieviele Bytes man haben möchte. Diese Anzahl wird in der Funktion, die man mit onRequest() festlegt, aber nicht verwendet. Wozu gibt man diese Anzahl bei requestFrom() dann überhaupt an?

Auf die bevorstehende Erleuchtung freut sich

Gregor

Hallo zurück!

Die Anzahl Bytes die der Master bei requestFrom() angibt wird dem Slave nicht direkt mitgeteilt. Die Anweisung:

Wire.requestFrom(8, 5)

bedeutet nicht: "Teile I2C Teilnehmer #8 mit dass ich gerne 5 Bytes hätte" - sondern: "Teile I2C Teilnehmer #8 mit, dass er jetzt Daten auf dem Bus schicken darf. Sobald ich 5 Bytes empfangen habe sende ich ein Stop-Signal und zwinge Teilnehmer #8 dazu den Bus freizugeben."

Daher macht es auch Sinn im onRequest handler Wire.available() abzufragen - das ist nämlich "false" nachdem der Master das letzte Byte dass er haben wollte bekommen hat.

Theoretisch weiss der Slave also erst nachdem er die Daten geschickt hast wieviele Bytes eigentlich verlangt wurden - nämlich dann, wenn ihm nach dem letzten Byte dass der Master haben wollte quasi die 'Redeberechtigung' entzogen wird auf dem Bus.

Wenn Du das zwingend vorher wissen musst kannst Du ja, bevor du ein requestFrom() aufrufst, ein beginTransmission() machen und dem Teilnehmer mitteilen wieviele Bytes Du in der nächsten Abfrage möchtest.

~Luchs

Luchs: ... Wenn Du das zwingend vorher wissen musst ...

Nein, muss ich nicht. Mir war nur nicht klar, wie diese Kommunikation abläuft.

Vielen Dank für Deine Erläuterung!

Gruß

Gregor

Noch eine ganz große Gemeinheit die nicht dabei steht:

Du kannst in onRequest() nur einmal write() machen! Das heißt wenn man mehrere Variablen schicken will, muss man die erst mal in ein temporäres Array verpacken.

Serenifly: Noch eine ganz große Gemeinheit die nicht dabei steht ...

Ach du schei*e.

Gut, dass ich momentan noch mit Temperatursensoren spiele und mir die Wire-Testerei für heute Abend aufgehoben habe.

Wahrscheinlich schlage ich dann mit weiteren Fragen hier auf.

Danke!

Gregor

Was man natürlich auch machen kann ist die Daten in eine union aus verschiedenen Variablen und einem Array zu packen. Dann kann man sie auf beide Arten ansprechen. Das ist vielleicht das vernünftigste.