在字符串的开头和结尾,如何从MC60的每个响应中识别CR和LF?

时间:2019-01-03 17:58:47

标签: c embedded

一年多来,我没有碰过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双方分开,并将实际数据存储在数组中。

1 个答案:

答案 0 :(得分:0)

建议在收到'\r''\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);
}