seriell in char Array

Hallo,
ich hatte ja gedacht, das ich es kapiert habe- aber nichts…
ich bekomme es nicht hin.

Ich sende auf diese Weise “float” mit Vorzeichen.

EXcT = -5.9; 
         EXcTST = EXcT ;
    char NexEXcTST[15];
    dtostrf(EXcTST, 0, 1, NexEXcTST);
    Serial3.print(NexEXcTST);
    Serial3.print('\n');
    delay(50);

auf der anderen Seite empfange ich auf diese Weise

    if (c >= 32 && index < SERIAL_BUFFER_SIZE - 1)
    {
      serialBuffer[index++] = c;
Serial.print(c);
    }
    else if ((c == '\n' || c == '\r') && index > 0)
    {
      serialBuffer[index] = '\0';

Serial.print(c); gibt auf dem Seriellen Monitor dieses aus

20.30
27.60
-5.90
55.80

diese Werte benötige ich als “unsigned char Wert
Ich habe schon einiges probiert, aber es ist nichts bei mir zu machen.
Vielleicht könnte mir ja mal jemand behilflich sein.
Gruß und Dank dafür
Andreas

atof() (ascii to float)

Wo ist da das Problem? Lerne was es an Konvertierungsfunktionen gibt

Sender vereinfacht (ungetestet):

EXcT = -5.9;
    Serial3.print(EXcT, 2);
    Serial3.print('\n');
    delay(50);

SkobyMobil:
diese Werte benötige ich als “unsigned char Wert

Der Prozessor zwischen meinen Ohren würde genau dies in serialBuffer vermuten.

Was ist das Ergebnis hiervon?

Serial.println(serialBuffer);

Habe ich die Frage falsch verstanden?

Hallo,

wenn mich nicht alles täuscht, dann kann atof() keine Vorzeichen.
-5.9 ist aber Vorzeichen behaftet.

Es kommt ja alles richtig beim Empfänger an, nur bekomme ich es nicht
in ein "unsigned char Wert".

Da muß es doch etwas einfaches geben?
Gruß und Dank
Andreas

Quote Andreas:
"diese Werte benötige ich als "unsigned char Wert"

auf der Empfänger-Seite

Wieso soll das keine Vorzeichen können? :confused:
http://www.cplusplus.com/reference/cstdlib/atof/

nur bekomme ich es nicht in ein “unsigned char Wert”.

Und wieso soll das in ein unsigned char Array? Hier unterschlägst du Informationen was du eigentlichen machen willst. ASCII Zeichen sind char. Nicht unsigned char.

Aber du sagst nicht was dein Array darstellen soll. Dann kann man nur raten

Das geht problemlos:

const int SERIAL_BUFFER_SIZE = 21;
char serialBuffer[SERIAL_BUFFER_SIZE];

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

void loop()
{
  if (readSerial(Serial))
    parseSerial();
}

void parseSerial()
{
  Serial.print("Empfangen: "); Serial.println(serialBuffer);
  Serial.print("Konvertiert: "); Serial.println(atof(serialBuffer));
  Serial.println();
}


bool readSerial(Stream& stream)
{
  static byte index;

  while (stream.available())
  {
    char c = stream.read();

    if (c == '\n' && index > 0)
    {
      serialBuffer[index] = '\0';
      index = 0;
      return true;
    }
    else if (c >= 32 && index < SERIAL_BUFFER_SIZE - 1)
    {
      serialBuffer[index++] = c;
    }
  }
  return false;
}

Hallo,
"Was ist das Ergebnis hiervon?"

Serial.println(serialBuffer);

Ergebnis:
2
20
20.
20.3
0
0
20.3
27.3
27.3
27.6
0
0
-7.6
-5.6
-5.6
-5.9
0
0
55.9
55.9
55.9
55.8
0
0

Gruß und Dank
Andreas

SkobyMobil:
Ergebnis:

Das ist doch genau, was Du haben möchtest. Es würde hübscher aussehen, wenn Du serialBuffer löschen würdest. Außerdem brauchst Du die Ausgabe nur, wenn CR oder LF erkannt wurden.

Hallo,
dafür wird es benötigt:

 unsigned char text1[] = {"-29.1"};
 unsigned char text2[] = {"29.2"};
  command(0x01);
  int i;
  command(0xA0); 
  delay(2)
  for(i=0;i<5;i++)
  {
    data(text1[i]); hier wird text1 ins Display geschrieben
  }

Gruß und Spaß
Andreas

Hallo,
es ist, was ich haben will...

aber es muß hier rein:

   data(MEIN WERT[i]); hier wird text1 ins Display geschrieben

Gruß und Spaß
Andreas

Ich spekuliere mal:

  delay(2)
    data(text1);

Wenn data eine Funktion ist, übergibt man einen Zeiger der Zeichenkette, um diese anzuzeigen. Methoden (?) wie print akzeptieren nullterminierte Zeichenketten.

Hallo,
ja eine Funktion…

void command(unsigned char c)
{
  digitalWrite(CS, LOW);
  PORTA = c;
  digitalWrite(DC, LOW);
  digitalWrite(E, HIGH);
  delayMicroseconds(10);
  digitalWrite(E, LOW);
  digitalWrite(CS, HIGH);
}


void data(unsigned char d)
{
  digitalWrite(CS, LOW);
  PORTA = d;
  digitalWrite(DC, HIGH);
  digitalWrite(E, HIGH);
  delayMicroseconds(10);    
  digitalWrite(E, LOW);
  digitalWrite(CS, HIGH);
}

und dann

 command(0x01);    // clear display and set DDRAM address to line 1 position 1
  delay(2);
 // 2ms delay (required after clear display command)

 command(0xA0);    // set DDRAM address to line 2 position 1
  for(i=0;i<10;i++)
  {
    data(text1[i]);
  }

Und für dieses “text1” hätte ich gerne meine Werte.
Gruß und Spaß
Andreas

Hallo,
denken hilft, die Sache ist ganz einfach...
Dieses "Text1" ist doch nichts weiter als ein CharArray.
Das muß man doch nur füllen und trickreich auszählen.
Im Groben funktioniert es jetzt.
Also, vielen Dank für Eure Hilfe.
Gruß und Spaß
Andreas

Hallo,
also- es ist tatsächlich so einfach. Man muß beim Empfangen nur ein CharArray füllen.
Das wird bei der Ausgabe dann ausgezählt.
Der Drops ist gelutscht.
Danke schön.
Gruß und Spaß
Andreas