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

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