i2c Übertragung fehlerhaft. (falsche Codierung )

#4881176
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.
Gast #4881297
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
#4881524
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?)
#4881578
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.
#4881598
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 :-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren