STM32 GSM AT命令响应解析器

STM32 GSM AT命令响应解析器,stm32,at-command,gprs,Stm32,At Command,Gprs,我正在发送命令以获取IMEI编号 char CGSN[] = "AT+CGSN\r\n"; // in while loop HAL_UART_Transmit(&huart2,(uint8_t *)CGSN, sizeof(CGSN),100); HAL_Delay(1000); HAL_UART_Receive_IT(&huart2,(uint8_t *)&ch,1); // Callback void HAL_UART_RxCpltCallbac

我正在发送命令以获取IMEI编号

char CGSN[] = "AT+CGSN\r\n";

// in while loop 
HAL_UART_Transmit(&huart2,(uint8_t *)CGSN, sizeof(CGSN),100);
HAL_Delay(1000);    
HAL_UART_Receive_IT(&huart2,(uint8_t *)&ch,1);  

// Callback 
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  if(huart->Instance == USART2){
    if(buf[i]!=13){
      buf[i]=ch;
      i++;
    } 

  }
  HAL_UART_Receive_IT(&huart2,(uint8_t *)&ch,1);

  buf[i]=0;
}
存储在缓冲区中的响应是-
\r\n9876543212345\r\n\r\nOK\r\n
接收响应和过滤n“9876543212345”和“OK”并单独存储在阵列中以进一步处理的最佳方式是什么


谢谢

您可以为此使用sscanf。下面是该场景在C中的快速实现

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

int main(void) {
    unsigned long a;
    char array[10];
    char string[] = "\r\n9876543212345\r\n\r\nOK\r\n";
    sscanf(string , "\r\n%ld\r\n\r\n%s\r\n", &a, array);
    printf("%ld %s\n", a, array);
    return 0;
}
#包括
#包括
#包括
内部主(空){
无符号长a;
字符数组[10];
字符字符串[]=“\r\n9876543212345\r\n\r\nOK\r\n”;
sscanf(字符串“\r\n%ld\r\n\r\n%s\r\n”、&a、数组);
printf(“%ld%s\n”,一个数组);
返回0;
}

您可以为此目的使用sscanf。下面是该场景在C中的快速实现

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

int main(void) {
    unsigned long a;
    char array[10];
    char string[] = "\r\n9876543212345\r\n\r\nOK\r\n";
    sscanf(string , "\r\n%ld\r\n\r\n%s\r\n", &a, array);
    printf("%ld %s\n", a, array);
    return 0;
}
#包括
#包括
#包括
内部主(空){
无符号长a;
字符数组[10];
字符字符串[]=“\r\n9876543212345\r\n\r\nOK\r\n”;
sscanf(字符串“\r\n%ld\r\n\r\n%s\r\n”、&a、数组);
printf(“%ld%s\n”,一个数组);
返回0;
}

Thank@sluhana,我尝试过sscanf和strtok,但没有得到想要的结果,我只是在寻找一种简单的方法,将两者存储在两个单独的数组中,例如:array1[]=“9876543212345”&array2[]=“OK”为什么sscanf会失败?我知道您使用的控制器内存有限。我曾经遇到过这样一个问题,在我的例子中,我遇到了堆栈溢出问题。最终使用sscanf使其正常工作,但现在有了更多的挑战,将让您不断更新,感谢再次使用sscanf解决新问题,如果我通过buffer[]=“AT+CGSN\r\n9876543212345\r\n\r\nOK\r\n”和n=sscanf(buffer,%s\r\n%s\r\n\r\n%s\r\n”,头,结果,响应);返回3,这是正常的。现在在我的程序流缓冲区中存储了回调函数的数据,并用相同的“AT+CGSN\r\n9876543212345\r\n\r\nOK\r\n”填充,但sscanf只返回1,它只扫描第一个字符串,有没有关于如何解决这个问题的建议?缓冲区中有一个空“\0”[]=”AT+CGSN\r\n\0\r\n9876543212345\r\n\r\nOK\r\n“,可能是终止了sscanf,无法从ArrayTanks@sluhana中删除'\0',我尝试了sscanf和strtok,但没有得到预期的结果,我只是在寻找将两者存储在两个单独数组中的简单方法,例如:array1[]=“9876543212345”&array2[]=“OK”为什么它在sscanf中失败?我知道您使用的控制器内存有限。我曾经遇到过这样一个问题,在我的例子中,我遇到了堆栈溢出问题。最终使用sscanf使其正常工作,但现在有了更多的挑战,将让您不断更新,感谢再次使用sscanf解决新问题,如果我通过buffer[]=“AT+CGSN\r\n9876543212345\r\n\r\nOK\r\n”和n=sscanf(buffer,%s\r\n%s\r\n\r\n%s\r\n”,头,结果,响应);返回3,这是正常的。现在在我的程序流缓冲区中存储了回调函数的数据,并用相同的“AT+CGSN\r\n9876543212345\r\n\r\nOK\r\n”填充,但sscanf只返回1,它只扫描第一个字符串,有没有关于如何解决这个问题的建议?缓冲区中有一个空“\0”[]=”AT+CGSN\r\n\0\r\n9876543212345\r\n\r\nOK\r\n,可能是正在终止sscanf,无法从阵列中删除“\0”