【问题标题】:STM32 GSM AT command response parserSTM32 GSM AT 命令响应解析器
【发布时间】:2019-07-25 16:39:46
【问题描述】:

我正在发送AT命令来获取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" 并分别存储在数组中以进一步处理的最佳方法是什么

谢谢

【问题讨论】:

    标签: stm32 at-command gprs


    【解决方案1】:

    您可以为此目的使用 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;
    }
    

    【讨论】:

    • 感谢@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",header,result,response); 返回 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'
    【解决方案2】:

    问题很简单!您的 buf[] 不包括 '\r' (十进制 13)。 正确的值buf[]是"AT+CGSN\n9876543212345\n\nOK\n\0"

    【讨论】:

      猜你喜欢
      • 2019-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多