mikrocontroller.net

Forum: Compiler & IDEs Wie Befehle via serieller Schnittstelle erkennen (mit scanf)


Autor: Marc Mk (macmek)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte via serieller Schnittstelle Befehle an den uC (ATmega64) 
senden, im Format:
ServoA=1000
ServoB=1200
Lampe=0
Text=Hallo Welt!

Sobald im empfangenen Text ein "Enter" vorkommt wird dieser als String 
"SerialText" dem Programm übergeben. Soweit funktioniert alles 
einwandfrei.

Die Servoposition konnte ich vor rund einem Jahr damit heraus lesen:
sscanf(SerialText, "S=%d", &a);

Doch das scheint nicht mehr zu passen:
Test232.c: In function 'main':
Test232.c:337: warning: passing argument 1 of 'sscanf' discards qualifiers from pointer target type

Was stimmt nicht ?

Ich wollte darauf aufbauen:
int main(void)
{
  int a,b;
  char S1[30]="\0";
  char S2[30]="\0";

  for (;;)
   {
        if ( Enter == 1 )
        {

           sscanf(SerialText, "%s=%s", &S1, &S2);

           if (!strcmp(S1,"ServoA")) {
             sscanf(SerialText, "S=%d", &a);
             sprintf( s, "\n\rServo A = %i\n\r> ", a);
             Sende1String (s); //Echo an RS232
             Enter = 0;
           }//Servo A

          // weitere Abfragen...
        
        }//if Enter
    }//for

}//main

Geht das so oder gibt es einen besseren Weg ?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welchen qualifier hat die Variable SerialText denn?

Autor: Marc Mk (macmek)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Global:
volatile char SerialText[50]="\0";

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na, das isses doch. sscanf erwartet halt keinen volatile-Pointer.

Das ist bei Arrays eh' unnötig, die kann der gcc-Optimizer sowieso nicht 
in Prozessorregistern unterbringen.

Also:

Entweder "volatile" bei der Deklaration weglassen oder beim Aufruf von 
sscanf einen Typecast nach (char *) vornehmen.

Autor: Marc Mk (macmek)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Juhu es funktioniert ohne volatile !
Aber nur bis zum ersten Leerzeichen, dann ist Schluss.
sscanf(SerialText, "Text=%s", &S1);
sprintf( s, "\n\rText = %s\n\r> ", S1);

Ich habe keine Möglichkeit gefunden, das Trennzeichen zu verändern, oder 
etwas mit Nullterminiert zu machen, richtig ?

Sonst versuche ich den Ursprungsstring ab der 5. Stelle bis Null zu 
kopieren.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marc Mk wrote:
> Juhu es funktioniert ohne volatile !
> Aber nur bis zum ersten Leerzeichen, dann ist Schluss.
>
>
sscanf(SerialText, "Text=%s", &S1);
> sprintf( s, "\n\rText = %s\n\r> ", S1);
>
> Ich habe keine Möglichkeit gefunden, das Trennzeichen zu verändern, oder
> etwas mit Nullterminiert zu machen, richtig ?
>
> Sonst versuche ich den Ursprungsstring ab der 5. Stelle bis Null zu
> kopieren.

Das ist sicherlich die einfachere Lösung :-)

strcpy( SerialText, &S1[5] );

sscanf ist dafür wirklich mit Kanonen auf Spatzen geschossen.


Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du solltes die strtok() Funktion verwenden um den String in 2 Teile mit 
'=' als Trennzeichen zu trennen.

%s liest immer bis zum nächsten Whitespace.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.