ASCII einlesen für Port

Gast #2361339
Lesenswert?
• ▲
▼
Liebe Kollegen!

Ich habe (schon wieder) ein Problem.

Ich möchte über die RS232 24-Bit einlesen und an 2 Ports senden.

Das einlesen funktioniert (habe einen Echo Test gemacht). Ich habe auch 
eine for-Schleife gemacht damit das Unterprogramm genau 3 Werte 
einliest.
1
void set_DAC(void)
2
{
3
   int DAC_value=0;
4
   int j=0;
5
   
6
   text="\r\nEnter Value (e.g. fff)";
7
   if (men==1)SendUSART1(text); //Ausgabe nur wenn Menü eingeschaltet ist
8
   for (j=0;j<3;j++)
9
     {while (!(IFG2 & URXIFG1));
10
      DAC_value=RXBUF1<<j;
11
     }
12
   WR_DAC(DAC_value,0x000);
13
   text="\r\nBeam me up, Scotty";
14
   if (men==1)SendUSART1(text);
15
}


Leider habe ich Probleme mit den Werten. Muss ich die vorher 
konvertieren? Also die Werte 0 bis 9 minus 30 und A bis F minus 51?
Gibt es da eine Funktion?
???

DANKE für Eure Hilfe

Bussi Sandy
Gast #2361355
Lesenswert?
• ▲
▼
Weil die Eingabe durch einen Benutzer (Irrungen & Wirrungen) erfolgt, 
würde ich auch eine Plausibilitätsprüfung machen und nicht die 
ungeprüfte Eingabe direkt an die DAC senden.

Geprüft werden könnte, dass
# nur Hexadezimale Zeichen eingegeben wurden (0-9A-Fa-f)
# genau sechs Zeichen eingegeben wurden
Gast #2361432
Lesenswert?
• ▲
▼
Wenn ich die Irrungen mal weglasse würde ich das eingeben
1
void set_DAC(void)
2
{
3
   int DAC_value=0;
4
   int j=0;
5
   
6
   text="\r\nEnter Value (e.g. fff)";
7
   if (men==1)SendUSART1(text);
8
   for (j=0;j<3;j++)
9
     {while (!(IFG2 & URXIFG1));
10
      if (RXBUF1<0x60) DAC_value=RXBUF1-30;
11
      else DAC_value=RXBUF1-51;
12
      DAC_value=DAC_value<<j;
13
     }
14
   WR_DAC(DAC_value,0x000);
15
   text="\r\nBeam me up, Scotty";
16
   if (men==1)SendUSART1(text);
17
}

da kommt aber beim DAC nicht das richtige an.

???
#2361459
Lesenswert?
• ▲
▼
Du kriegst von mir einen Preis für den unverständlichsten und am 
schlechtesten auf Korrektheit prüfbaren Code.

Was ist so schwer daran, sich für eine Standard-Aufgabe eine 
Standardfunktion zu schreiben. Da kann man dann auch gleich noch ein 
paar Sonderfälle (Groß/Kleinbuchstaben) abfangen und zumindest 
rudimentäres Fehlerchecking betreiben
1
uint8_t toValue( char c )
2
{
3
  if( isdigit( c ) )
4
    return c - '0';
5

6
  if( c >= 'a' && c <= 'f' )
7
    return c - 'a' + 10;
8

9
  if( c >= 'A' && c <= 'F' )
10
    return c - 'A' + 10;
11

12
  return 0;
13
}
14

15
char uart_getc()
16
{
17
  while (!(IFG2 & URXIFG1))
18
    ;
19
  return RXBUF1;
20
}
21

22
void set_DAC(void)
23
{
24
   unsigned int DAC_value = 0;
25
   int j=0;
26
   
27
   if (men == 1)
28
     SendUSART1( "\r\nEnter Value (e.g. fff)" );
29

30
   for (j = 0; j < 3; j++)
31
   {
32
     DAC_value = (DAC_value << 8) | toValue( uart_getc() );
33
   }
34

35
   {  // Debughilfe
36
     char buffer[20];
37
     sprintf( buffer, "\r\nSetting DAC to 0x%04x", (int)DAC_value );
38
     SendUSART1( buffer );
39
   }
40

41
   WR_DAC( DAC_value, 0x000 );
42

43
   if (men==1)
44
     SendUSART1( "\r\nBeam me up, Scotty" );
45
}

Wo liegt das Problem bei ein bischen Code-Arbeit? Zu lesbar? Nicht 
kryptisch genug?
#2361492
Lesenswert?
• ▲
▼
Einer der Hauptgründe, warum beim DAC nicht das Richtige ankam:

Sandra schrieb:
> if (RXBUF1<0x60) DAC_value=RXBUF1-30;
>       else DAC_value=RXBUF1-51;
>       DAC_value=DAC_value<<j;

Das Zusammensetzen des Wertes ist nicht korrekt. Ohne es jetzt weiter 
aufzudrösseln gehe ich auf den Vorschlag von Karl Heinz ein:

Karl Heinz Buchegger schrieb:
> for (j = 0; j < 3; j++)
>    {
>      DAC_value = DAC_value << 8 | toValue( uart_getc() );
>    }

Deutlich übersichtlicher, man erkennt das der alte Wert um die 
entsprechende Potenz verschoben wird, bevor der neue Wert hinzugefügt 
wird. Leider ein kleiner Tippfehler, da ja mit jedem Tastendruck ein 
Nibble (4 Bit) hinzukommt, muß der Zielwert auch um 4 Bit verschoben 
werden:
1
DAC_value = DAC_value << 4 | toValue( uart_getc() );
#2361513
Lesenswert?
• ▲
▼
Sandra schrieb:
> Super, danke.
>
> Die Unfreundlichkeit bereden wir nicht da Du mir wirklich sehr geholfen
> hast.
>

Das liegt daran, dass ich dir vor über einer Stunde schon geschrieben 
habe: Schreib dir dafür eine Funktion!

Ich warte immer noch auf den ersten Lernenden, der nicht auf die harte 
Tour lernen muss, dass Codeorganisation ein Werkzeug zur 
Fehlervermeidung darstellt und man sich mit möglichst kryptisch eng 
zusammengestauchtem Code nur selbst ein Bein stellt.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.