首页 > 解决方案 > 如何在字符串的开头和结尾识别来自 MC60 的每个响应的 CR 和 LF?

问题描述

一年多没有接触C,现在我必须做这个项目。我正在编写通过 AVR 微控制器发送 MC60 AT 命令的代码,但是我刚刚制作了 Uart 的基本功能,用于向 MC60 发送测试命令和读取命令,现在只是在 Proteus 中的虚拟终端上测试如何接收命令. 在每个命令结束时,我直接通过 UART 使用它们的十六进制代码发送 CR 和 LF,直到这里都很好,但是当我必须从 MC60 接收响应时,它们的开头和结尾也有 CR 和 LF,而我的除命令外,代码无法从中提取实际响应数据。我只想将我的实际响应数据存储在一个可以从函数返回的字符串中。下面是我获取响应的代码示例:

unsigned char uart_RX()
{
while(!UCSRA & (1<<RXC));
return UDR;
}    

void response(char *rec) //function to fetch the response in string format
{
char x;
do
{
    x = uart_RX();
    *rec = x;
    rec++;
}
while(x!=NULL);
return;
//_delay_ms(10);
 } 

void main()
{
char buf[200];
char resp[200];
char cr, lf;
uart_init(12);
_delay_ms(1000);
send_readcmd(READNAVINFO); //function that sends "<CR><LF>AT+QGNSSRD?<CR><LF>" command through my own defined library of AT commands
while(1)
{   
    cr = uart_RX();
    if (cr==0x0D)
    {
        lf = uart_RX();
        if (lf==0x0A)
        {
            response(buf);
            snprintf(resp, sizeof(buf), buf); //I feel resp will store the buf data without CR and LF

        }
    }
 }
}

在使用 send_readcmd() 发送读取命令后,我希望来自 MC60 的实际响应数据存储在 resp char 数组中。目前它正在识别我感觉到的命令,但响应是一团糟,我无法正确解析该响应。请有人帮助我并指导我如何获取响应并将实际响应数据与 CR 和 LF 双方分开并将实际数据存储在数组中。

标签: cembedded

解决方案


建议在收到'\r'or'\n' 并且没有事先输入的情况下悄悄地丢弃该数据并寻找更多。

当接收到'\r' '\n'之前的输入时,将其标识为命令结束。

// I'd also expect some timeout criteria, yet that is TBD code
void response(char *rec, size_t size) {
  char ch;
  while ((ch = uart_RX()) == '\r' || ch == '\n') {
    ;
  }
  do {
    if (size > 1) {
      size--; 
      *rec++ = ch;
    }
    ch = uart_RX();
  } while (ch != '\r' && ch != '\n');
  if (size > 0) {
    *rec = '\0';
  }
}

用法

while (1) {   
  response(buf, sizeof buf);
  printf("%s", buf);
}

推荐阅读