我想从 STM32VLDiscovery (STM32F100X4) 的 USART1 获取字符串,并根据从 USART1 收到的字符串编写一个 AT 命令解析器。
以下是我形成的概念,但我不确定它是否正确。
#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];
}
}
谁能解释一下我应该做的步骤?谢谢。
基本上你应该等待来自输入的注意“AT”并忽略它之前的任何内容。例如,输入“XYZATZ\r”和“AaatZ\r”都应作为“ATZ”命令处理。在“A”和“T”(以及所有其他命令字符)之间也可以有短暂的停顿,因为人类可能会键入这些命令。
默认情况下,所有命令都以“\r”字符结尾。
从 ITU-T 文档中查看有关 AT 命令的更多信息。例如来自 V.250标准。
可能有许多替代方法可以实现它。最佳选择取决于您的需求。如果你要实现移动端的所有 AT 指令,那么你应该花更多的时间在解析器上。如果您想为几个命令制作一些测试应用程序,那么您的实现可以像您提供的那样简单。
我是一名优秀的程序员,十分优秀!