Forum: Mikrocontroller und Digitale Elektronik i2c Übertragung fehlerhaft. (falsche Codierung )


von DAVID B. (bastler-david)


Lesenswert?

Hallo
Da ein arduino nano leider nicht genug pins und speicher für mein 
vorhaben hat sehe ich mich genötigt mein Projekt auf 2 zu verteilen mit 
i2c.
aber erstmal klein anfangen.

master

#include <Wire.h>
byte Speichersenden = 0;

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

void loop(void)
{
  int sensorValue = analogRead(A0);
  float voltage = sensorValue * (4.7 / 1023.0);
  Speichersenden = voltage;

  Wire.beginTransmission(4);
  Wire.write("123,45678910 ");
  Wire.write(" ");
  Wire.write("test ");
  Wire.write(" ");
  Wire.write(Speichersenden);
  Wire.write(" ");
  Wire.write("test ende ");
  Wire.endTransmission(4);
  delay(1000);
}

-----------------------------------------------------------------------
reciver

#include <Wire.h>
void setup()
{
  Wire.begin(4);                // join i2c bus with address #8
  Wire.onReceive(receiveEvent); // register event
  Serial.begin(9600);           // start serial for output
}

void loop()
{
  delay(2000);
}

void receiveEvent(int anzahl)
{
  while (1 < Wire.available()) { // loop through all but the last
    char c = Wire.read(); // receive byte as a character
    Serial.print(c);         // print the character
  }
  int x = Wire.read();    // receive byte as an integer
  Serial.println(" ");         // print the integer
}


Alles was ich aber zusehen bekommen am ende ist:
123,45678910  test []test ende
123,45678910  test []test ende
..........

Das i2c mit der arduino IDE nur int übertragen kann weis ich schon aber 
die ersten zahlen werden ja auch MIT Komma übertragen ?

wenn ich zum senden aber
Wire.write((byte)(Speichersenden));
nutze wird immerhin die erste zahl vor dem Komma übertragen dann aber 
die Übertragung abgebrochen.

Wäre über Hilfe Sehr Dankbar.

: Verschoben durch User
von PittyJ (Gast)


Lesenswert?

Sind das nicht String und keine Zahlen?
Ein String, zufällig nur Ziffern und ein Komma enthält?

von DAVID B. (bastler-david)


Lesenswert?

Ein String habe ich schon mehrfach versucht zusenden kann aber nicht 
übersetzt und hochgeladen werden falls du das meinst?

von Kaj (Gast)


Lesenswert?

DAVID -. schrieb:
> die ersten zahlen werden ja auch MIT Komma übertragen
1
Wire.write("123,45678910 ");
Das ist keine Zahl, das ist ein String.

DAVID -. schrieb:
> wenn ich zum senden aber
> Wire.write((byte)(Speichersenden));
> nutze wird immerhin die erste zahl vor dem Komma übertragen dann aber
> die Übertragung abgebrochen.
Ach was.
Du machst aus einem float (4 byte) einen ein byte (1 byte) wert. 
Natuerlich geht da was verloren.

Dir fehlen die absoluten Grundlagen von C/C++.

DAVID -. schrieb:
> Wäre über Hilfe Sehr Dankbar.
Buecher zu C/C++ lesen und die Beispiele durcharbeiten. Das ist die 
beste Hilfe. Hilfe zur selbsthilfe.


DAVID -. schrieb:
> Ein String habe ich schon mehrfach versucht zusenden kann aber nicht
> übersetzt und hochgeladen werden falls du das meinst?
Kann ja nicht sein. Dein Code oben compiliert doch oder etwa nicht? Wenn 
nicht, wo hast du dann die Ausgaben her?



https://www.arduino.cc/en/Reference/WireWrite
1
write()
2
Description
3
4
Writes data from a slave device in response to a request from a master,
5
or queues bytes for transmission from a master to slave device
6
(in-between calls to beginTransmission() and endTransmission()). 
7
8
9
Syntax
10
11
Wire.write(value)
12
Wire.write(string)
13
Wire.write(data, length)
14
15
16
Parameters
17
18
value: a value to send as a single byte
19
string: a string to send as a series of bytes
20
data: an array of data to send as bytes
21
length: the number of bytes to transmit

von DAVID B. (bastler-david)


Lesenswert?

Kaj schrieb:
> Das ist keine Zahl, das ist ein String.

Ah ok das erklärt es wenigstens.
und das mit 1 und 4 Byte leuchtet mir jetzt auch ein.

Wenn ich es aber mit
String Speichersenden = 0;
Wire.write(String)(Speichersenden);

Versuche dann kommt beim übersetzten als ergebniss raus:
conversion from 'int' to 'String' is ambiguous
Umwandlung von 'int' in 'String' ist mehrdeutig

Nur verwende ich doch kein int mehr das wird ja nur zum einlesen der 
Daten genutzt?

Wenn ich mir aber die Seite übersetzten lassen und:
Wire.write (Daten, Länge) sowie Data: ein Array von Daten,
die als Byte gesendet werden sollen Length: die Anzahl der zu sendenden 
Bytes.

würde ich sagen hat damit was zutun ABER woher soll die IDE wissen wann 
genau die Übertragung zu ende ist (wenn keine Daten mehr da sind ist 
ende?)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die IDE? Die hat damit nichts zu tun.

Und das Übertragungsende ist eindeutig - wenn die Anzahl der Bytes 
gesendet wurde, die Du beim Aufruf im zweiten Parameter angegeben hast.

Mit

Wire.write(data, 5);

beispielsweise sind das fünf (5) Bytes.

von Peter D. (peda)


Lesenswert?

DAVID -. schrieb:
> Da ein arduino nano leider nicht genug pins und speicher für mein
> vorhaben hat sehe ich mich genötigt mein Projekt auf 2 zu verteilen mit
> i2c.

Damit kommt man als Anfänger vom Regen in die Traufe.
Fragt mal erfahrene Programmierer, ne 2. CPU fassen die nur mit ner 
Kneifzange an. Da muß es schon ernsthaftere Gründe für geben.

Für Pinerweiterung gibt es bewährte Lösungen SPI (74HC165/74HC595) oder 
I2C (PCF8574/A).

Und fürs RAM sparen kann man überlegen, ob es immer gleich 2 Bytes sein 
müssen (int) und ein Byte (uint8_t) nicht schon reicht.
Auch sollte man sparsam mit globalen Variablen sein, lokale Variablen 
kann der Compiler viel besser optimieren. Und die maximale Größe von 
Arrays kann man berechnen und muß da keine Fantasiegrößen reservieren.

Um Flash zu sparen nimmt man Unterfunktionen und Schleifen. 
Flash-Fresser sind nur die unwartbaren Copy&Paste-Monster.

von Georg G. (df2au)


Lesenswert?

DAVID -. schrieb:
> Wenn ich es aber mit
> String Speichersenden = 0;
> Wire.write(String)(Speichersenden);
>
> Versuche dann kommt beim übersetzten als ergebniss raus:
> conversion from 'int' to 'String' is ambiguous
> Umwandlung von 'int' in 'String' ist mehrdeutig

Ein String wird immer mit "" eingerahmt. Deiner Definition
> String Speichersenden = 0;
entspricht die Aussage "Die Farbe des Autos ist 100PS"
Versuch es mal mit
> String Speichersenden = "0";
Dann klappt es auch mit dem Nachbarn :-)

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.