Forum: Compiler & IDEs Uart string einlesen und speichern


von Hajo (Gast)


Lesenswert?

Mein ziel ist es von einem Temperatur-Modul am Modul hängen 16 DS18S20,
die Temperaturwerte werden 3stellig ausgegeben plus vorzeichen zb. + 
16.3
Diese werte wollte ich nun über Uart einlesen und in einem Pointer 
speichern nur weiss ich noch nicht wie bin in C noch nicht so vielleicht 
kann mir von euch jemand ein kleinwenig hilfestellung geben.
Als Controller hab ich ein Atmega128
mfg

von Walter S. (avatar)


Lesenswert?

ernstgemeinte Frage:
ist Deutsch für dich eine Fremdsprache?

von Klaus W. (mfgkw)


Lesenswert?

Vorschlag:
- mit ganzen Sätzen anfangen, bei deinem Text springen mir ja die 
Frösche aus dem Teich
- C lernen (geht am PC einfacher)
- dann wieder mit MC anfangen

von Hajo (Gast)


Lesenswert?

so ich habs jetzt mal so versucht aber ich bekomme keine Anzeige auf 
meinem LCD.

die Werte die vom Temperatu-Modul kommen sehen so aus +243 13
die 13 Bedeutet ende der Übertragung.


1
 for (;;)
2
 {
3
   c = uart_getc();
4
   if( c != UART_NO_DATA )
5
   {
6
      // Lese solange, bis von der anderen Seite die
7
      // Return Taste betätigt wurde.
8
      while( c != 13 )
9
      {
10
         if( c != UART_NO_DATA ) {
11
           Eingabe[Count++] = c;
12
           c = uart_getc();
13
         }
14
      }
15
 
16
      Eingabe[Count] = '\0';
17
18
        uart_puts( "Temperatur" );
19
      uart_puts( Eingabe );
20
     uart_puts( "  " );   
21
22
   }
23
 }

von Klaus W. (mfgkw)


Lesenswert?

Hajo schrieb:
> so ich habs jetzt mal so versucht aber ich bekomme keine Anzeige auf
> meinem LCD.

Dann fange doch mal damit an; es gibt hier viel Info zu etlichen 
LCD-Typen.
Wenn dann die Ausgabe klappt, geht es mit dem nächsten Punkt weiter.

von Hajo (Gast)


Lesenswert?

Der  Text wird mir Angezeigt bloß nicht die zahlen die in Eingabe drin 
sind

von Hajo (Gast)


Lesenswert?

ich bekomme leider nur diese Ausgabe  000 Temperatur

1
  char Eingabe[50];
2
  int Count;
3
   
4
  uint8_t i = 0;
5
  char s[7];
6
  char g;
7
8
9
10
 for (;;)
11
 {
12
13
14
    uart_puts( "Temperatur" );
15
16
    uart_puts( "  " );   
17
18
19
  
20
          {
21
22
            do
23
             {
24
                 c = uart_getc();        //Daten lesen
25
                 Eingabe[Count++] = c;
26
            }
27
              while ((c != 13));
28
29
30
31
     }
32
 
33
   
34
    for(i=0; i<6; i++)
35
     {
36
      g = Eingabe[i++]; 
37
    itoa( g, s, 10 ); // 10 fuer radix -> Dezimalsystem
38
      uart_puts( s );   
39
     }                            
40
   }  
41
}

von Klaus W. (mfgkw)


Lesenswert?

Schon beim ersten Drüberlesen sieht man etliche Fehler, mit denen nichts 
klappen kann:
- Count wird weder intialisiert, noch jemals wieder zu 0 zurückgesetzt.
  Trotzdem wird es stetig erhöht und als Index verwendet.
- Du nimmst aus dem Feld mit den gelesenen Zeichen (!) jeweils eines
  und versuchst es in einen String zu wandlen.
  Aber es sind doch schon ASCII-Zeichen, oder nicht?
- in der letzten Schleife wird i jeweils zweimal erhöht
- da Count irgendeinen lustigen Wert hat, wird in der letzten
  Schleife kaum das gelesen, was vorher über Count gespeichert wurde

Willst du nicht vielleicht doch erst am PC erst mal die C-Grundlagen 
lernen?

von Hajo (Gast)


Lesenswert?

Leider bekomme ich nach den Änderungen immer noch 000 Temperatur 
angezeigt.

Leider schaffe ich es nicht die Tempwerte Auszugeben deshalb hab ich 
hier im Forum Nachgefragt.

Bei der datenausgabe vom Temp-Modul hab ich wohl etwas vergessen,
hier nun das Korrekte Ausgabe Format.
Sensornummer 1-16
0
1

Temperatur 2stellig vorm Komma
23

Vorzeichen + für Plusgrade Leerzeichen für Minusgrade
+

Nachkommastelle 1stellig
5

Übertragung beendet
13

1
  char Eingabe[50];
2
  int Count;
3
   
4
  uint8_t i = 0;
5
  char s[7];
6
  char g;
7
8
9
10
 for (;;)
11
 {
12
13
   Count=0;
14
    uart_puts( "Temperatur" );
15
16
    uart_puts( "  " );   
17
18
19
  
20
          {
21
22
            do
23
             {
24
                 c = uart_getc();        //Daten lesen
25
                 Eingabe[Count++] = c;
26
            }
27
              while ((c != 13));
28
29
30
31
     }
32
 
33
   
34
    for(i=0; i<6; i++)
35
     {
36
      g = Eingabe[i]; 
37
      itoa( g, s, 10 ); // 10 fuer radix -> Dezimalsystem
38
      uart_puts( s );   
39
     }                            
40
   }  
41
}

von Klaus W. (mfgkw)


Lesenswert?

- jetzt fragst du nicht mal mehr ab, ob das Lesen von UART geklappt hat
  (ich vermute, daß es nötig ist, kenne aber deine uart_...-Lib nicht)
- du liest bis 13, egal wieviele Zeichen es sind und egal ob es noch
  in den Puffer passt
- egal wieviele Zeichen du gelesen hast, du wandelst immer 6 Zeichen
  zur Ausgabe.
- wenn das erste gelesene Zeichen nicht am Anfang des Datensatzes 
beginnt,
  merkst du das gar nicht und gibst trotzdem 6 Zeichen wieder aus
- alleine deshalb mag ich deine angebliche Ausgabe "000 Temperatur"
  nicht glauben, erwarten würde ich zumindest "Temperatur   000000"

Wenn du so weiter programmierst, wird das heute nacht noch richtig 
krachen!

Irgendwie macht es auch keinen richtigen Spaß, wenn du kaum Info 
lieferst, das auch nur stückweise, den Fehler nicht beschreiben kannst, 
keine minimalen Grundlagen lernen willst, und die Fragen nur unleserlich 
hinrotzt.

Trotzdem guten Rutsch!

von Hajo (Gast)


Lesenswert?

Die Gelesene Zeichenlänge ist doch Begrenzt ,6 Zeichen, die 13 sagt dann 
Ende der Übertragung.
Dann lese ich die 6 Zeichen wieder aus.
Ich bin nun mal kein C-Profi,deshalb stellte ich ja auch hier im Forum 
meine Frage weil ich das alleine nicht hinbekomme.

von Hajo (Gast)


Lesenswert?

kann mir denn niemand ein kleines Stück weiterhelfen damit ich die 
Tempwerte ausgeben kann

von Klaus W. (mfgkw)


Lesenswert?

Achtung, Multithreading:
Beitrag "String ein ausgeben"

:-)

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.