Wie erstellen Sie AUF Befehle-Parser in C, um die eingehende Zeichenfolge aus USART1?

Ich möchte den string von USART1 von STM32VLDiscovery (STM32F100X4) und schreiben Sie einen AT-Befehl-Parser, der aus der Zeichenfolge empfangen von USART1.

Unten sind das Konzept, das ich entwickelt habe, aber ich bin mir nicht sicher, ob es richtig ist oder nicht.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "dosomethinga.h"

void dosomethingB();
void GET_AT_COMMAND(char*);
void takecommand(char *, char *);
int quit;


int main()
{   char buff[15];
    char command = '\0';
    quit = 0;

    while(!quit)
    {
        printf("Enter your command: ");
        scanf("%s", &buff);

        if (buff[0] == 'A' && buff[1] == 'T' && buff[2] == '+')
        {
            GET_AT_COMMAND(buff);
        }

    }
}

void dosomethingB()
{
    printf("dosomethingB called \n");
}

void GET_AT_COMMAND(char *text)
{
    int command;
    char temp[10] = "";

    /*if(text[3] == 'A')
          command = 1;

    else if(text[3] == 'B')
        command = 2;

    else if(text[3] == 'Z')
        command = 3;
    */

    takecommand(text,temp);

    if (strcmp(temp, "CALLA") == 0)
        command = 1;

    if (strcmp(temp, "CALLB") == 0)
        command = 2;

    if (strcmp(temp, "Z") == 0)
        command = 3;

    switch(command)
    {
        case 1:
            dosomethingA();
            break;

        case 2:
            printf("herehere.... \n");
            dosomethingB();
            break;

        case 3:
            printf("Exiting program.... \n");
            quit = 1;
            break;


        default:
            printf("Nothing to do here \n");
     }
}

void takecommand(char *mycmd, char *hold)
{
    int i;
    for(i = 0; i < 10 ; i++)
    {
         hold[i] = mycmd[i+3];
    }
}

Kann mir jemand erklären, auf die Schritte, die ich tun sollte? Danke.

Ich weiß nicht, etwas über AT-Befehle, aber ich Wette, Sie können sich rasieren, ein paar Zeilen code durch verschieben der case Blöcke von Ihrem switch Anweisung benannte Funktionen und ruft Sie in die if-else block. if(strcmp(temp, "CALLA") == 0) dosomenthingA(); else if(...) dosomethingB(); ....
Vielleicht besser für die code-review ? Sie haben einen Fehler : scanf("%s", &buff) buff ist ein array und kann direkt verwendet werden, und Sie kümmern sollte, Eingangs-Länge : scanf("%.14s", buff). Und takecommand enthält ein Magie 10 ; wenn Sie müssen, ändern Sie die Größe der Befehle, die Sie haben, um es zu beheben in vielen Orten. Und strncpy oder memcpy schon funktioniert es. (nur den ersten Blick-Analyse ...)

InformationsquelleAutor arissajonny | 2014-07-23

Schreibe einen Kommentar