J'ouvre ce nouveau POST, car je galère à bien comprendre le dialogue UART .
Voici le programme émission : Je vous écrit comme je crois comprendre les choses.
J'utilise 4 boutons pour envoyer car 4 chaines de caractères et de longueur différents ( lettres et chiffres) en guise d'exercice.
Donc après chaque envoie j'envoie aussi un CR et un LF pour dire au récepteur que c'est la fin de ma chaine quelques soit sa taille.
Voila mon programme émetteur : Voyez vous des erreurs à éviter . je pense que les bugs sont dans le programme réception plus délicat je trouve.
Code : Tout sélectionner
/*##################################################################################
Programme de test pour liaison UART-USB sur carte EasyPIC_V7 avec ecran PIC18FJ
Fait par Jérémy sur FantasPic.fr
- Version du "23-01-2016"
- MikroC version 6.6.2
- PIC 18F46K22 FOSC à 8MHZ, Quartz extrene de 8Mhz, PLL désactivée
- Data-Shit du PIC : http://ww1.microchip.com/downloads/en/DeviceDoc/41412F.pdf
- manuel et schéma de la carte : http://www.mikroe.com/downloads/get/1711/easypic_v7_manual_v104c.pdf
#################################################################################*/
#define BP0 PORTD.B0
#define BP1 PORTD.B1
#define BP6 PORTD.B6
#define BP7 PORTD.B7
// Connections de l'écran LCD
sbit LCD_RS at LATB4_bit;
sbit LCD_EN at LATB5_bit;
sbit LCD_D4 at LATB0_bit;
sbit LCD_D5 at LATB1_bit;
sbit LCD_D6 at LATB2_bit;
sbit LCD_D7 at LATB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// Fin connections LCD
// Déclaration des variables utilisées -------------------------------------------
char P_compteur[7]; // tableau contenant mon compteur de 5 chiffres ( int) + 2 pour le terminateur de string /0
char P_Variable[32]; // Tableau contenant les caractéres des 8 variables de 3 chiffres ( 3x8=24) + 6 espaces + 2 terminateur = 32
char texte[55]= "1---5----10----15----20----25----30"; // Tablmeua contenant du texte
unsigned int Registre, Flag_Data_OK=0, i=0, Flag_Erreur=0, compteur = 95;
unsigned char var0=100, var1=101,var2=102, var3=103, var4=104, var5=105, var6=106, var7=110;
// Fin des variables----------------------------------------------------------------
//##################################################################################
//######################### PROGRAMME PRINCIPAL #########################
//##################################################################################
void main() {
ANSELB = 0x00; // Configure le PORTB en digital pour le LCD
ANSELC = 0x00; // PORTB en digital
ANSELD = 0x00; // PORTB en digital
TRISB = 0x00; // PORTB en sortie
TRISC = 0x00; // PORTC en sortie
TRISD = 0xFF; // PORTD en entrée
UART1_Init(9600); // Initialisation de l'UART
delay_ms(100); // Petite pause
Lcd_Init(); // Initialisation du LCD
Lcd_Cmd (_LCD_CLEAR); // On efface l'écran
Lcd_Cmd (_LCD_CURSOR_OFF);// On arrete le clignotement du curseur
delay_ms(100); // Petite pause
Lcd_Out (1, 1, "Envoi:");
Lcd_Out (2, 1, "Reception:");
//####################### BOUCLE INFINIE ####################################
while (1)
{
if (((BP0==1) && (UART1_Tx_Idle() == 1))) // Check le BP0 et le buffer
{
compteur++; // On incrémente le compteur
IntToStr (compteur, P_compteur); // On le convertit en string
Lcd_Out (1, 8,P_compteur); // On l'affiche sur le LCD de l’émetteur
UART1_Write_Text(P_compteur); // Envoie du texte
UART1_Write(13); // envoie un CR
UART1_Write(10); // Envoie un CL
while (BP0==1); // Anti rebond
}
if (((BP1==1) && (UART1_Tx_Idle() == 1))) // Check le BP1 et le buffer
{
Lcd_Out (1, 9,"TEXTE "); // On l'affiche sur le LCD de l’émetteur
UART1_Write_Text(texte); // Envoie du texte deja en string donc pas de conversion
UART1_Write(13); // envoie un CR
UART1_Write(10); // Envoie un CL
while (BP1==1); // Anti rebond
}
if (((BP6==1) && (UART1_Tx_Idle() == 1))) // Check le BP6 et le buffer
{
Lcd_Out (1, 9,"COMPTEUR"); // On l'affiche sur le LCD de l’émetteur
var0++; var1++; var2++; var3++; var4++; var5++; var6++; var7+=5; // On incrémente nos compteurs
sprintf(P_Variable,"%3d %3d %3d %3d %3d %3d %3d %3d",var0,var1,var2,var3,var4,var5,var6,var7); // On convertit
UART1_Write_Text(P_Variable); // Envoie du texte
UART1_Write(13); // envoie un CR
UART1_Write(10); // Envoie un CL
while (BP6==1); // Anti rebond
}
if (((BP7==1) && (UART1_Tx_Idle() == 1))) // Check le BP7 et le buffer
{
Lcd_Out (1, 9,"COMPTEUR"); // On l'affiche sur le LCD de l’émetteur
var0--; var1--; var2--; var3--; var4--; var5--; var6--; var7-=5; // On décrémente nos compteurs
sprintf(P_Variable,"%3d %3d %3d %3d %3d %3d %3d %3d",var0,var1,var2,var3,var4,var5,var6,var7); // On convertit
UART1_Write_Text(P_Variable); // Envoie du texte
UART1_Write(13); // envoie un CR
UART1_Write(10); // Envoie un CL
while (BP7==1); // Anti rebond
}
if (((Flag_Erreur==1) && (UART1_Tx_Idle() == 1))) // Check le le flag erreur et le buffer
{
Lcd_Out (1, 1, "Erreur"); // Si erreur on l'affiche sur le LCD
UART1_Write(13); // envoie un CR
UART1_Write(10); // Envoie un CL
Flag_Erreur=0; // On RAZ le flag
delay_ms(1000);
_asm reset; // On RESET
}
}
}

Alors pour le moment je suis pas radin sur la mémoire et je fais au plus simple.