Как распознать CR и LF при каждом ответе от MC60 в начале и конце строк? - PullRequest
0 голосов
/ 03 января 2019

Больше года я не касался C, и теперь я должен сделать этот проект. Я пишу код для отправки команд MC60 AT через микроконтроллер AVR, однако я только что сделал базовую функцию Uart для отправки тестовых команд и чтения команд на MC60 и теперь просто тестирую на Виртуальном терминале в Proteus, как то, как команды принимаются , В конце каждой команды я посылаю CR и LF, используя их шестнадцатеричные коды, напрямую через UART, пока здесь все нормально, но когда мне приходится получать ответы от 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 () будут сохранены в массиве символов соответственно. В настоящее время он распознает команды, которые я чувствую, но ответ беспорядок, я не могу разобрать этот ответ должным образом. Пожалуйста, кто-нибудь поможет мне и подскажет, как получить ответ и отделить фактические данные ответа от CR и LF с обеих сторон и сохранить фактические данные в массиве, соответственно

1 Ответ

0 голосов
/ 03 января 2019

Рекомендуется вместо получения '\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);
}
...