Question

Je travaille avec un PIC18F et essaie d'envoyer des données via HyperTerminal. Lorsque j'envoie des données à un rythme lent en appuyant sur une touche toutes les demi-secondish il reçoit les données et echos correctement mais quand je commence à appuyer sur les touches à un rythme plus rapide de la MCU se bloque. Je ne sais pas ce qui cause cela.

while(index<length){
    while(PIR1bits.RCIF==0); // Wait till char recieved
    sendData(str2,9); // confirm reception

    Delay1KTCYx(5); //delay because without it, it messes up.
    rxData[index]= RCREG; //char array
    index++;
}

2400 est baudrate Sur les deux PIC et HyperTerminal.

Ceci est notre boucle de réception. sendData est juste le code de débogage que nous envoyons en disant « avons reçu ». Il est comment nous savons quand il a gelé.

Il ne gèle pas à la même quantité de boucles à chaque fois, il est uniquement sur la façon dont les données d'entrée rapide que nous.

Était-ce utile?

La solution

(j'ai travaillé sur MCUs mais pas un accord avec PICs, donc je vais essayer d'aider avec des problèmes communs)

  1. Vous ne vérifie pas tous les indicateurs d'erreur du récepteur. Récepteur peut se bloquer dans l'état d'erreur et ne Overrun reçoivent pas plus loin, jusqu'à ce que vous videz drapeau Overrun. Ajout d'une vérification des conditions d'erreur et de les résoudre accordinly à la documentation PIC.

  2. La bonne pratique consiste à lire l'octet reçu plus tôt, possible quand recevoir complète est indiquée, alors essayez de déplacer rxData[index]= RCREG; imediately après while(PIR1bits.RCIF==0);. Cette possibilité d'abaisse

  3. Vous avez un code non affiché pour sendData. Il peut manquer de vérifier pour TX prêt et les conditions d'erreur, il peut aussi se bloquer.

  4. délai démotivés indique que vous allez déjà mal quelque part. Essayez de le supprimer et puis le code de débogage.

  5. Vous devez tester votre recevoir et transmettre séparément. Dans un premier temps, l'émetteur de contrôle: essayez de longue ligne de sortie du texte par UART sans réception. (Say, écrire "Bonjour tout le monde!" Programme:))

  6. Vérifiez le code de récepteur seul: supprimer la transmission du programme, LED de connexion (voltmètre, oscillosocope, tout ce que vous avez) pour libérer la broche GPIO, puis faire basculer le niveau logique sur chaque fois qu'il reçoit un octet. Est-il ne prend que plusieurs tiques horloge à faire, il ne devrait pas intervenir la réception ou le blocage.

Autres conseils

Peut-être que lorsque vous envoyez 2 caractères alors qu'il est occupé à envoyer le « reçu » l'un d'entre eux est jeté et vous ne parviennent jamais à votre length?

Sur la plupart des micro-contrôleurs, un dépassement du récepteur UART provoquera l'octet nouvellement reçu à être mis au rebut et un drapeau pour être ensemble, mais le récepteur continuera à fonctionner normalement. Sur le PIC, un dépassement du récepteur entraînera l'UART mourir jusqu'à ce que le bit CREN est effacé et re-jeu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top