Debug Serial para programa resetar o buffer quando houver tamanhos errados na mensagem
Dependencies: pulga-lorawan-drv PingPong-P2P-ClickButtonToWork-SX1272
serial.cpp@15:b27ab44dc2c8, 2021-04-29 (annotated)
- 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?
User | Revision | Line number | New 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 | } |