Je souhaite récupérer des données (temps) sur un chronomètre TAG HEUER CP520 en passant par une arduino Uno. Le chronomètre CP520 dispose d'une prise RJ12 RS232 selon la documentation.
Cela ne correspond pas au format que je suis censer recevoir...
En cherchant sur les différents forum j'ai trouvé une piste avec un code dans ce style :
char buffer[30];
if (CP520.available() > 0) {
int n = CP520.readBytesUntil('\r', buffer, 30);
// n est la longueur reçue
}
Mais j'ai que des 0 en retour ..
Je pense que mon branchement est correct mais que mon code est mauvais ... Je ne sais pas comment faire pour recevoir la trame complete selon le format du CP520.
Pouvez-vous m'aider ?
As-tu testé au multimètre les valeurs de la tension sur la sortie TX du chronomètre ? (ou sur l'entrée RIN du MAX3232)
(ceci pour s'assurer qu'il s'agit bien de niveaux logiques RS232 sur la sortie RJ12 et que donc le MAX3232 est nécessaire avec l'adaptation de tensions et l'inversion logique qu'il apporte)
le terme 'protocole RS232' est parfois utilisé en présence de signaux aux 'niveaux TTL'
Les trois premiers temps sont corrects mais pas le reste. La transmission a lieu trop vite et l'Arduino ne suit pas avec ce code et le port serie virtuel ?
Edit :
Avec la proposition de @kamill c'est ok j'ai bien tout
Il me reste maintenant à gérer ces valeurs pour les enregistrer sous en .txt ou .csv sur une carte SD ... Je vais regarder comment faire ça. J'ai un module micro SD en I²C.
softwareSerial monopolise pas mal de ressources lorsque le débit est relativement bas car il y a des attentes assez longues. De fait, le temps pour sortir sur Serial doit se trouver limité, en augmentant le débit sur cette sortie on maximise la possibilité d'afficher toutes le données reçues..
Je suis passé sur un ESP32 pour un gain de place (je n'ai pas d'Arduino nano en stock).
Je souhaite enregistrer les données sur une carte micro SD.
Le code suivant est-il la meilleure solution pour ne pas perdre de données (avec un enregistrement qui arriverait trop tôt) ? Je laisse 3s et si je reçoit rien, alors je lance l'enregistrement ?
@fdufnews : j'ai fait la modif que tu proposes, merci. Et cela devrait aller mieux avec l'ESP32.
@jpbbricole : En copiant collant les données 'brutes' du port serie dans un fichier .txt j'ai bien des sauts de lignes qui se font (donc ok pour une exploitation Excel derrière). Cela sera aussi le cas si j'enregistre les données brutes (cad c dans mon code) ? Ou je doit faire un code plus propre qui sépare bien les chaines ?
Bonjour,
Le but est d'avoir une solution autonome (sans PC) pour récupérer les temps dans un chronomètre sans avoir a saisir les temps manuellement.
Ensuite, les temps sont classés dans un fichier Excel (avec un code VBA pour les différentes catégories et autres selon le n° de dossard).
Comme tu n'utilises pas de println(print + retour à la ligne) sur Serial.
C'est que ton CP520 t'envoi le retour à la ligne, tu n'a donc pas besoin de le rajouter
Mais je ne comprends pas trop ce que tu veux faire.
ton programme appel RecepetionCp520 des qu'il y a quelque chose à lire.
RecepetionCp520 transférant tout ce qu'il lit sur Serial2 sur Serial.
pourquoi ne pas remplacer tout ça par
if (Serial2.available() > 0) {
char c = Serial2.read();
Serial.print(c);
}
Après c'est à toi de décider si tu veux traiter les données sur le microcontrôleur pour une lecture directe dans Excel ou via du code VBA.
Voici une façon de faire, tout se passe dans cette ligne: String chronoTrame = CP520.readStringUntil('\r'); // Lecture jusqu'au caractère CR
où l'on reçoit la trame en une passe jusqu'à \r ou CR.
Cet exemple de programme reçoit via le port CP520 (SoftwareSerial) à 9600 ou depuis la ligne de commande la la console (Serial) à 9600, il y a les 2 réceptions.
Il y a un exemple de trame en entête du programme: R0000100002000000000011.669000
concurrent 2 classé 1 à 11.669
que tu peux copier/coller dans la ligne de commande.
Attention la console doit être paramétrée ainsi:
Cr qu'il y a dans la console est directement exploitable, via cpier/coller, dans Excel.
Merci beaucoup @jpbbricole, j'avais peur qu'un traitement des données de cette façon soit trop long trop et je que je loupe des données reçues sur le port série ... Mais non visiblement après essai.
J'ai modifié un peu le code pour le passer sur un ESP32 et cela fonctionne parfaitement.
Penses-tu que j'ai le temps d'enregistrer en direct les données sur une carte micro SD dans le void chronoDecode() à la place des Serial.print sans perdre de données ? Je ne peux pas faire l'essai rapidement ... mon module micro SD est cramé (j'ai commandé un nouveau).
Je fonctionne de cette façon pour ce test pour avoir un void lisible. J'ai d'autre lignes de codes dans le void loop non partagées ici car elles fonctionne correctement.
je suppose que c'est très tributaire de la prise du temps.
c'est quoi que tu appel un void, la fonction loop ?
En fait cela ne change pas réellement le fond de ma remarque, sauf si tu as des cas ou tu as des lectures de données pendant plus de 3s
Sauf cas particulier, si tu as des données tu les lis, puis tu passe au autre chose à faire dans ta loop.
Une fois fini, la loop étant rappelé immédiatement, elle va vérifier si il y des données qui sont arrivée entre temps, sinon le code restant est exécuter directement.
Je ne sais pas si je suis très claire ?
@terwal : oui oui c'est clair et je suis d'accord. Je voulais bloqué le loop sur la lecture et ne pas passer à la suite du code mais c'est pas la meilleure méthode surement.
Avec le code de @jpbbricole c'est plus simple que ma version.