Debug Serial para programa resetar o buffer quando houver tamanhos errados na mensagem

Dependencies:   pulga-lorawan-drv PingPong-P2P-ClickButtonToWork-SX1272

Committer:
MatteusCarr
Date:
Thu Apr 29 16:54:10 2021 +0000
Revision:
15:b27ab44dc2c8
Parent:
14:88373765b9a9
Debug travamento para resetar e nao travar

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pancotinho 7:37dc9ce68914 1 #include "serial.h"
pancotinho 7:37dc9ce68914 2
pancotinho 7:37dc9ce68914 3 RawSerial pc(P0_28, P0_25);
pancotinho 7:37dc9ce68914 4
pancotinho 7:37dc9ce68914 5 static char circ_buffer[512];
pancotinho 7:37dc9ce68914 6 static int rd_index = 0;
pancotinho 7:37dc9ce68914 7 static int wr_index = 0;
pancotinho 7:37dc9ce68914 8 static int buf_len = 0;
pancotinho 7:37dc9ce68914 9
pancotinho 7:37dc9ce68914 10 void SerialRx(void)
pancotinho 7:37dc9ce68914 11 {
pancotinho 7:37dc9ce68914 12 char msg[256];
pancotinho 7:37dc9ce68914 13 int msg_incompleta;
pancotinho 7:37dc9ce68914 14 int msg_len;
pancotinho 7:37dc9ce68914 15 int i, j;
pancotinho 7:37dc9ce68914 16
pancotinho 7:37dc9ce68914 17 /// Execucao do comando nao deve fazer parte da recepcao de dados serial!
pancotinho 7:37dc9ce68914 18 /// Deve existir separacao entre camada fisica, protocolo de baixo nivel
pancotinho 7:37dc9ce68914 19 /// e de alto nivel.
pancotinho 7:37dc9ce68914 20
pancotinho 7:37dc9ce68914 21 /// 1) Vamos implementar a parte de recepcao serial com buffer circular.
pancotinho 7:37dc9ce68914 22 /// 2) Vamos implementar rejeicao de ruido.
pancotinho 7:37dc9ce68914 23 /// 3) Interpretamos, executamos ou descartamos comandos.
pancotinho 7:37dc9ce68914 24
pancotinho 7:37dc9ce68914 25 /// Recepcao serial
pancotinho 7:37dc9ce68914 26 while(pc.readable())
pancotinho 7:37dc9ce68914 27 {
pancotinho 7:37dc9ce68914 28 /// buffer circular cheio entao sai do loop
pancotinho 7:37dc9ce68914 29 if (buf_len >= sizeof(circ_buffer)) {
pancotinho 7:37dc9ce68914 30 break;
pancotinho 7:37dc9ce68914 31 }
pancotinho 7:37dc9ce68914 32 circ_buffer[wr_index] = pc.getc();
MatteusCarr 15:b27ab44dc2c8 33 //pc.printf("gettou o char %c\n", circ_buffer[wr_index]);
pancotinho 7:37dc9ce68914 34 buf_len++;
pancotinho 7:37dc9ce68914 35 wr_index++;
MatteusCarr 15:b27ab44dc2c8 36
pancotinho 7:37dc9ce68914 37 if (wr_index >= sizeof(circ_buffer)) {
pancotinho 7:37dc9ce68914 38 wr_index = 0;
pancotinho 7:37dc9ce68914 39 }
pancotinho 7:37dc9ce68914 40 }
pancotinho 7:37dc9ce68914 41
pancotinho 7:37dc9ce68914 42 /// Vamos retirar todos os caracteres invalidos antes do comando
pancotinho 7:37dc9ce68914 43 /// Um comando sempre inicia com '<'
pancotinho 7:37dc9ce68914 44 while(buf_len > 0)
pancotinho 7:37dc9ce68914 45 {
pancotinho 7:37dc9ce68914 46 if (circ_buffer[rd_index] == '<') {
pancotinho 7:37dc9ce68914 47 break; /// rd_index fica com o indice do inicio da mensagem
pancotinho 7:37dc9ce68914 48 }
pancotinho 7:37dc9ce68914 49
pancotinho 7:37dc9ce68914 50 buf_len--;
pancotinho 7:37dc9ce68914 51 rd_index++;
pancotinho 7:37dc9ce68914 52
pancotinho 7:37dc9ce68914 53 if (rd_index >= sizeof(circ_buffer)) {
pancotinho 7:37dc9ce68914 54 rd_index = 0;
pancotinho 7:37dc9ce68914 55 }
pancotinho 7:37dc9ce68914 56 }
pancotinho 7:37dc9ce68914 57
pancotinho 7:37dc9ce68914 58 /// Se ficou vazio, tudo era ruido, limpa todas as variaveis globais e sai
pancotinho 7:37dc9ce68914 59 if (buf_len <= 0)
pancotinho 7:37dc9ce68914 60 {
pancotinho 7:37dc9ce68914 61 //printf("ruido\n");
pancotinho 7:37dc9ce68914 62 rd_index = 0;
pancotinho 7:37dc9ce68914 63 wr_index = 0;
pancotinho 7:37dc9ce68914 64 buf_len = 0;
pancotinho 7:37dc9ce68914 65 pc.attach(&serial_post_to_queue, RawSerial::RxIrq);
pancotinho 7:37dc9ce68914 66 return;
pancotinho 7:37dc9ce68914 67 }
pancotinho 7:37dc9ce68914 68
pancotinho 7:37dc9ce68914 69 /// Agora vamos verificar se a mensagem esta completa.
pancotinho 7:37dc9ce68914 70 /// Procura o final (terminada em '>').
pancotinho 7:37dc9ce68914 71 /// Nao altero rd_index!!
pancotinho 7:37dc9ce68914 72 i = 0;
pancotinho 7:37dc9ce68914 73 j = rd_index;
pancotinho 7:37dc9ce68914 74 msg_incompleta = 1;
pancotinho 13:d01f36389be1 75 int lenght = circ_buffer[j+2];
MatteusCarr 15:b27ab44dc2c8 76 //int new_index = rd_index + lenght;
MatteusCarr 15:b27ab44dc2c8 77 //pc.printf("index %d and new_index %d\n", rd_index, new_index);
pancotinho 13:d01f36389be1 78 //pc.printf("msg size: %d \n",lenght);
pancotinho 7:37dc9ce68914 79 while (i < buf_len)
pancotinho 7:37dc9ce68914 80 {
MatteusCarr 15:b27ab44dc2c8 81 if (i==lenght+3)
pancotinho 12:d0ca7c3c8962 82 {
MatteusCarr 15:b27ab44dc2c8 83 if(circ_buffer[j] == '>'){
MatteusCarr 15:b27ab44dc2c8 84 //pc.printf("msg size = %d \n", i);
MatteusCarr 15:b27ab44dc2c8 85 pc.printf("msgOK\n", circ_buffer[j]);
MatteusCarr 15:b27ab44dc2c8 86 ///encontrou final de cmd
MatteusCarr 15:b27ab44dc2c8 87 msg_incompleta = 0;
MatteusCarr 15:b27ab44dc2c8 88 break;
MatteusCarr 15:b27ab44dc2c8 89 }else{
MatteusCarr 15:b27ab44dc2c8 90 rd_index=0;
MatteusCarr 15:b27ab44dc2c8 91 wr_index=0;
MatteusCarr 15:b27ab44dc2c8 92 buf_len=0;
MatteusCarr 15:b27ab44dc2c8 93 pc.attach(&serial_post_to_queue, RawSerial::RxIrq);
MatteusCarr 15:b27ab44dc2c8 94 return;
MatteusCarr 15:b27ab44dc2c8 95 }
pancotinho 7:37dc9ce68914 96 }
pancotinho 7:37dc9ce68914 97 j++;
pancotinho 7:37dc9ce68914 98 i++;
pancotinho 7:37dc9ce68914 99
pancotinho 7:37dc9ce68914 100 if (j >= sizeof(circ_buffer)) {
pancotinho 7:37dc9ce68914 101 j = 0;
pancotinho 13:d01f36389be1 102 pc.printf("j>lenght!");
pancotinho 7:37dc9ce68914 103 }
pancotinho 7:37dc9ce68914 104 }
pancotinho 7:37dc9ce68914 105
pancotinho 7:37dc9ce68914 106 /// Se a mensagem esta incompleta, deixa para a proxima vez.
pancotinho 7:37dc9ce68914 107 /// Mas aqui tem uma sacada, se o buffer circular estiver cheio,
pancotinho 7:37dc9ce68914 108 /// nunca receberei o final... Entao o codigo nao receberia nunca mais.
pancotinho 7:37dc9ce68914 109 /// Para evitar o travamento permanente, limpa tudo nesse caso.
pancotinho 7:37dc9ce68914 110 /// <------------ Isso causava o erro !!!!!!
pancotinho 7:37dc9ce68914 111 if (msg_incompleta)
pancotinho 7:37dc9ce68914 112 {
pancotinho 7:37dc9ce68914 113 if (buf_len >= sizeof(circ_buffer))
pancotinho 7:37dc9ce68914 114 {
pancotinho 7:37dc9ce68914 115 rd_index = 0;
pancotinho 7:37dc9ce68914 116 wr_index = 0;
pancotinho 7:37dc9ce68914 117 buf_len = 0;
pancotinho 14:88373765b9a9 118 pc.printf("msg 2 big!");
pancotinho 7:37dc9ce68914 119 }
pancotinho 7:37dc9ce68914 120 pc.attach(&serial_post_to_queue, RawSerial::RxIrq);
pancotinho 7:37dc9ce68914 121 return;
pancotinho 7:37dc9ce68914 122 }
pancotinho 7:37dc9ce68914 123
pancotinho 7:37dc9ce68914 124 /// Finalmente copio a msg
pancotinho 7:37dc9ce68914 125 msg_len = 0;
pancotinho 7:37dc9ce68914 126 while(buf_len > 0)
pancotinho 7:37dc9ce68914 127 {
pancotinho 7:37dc9ce68914 128 if (msg_len < sizeof(msg))
pancotinho 7:37dc9ce68914 129 {
pancotinho 7:37dc9ce68914 130 msg[msg_len] = circ_buffer[rd_index];
pancotinho 7:37dc9ce68914 131 msg_len++;
pancotinho 7:37dc9ce68914 132 }
pancotinho 7:37dc9ce68914 133 else
pancotinho 7:37dc9ce68914 134 {
pancotinho 7:37dc9ce68914 135 /// A mensagem esta errada, grande demais.
pancotinho 7:37dc9ce68914 136 msg_len = 0;
pancotinho 7:37dc9ce68914 137 break;
pancotinho 14:88373765b9a9 138 pc.printf("lenght 2 big!");
pancotinho 7:37dc9ce68914 139 }
pancotinho 7:37dc9ce68914 140
MatteusCarr 15:b27ab44dc2c8 141 //if (rd_index==new_index+3 && circ_buffer[rd_index] == '>')
MatteusCarr 15:b27ab44dc2c8 142 if (buf_len==1 && circ_buffer[rd_index] == '>')
pancotinho 7:37dc9ce68914 143 {
pancotinho 7:37dc9ce68914 144 ///encontrou final de cmd
MatteusCarr 15:b27ab44dc2c8 145 pc.printf("msglen = %d \n", msg_len);
pancotinho 14:88373765b9a9 146 pc.printf("charchar = %c \n", circ_buffer[rd_index]);
pancotinho 7:37dc9ce68914 147 break;
pancotinho 7:37dc9ce68914 148 }
pancotinho 7:37dc9ce68914 149
pancotinho 7:37dc9ce68914 150 buf_len--;
pancotinho 7:37dc9ce68914 151 rd_index++;
pancotinho 7:37dc9ce68914 152
pancotinho 7:37dc9ce68914 153 if (rd_index >= sizeof(circ_buffer)) {
pancotinho 7:37dc9ce68914 154 rd_index = 0;
MatteusCarr 15:b27ab44dc2c8 155 //pc.printf("j>rd_index!");
pancotinho 14:88373765b9a9 156
pancotinho 7:37dc9ce68914 157 }
pancotinho 7:37dc9ce68914 158 }
pancotinho 7:37dc9ce68914 159
pancotinho 7:37dc9ce68914 160 /// Agora posso limpar todo o buffer circular
pancotinho 7:37dc9ce68914 161 rd_index = 0;
pancotinho 7:37dc9ce68914 162 wr_index = 0;
pancotinho 7:37dc9ce68914 163 buf_len = 0;
pancotinho 7:37dc9ce68914 164
pancotinho 7:37dc9ce68914 165 /// A mensagem foi truncada entao sai.
pancotinho 7:37dc9ce68914 166 if (msg_len == 0) {
pancotinho 7:37dc9ce68914 167 pc.attach(&serial_post_to_queue, RawSerial::RxIrq);
pancotinho 7:37dc9ce68914 168 return;
pancotinho 7:37dc9ce68914 169 }
pancotinho 7:37dc9ce68914 170
pancotinho 7:37dc9ce68914 171 /// Troco o '>' do final por null
pancotinho 7:37dc9ce68914 172 msg[msg_len - 1] = '\0';
pancotinho 7:37dc9ce68914 173
pancotinho 7:37dc9ce68914 174 SerialCommandRun(msg);
pancotinho 7:37dc9ce68914 175
pancotinho 7:37dc9ce68914 176 pc.attach(&serial_post_to_queue, RawSerial::RxIrq);
pancotinho 7:37dc9ce68914 177 return;
pancotinho 7:37dc9ce68914 178 }
pancotinho 7:37dc9ce68914 179
pancotinho 7:37dc9ce68914 180
pancotinho 7:37dc9ce68914 181 void PrintDebugMsg(char *msg){
pancotinho 7:37dc9ce68914 182 pc.printf(msg);
pancotinho 7:37dc9ce68914 183 }