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