【问题标题】:How to recognize CR and LF at each response from MC60 at the start and end of strings?如何在字符串开头和结尾的 MC60 的每个响应中识别 CR 和 LF?
【发布时间】:2019-01-03 17:58:46
【问题描述】:

一年多没有接触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

        }
    }
 }
}

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

【问题讨论】:

  • 在收到'\r''\n' 时建议改为在没有事先输入的情况下悄悄地丢弃这些数据并寻找更多信息。
  • ... while(x!='\0');(与while(x!=NULL);相同)很奇怪。您希望发送'\0' 吗?
  • uart_RX() 是如何工作的?它会阻塞直到读取一个字符?如果不是,当没有可用字符时它会做什么 - 它返回 0、最后一个字符还是其他字符?
  • 串行通信是一项实时活动 - 没有什么“简单”,不考虑时间。绝对有可能过快或过慢地检查传入的字符。但是,您刚刚发布的实现确实会阻塞,直到字符准备好,并且不太可能太慢。剩下的风险是没有接收到数据——你可能需要超时。
  • 不,这几乎肯定会丢失数据,除非硬件具有深度串行 fifo。要实现超时,您需要在一定数量的循环后退出 uart_RX 内的 while 循环,并发出错误信号。否则,您的程序可能会永远挂起,因为您最终会等待一个永远不会发送的字符。

标签: c embedded


【解决方案1】:

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

【讨论】:

  • 我明白了,谢谢,这可能会奏效,但我找到了错误的地方,非常感谢@chux
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多