ABCelectronique : portail d'information dans le domaine de l'électronique

Merci de ne pas poster des messages en relation avec le piratage.


    Forums de Abcelectronique > Software / Péri-informatique
  » [Résolu] UART1_Read_Text avec MikroBasic me fait des cheveux gris
Identifiant Se souvenir de moi ?
Mot de passe
Répondre     Nouvelle discussion
[Résolu] UART1_Read_Text avec MikroBasic me fait des cheveux gris

 

pierrelec
pierrelec ★★★★★☆☆ 23/12/2016, 16h47 #1  
Bonjour,
Considérant la trame NMEA suivante :
$GPRMC, ------------*15 CR LF (15 étant le cheksum)
J’arrive à récupérer ce qui se trouve entre $ et * avec le code MikroBasic suivant :

Code:
Delim as string[1] ' déclaration du délimiteur Delim[0] = chr(42) ' ASCI 42 = * Delim[1] = "" ' Zéro terminal if (UART1_Data_Ready() = 1) then UART1_Read_Text(Rec, Delim, 255) ' La trame entre $ et * se trouve dans Rec end if


Avec le code suivant je voudrai récupérer tout ce qui se trouve entre $ et CR, afin de pouvoir extraire le cheksum qui se trouve entre * et CR mais ceci ne fonctionne pas.

Code:
Delim as string[1] ' déclaration du délimiteur Delim[0] = chr(13) ' ASCI 13 = CR Delim[1] = "" ' Zéro terminal if (UART1_Data_Ready() = 1) then UART1_Read_Text(Rec, Delim, 255) ' Ceci ne fonctionne pas end if


Ou est l'astuce ? Cela fait 2 jours que je cherche.
rlo69
rlo69 ★★★★☆☆☆ 23/12/2016, 17h10 #2  
Bonjour,

à quoi correspond le tableau string[ ] ?
Rec est défini comment ?
Dans le 2e code tu récupères quoi comme information dans Rec ?

Pourrais-tu mettre le code pour UART1_Read_Text ?

Cordialement
pierrelec
pierrelec ★★★★★☆☆ 23/12/2016, 19h08 #3  
Bonjour et merci pour votre réponse

à quoi correspond le tableau string[ ] ?
Au stockage de la trame reçue

Rec est défini comment ?
dim Rec as string[85]

Dans le 2e code tu récupères quoi comme information dans Rec ?
Rien il semble que le programme se fige.

Pourrais-tu mettre le code pour UART1_Read_Text ?
Je ne vois pas exactement ce que tu demande, voici la description de cette procedure

sub procedure UARTx_Read_Text(dim byref Output as string[255], dim byref Delimiter as string[10], dim Attempts as byte)

Reads characters received via UART until the delimiter sequence is detected. The read sequence is stored in the parameter output; delimiter sequence is stored in the parameter delimiter.

This is a blocking call: the delimiter sequence is expected, otherwise the procedure exits (if the delimiter is not found).

Parameters :

Output: received text
Delimiter: sequence of characters that identifies the end of a received string
Attempts: defines number of received characters in which Delimiter sequence is expected. If Attempts is set to 255, this routine will continuously try to detect the Delimiter sequence.
rlo69
rlo69 ★★★★☆☆☆ 23/12/2016, 22h27 #4  
Bonsoir,

êtes-vous sur que le CR LF sont bien envoyés ?

avez vous la possibilité de mettre un analyseur de protocole pour vérifier la trame envoyée ?

Dans MiKroBasic, le string est un tableau de caractères type char.
Le char est-il un ASCII étendue de $00 à $FF ou ASCII de $00 à 7F ?

Sinon une astuce, lire jusqu'à * ensuite utiliser UARTx_Read pour lire les 3 octets suivants pour voir quels octets sont mis après *

Dans le protocole NMEA le checksum est un octet en hexadécimal donc de $00 à $FF. Ainsi après * vous avez 3 octets à lire : le checksum, le CR et le LF.

Cordialement

Dernière modification par rlo69 24/12/2016 à 00h00.
pierrelec
pierrelec ★★★★★☆☆ 26/12/2016, 10h38 #5  
Bonjour,
Je n'ai pas trouvé de solution pour extraire la trame GPRMC en utilisant Uart1_Read_Text avec le délimiteur CR LF.
J'utilise maintenant la lecture byte à byte avec Uart1_Read pour obtenir la bonne trame.
Double click sur la pièce joint pour la visualiser.
Miniatures attachées
Cliquez sur l'image pour la voir en taille réelle

Nom :  TrameGPRMC.JPG
Affichages : 18
Taille :  18,3 Ko
rlo69
rlo69 ★★★★☆☆☆ 26/12/2016, 11h23 #6  
Bonjour,

Le principal est de trouver une solution qui fonctionne.

Cordialement
pierrelec
pierrelec ★★★★★☆☆ 26/12/2016, 12h04 #7  
Bonjour,
J'ai posé la question sur le forum de Mikroelektronika et leur réponse est, ceci devrait fonctionner.
Code:
Delim as string[1] Delim[0] = chr(13) Delim[1] = "" if (UART1_Data_Ready() = 1) then UART1_Read_Text(Rec, Delim, 255) end if

Mais ce n'est pas le cas.
rlo69
rlo69 ★★★★☆☆☆ 26/12/2016, 13h22 #8  
Bonjour,

Sur ce lien, la personne a le même problème que toi avec CR, et il a trouvé cette solution, en mettant "\r\n" pour le carriage return et le line feed.
En effet, "\r" est le codage en texte de CR et "\n" et le codage de LF.

Yes actually, to answer the previous post.

I finally got it working with the delimiter sequence set like this
///////////////////////////////////////////////////////////////////////////////////
if (UART1_Data_Ready()) { // If data is received through UART

//Receive String
UART1_Read_Text(&tagnum,"\r\n",20); //Delimiter: Carriage return and new line feed
Lcd_Out(2, 1, tagnum);

RCREG=0; //Set receive registry to zero
Répondre