Bonjour,
J'ai besoin de votre d'aide car je n'en sort pas seul ...
Je recois sur le port série des bytes uns à uns.
Il s'agit d'une communication entre un PIC ( µC avec C embarqué ) et un modem.
Le modem commence et fini systématiquement ses communications par le couple de caractères \r\n
Mon but est de capturer chaque réponse du modem dans un buffer sans les caractères \r\n et d'insérer en fin de réponse le caractère \0 afin que la chaine de caractère soit exploitable.
Le modem va par exemple envoyer ceci pour répondre "OK"
\r\nOK\r\n\
Si le modem reçoit un appel il envoi ceci:
\r\nRING\r\n\r\n+CLIP:"0102030000"\r\n\
Je voudrai pouvoir récuperer chaque réponse : RING et +CLIP:"0102030000" dans un (ou deux) buffer(s).
J'ai essayé pas mal de choses, mais je n'y arrive vraiment pas.
Pourriez vous m'aider svp ?
Voici mon code, il recoit bien chaque byte mais la mise en forme n'est pas celle espérée et l'index de reception, qui compte les byte reçus, ne semble pas se remettre à zero au bon moment, je ne sais pas pourquoi.
...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 #define UART_BUFFER_SIZE 80 // chaque réponse reçue sera toujours < à 80 caractères static unsigned char c; static unsigned char UART1_RCX[UART_BUFFER_SIZE]; unsigned char uart_buffer[UART_BUFFER_SIZE]; BYTE i;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 // Début de boucle d'interruption dès reception d'un byte sur le port série if(PIR1bits.RC1IF) { // --- On capture byte par byte --- /// c = RCREG1; // lecture du registre de reception -> met dans 'c' UART1_RCX[index_uart] = c; // chaque byte recu constitue la chaine UART1_RCX if (index_uart++ == UART_BUFFER_SIZE) index_uart=0; // avance l'index et vérifie un éventuel dépassement } // --- Fin de la capture dans UART1_RCX --- /// for(i=2;i<UART_BUFFER_SIZE;i++) // on recopie la reception dans un nouveau buffer en décalant 2 rangs // vers la gauche ( suppression du 1er couple de \r\n uart_buffer[i-2] = UART1_RCX[i]; if (uart_buffer[i-2]== '\r') // on parcours la suite de la chaine, si on rencontre \r on termine la chaine { uart_buffer[i-2] = '\0'; // on remplace \r par \0 pour obtenir le 1er buffer index_uart=0; // remise de l'index à 0 afin de démarrer une nouvelle chaine }
Partager