Debug Serial para programa resetar o buffer quando houver tamanhos errados na mensagem
Dependencies: pulga-lorawan-drv PingPong-P2P-ClickButtonToWork-SX1272
serial.cpp@13:d01f36389be1, 2021-04-15 (annotated)
- Committer:
- pancotinho
- Date:
- Thu Apr 15 19:21:55 2021 +0000
- Revision:
- 13:d01f36389be1
- Parent:
- 12:d0ca7c3c8962
- Child:
- 14:88373765b9a9
Working copy for new protocol
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(); |
pancotinho | 7:37dc9ce68914 | 33 | |
pancotinho | 7:37dc9ce68914 | 34 | buf_len++; |
pancotinho | 7:37dc9ce68914 | 35 | wr_index++; |
pancotinho | 7:37dc9ce68914 | 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]; |
pancotinho | 13:d01f36389be1 | 76 | int new_index = rd_index + lenght; |
pancotinho | 13:d01f36389be1 | 77 | //pc.printf("msg size: %d \n",lenght); |
pancotinho | 7:37dc9ce68914 | 78 | while (i < buf_len) |
pancotinho | 7:37dc9ce68914 | 79 | { |
pancotinho | 13:d01f36389be1 | 80 | if (i==lenght+3 && circ_buffer[j] == '>') |
pancotinho | 13:d01f36389be1 | 81 | //if (i==lenght+3 && ) |
pancotinho | 12:d0ca7c3c8962 | 82 | { |
pancotinho | 13:d01f36389be1 | 83 | pc.printf("char = %c \n", circ_buffer[j]); |
pancotinho | 7:37dc9ce68914 | 84 | ///encontrou final de cmd |
pancotinho | 7:37dc9ce68914 | 85 | msg_incompleta = 0; |
pancotinho | 7:37dc9ce68914 | 86 | break; |
pancotinho | 7:37dc9ce68914 | 87 | } |
pancotinho | 7:37dc9ce68914 | 88 | j++; |
pancotinho | 7:37dc9ce68914 | 89 | i++; |
pancotinho | 7:37dc9ce68914 | 90 | |
pancotinho | 7:37dc9ce68914 | 91 | if (j >= sizeof(circ_buffer)) { |
pancotinho | 7:37dc9ce68914 | 92 | j = 0; |
pancotinho | 13:d01f36389be1 | 93 | pc.printf("j>lenght!"); |
pancotinho | 7:37dc9ce68914 | 94 | } |
pancotinho | 7:37dc9ce68914 | 95 | } |
pancotinho | 7:37dc9ce68914 | 96 | |
pancotinho | 7:37dc9ce68914 | 97 | /// Se a mensagem esta incompleta, deixa para a proxima vez. |
pancotinho | 7:37dc9ce68914 | 98 | /// Mas aqui tem uma sacada, se o buffer circular estiver cheio, |
pancotinho | 7:37dc9ce68914 | 99 | /// nunca receberei o final... Entao o codigo nao receberia nunca mais. |
pancotinho | 7:37dc9ce68914 | 100 | /// Para evitar o travamento permanente, limpa tudo nesse caso. |
pancotinho | 7:37dc9ce68914 | 101 | /// <------------ Isso causava o erro !!!!!! |
pancotinho | 7:37dc9ce68914 | 102 | if (msg_incompleta) |
pancotinho | 7:37dc9ce68914 | 103 | { |
pancotinho | 7:37dc9ce68914 | 104 | if (buf_len >= sizeof(circ_buffer)) |
pancotinho | 7:37dc9ce68914 | 105 | { |
pancotinho | 7:37dc9ce68914 | 106 | rd_index = 0; |
pancotinho | 7:37dc9ce68914 | 107 | wr_index = 0; |
pancotinho | 7:37dc9ce68914 | 108 | buf_len = 0; |
pancotinho | 7:37dc9ce68914 | 109 | } |
pancotinho | 7:37dc9ce68914 | 110 | pc.attach(&serial_post_to_queue, RawSerial::RxIrq); |
pancotinho | 7:37dc9ce68914 | 111 | return; |
pancotinho | 7:37dc9ce68914 | 112 | } |
pancotinho | 7:37dc9ce68914 | 113 | |
pancotinho | 7:37dc9ce68914 | 114 | /// Finalmente copio a msg |
pancotinho | 7:37dc9ce68914 | 115 | msg_len = 0; |
pancotinho | 7:37dc9ce68914 | 116 | while(buf_len > 0) |
pancotinho | 7:37dc9ce68914 | 117 | { |
pancotinho | 7:37dc9ce68914 | 118 | if (msg_len < sizeof(msg)) |
pancotinho | 7:37dc9ce68914 | 119 | { |
pancotinho | 7:37dc9ce68914 | 120 | msg[msg_len] = circ_buffer[rd_index]; |
pancotinho | 7:37dc9ce68914 | 121 | msg_len++; |
pancotinho | 7:37dc9ce68914 | 122 | } |
pancotinho | 7:37dc9ce68914 | 123 | else |
pancotinho | 7:37dc9ce68914 | 124 | { |
pancotinho | 7:37dc9ce68914 | 125 | /// A mensagem esta errada, grande demais. |
pancotinho | 7:37dc9ce68914 | 126 | msg_len = 0; |
pancotinho | 7:37dc9ce68914 | 127 | break; |
pancotinho | 7:37dc9ce68914 | 128 | } |
pancotinho | 7:37dc9ce68914 | 129 | |
pancotinho | 13:d01f36389be1 | 130 | if (rd_index==new_index+3 && circ_buffer[rd_index] == '>') |
pancotinho | 7:37dc9ce68914 | 131 | { |
pancotinho | 7:37dc9ce68914 | 132 | ///encontrou final de cmd |
pancotinho | 7:37dc9ce68914 | 133 | break; |
pancotinho | 7:37dc9ce68914 | 134 | } |
pancotinho | 7:37dc9ce68914 | 135 | |
pancotinho | 7:37dc9ce68914 | 136 | buf_len--; |
pancotinho | 7:37dc9ce68914 | 137 | rd_index++; |
pancotinho | 7:37dc9ce68914 | 138 | |
pancotinho | 7:37dc9ce68914 | 139 | if (rd_index >= sizeof(circ_buffer)) { |
pancotinho | 7:37dc9ce68914 | 140 | rd_index = 0; |
pancotinho | 7:37dc9ce68914 | 141 | } |
pancotinho | 7:37dc9ce68914 | 142 | } |
pancotinho | 7:37dc9ce68914 | 143 | |
pancotinho | 7:37dc9ce68914 | 144 | /// Agora posso limpar todo o buffer circular |
pancotinho | 7:37dc9ce68914 | 145 | rd_index = 0; |
pancotinho | 7:37dc9ce68914 | 146 | wr_index = 0; |
pancotinho | 7:37dc9ce68914 | 147 | buf_len = 0; |
pancotinho | 7:37dc9ce68914 | 148 | |
pancotinho | 7:37dc9ce68914 | 149 | /// A mensagem foi truncada entao sai. |
pancotinho | 7:37dc9ce68914 | 150 | if (msg_len == 0) { |
pancotinho | 7:37dc9ce68914 | 151 | pc.attach(&serial_post_to_queue, RawSerial::RxIrq); |
pancotinho | 7:37dc9ce68914 | 152 | return; |
pancotinho | 7:37dc9ce68914 | 153 | } |
pancotinho | 7:37dc9ce68914 | 154 | |
pancotinho | 7:37dc9ce68914 | 155 | /// Troco o '>' do final por null |
pancotinho | 7:37dc9ce68914 | 156 | msg[msg_len - 1] = '\0'; |
pancotinho | 7:37dc9ce68914 | 157 | |
pancotinho | 7:37dc9ce68914 | 158 | SerialCommandRun(msg); |
pancotinho | 7:37dc9ce68914 | 159 | |
pancotinho | 7:37dc9ce68914 | 160 | pc.attach(&serial_post_to_queue, RawSerial::RxIrq); |
pancotinho | 7:37dc9ce68914 | 161 | return; |
pancotinho | 7:37dc9ce68914 | 162 | } |
pancotinho | 7:37dc9ce68914 | 163 | |
pancotinho | 7:37dc9ce68914 | 164 | |
pancotinho | 7:37dc9ce68914 | 165 | void PrintDebugMsg(char *msg){ |
pancotinho | 7:37dc9ce68914 | 166 | pc.printf(msg); |
pancotinho | 7:37dc9ce68914 | 167 | } |