' Ouais bon, c'est du qbasic, je sais ;) ' ' Ceci est un programme qui permetait de récupérer les données de ' mon multimetre VC670, et même de pouvoir sauvegarder tout ça dans un fichier CSV. ' (La tension secteur ici : http://clx.freeshell.org/gallery/captures/tension_sur_10minutes.png ) ' ' Ce multimetre envoi des salves de 14 octets, si on tentait directement de lire une chaine ' de 14 octets tout simplement, ce n'etait pas très fiable parce que parfois, il y avait ' quelques octets et ça décalait tout, mais il y a dans ce code quelques astuces qui rendent ' ça un peu plus fiable, comme par exemple une synchronisation, ou faire attendre au programme ' la chaine du mode qu'il doit recevoir. Mes excuses pour ne pas avoir commenté tout ça ^^' ' ' ' Touches: ' L .......... Définir des limites basses et hautes (bip et marque low et high en dehors) ' M .......... Utiliser un autre mode (VAC pour tension alternative par exemple.) ' F .......... Sort les données en CSV. ' S .......... Forcer une resynchronisation ' C .......... Redetecte la longueur du train de données (GEEK!) ' Escape ..... Ferme le port et quitte ' ' C'etait aussi une tentative pour essayer de faire du qbasic "propre" (c'est à dire sans ' trop de GOTOs, et indenté, et avec des fonctions...) Ais-je reussi ? Ben c'est à vous de ' juger ;) ' ' cLx ' http://clx.freeshell.org/ ' Juillet 2003 ' DECLARE SUB center (row!, text$) DECLARE SUB fenetre (couleur) DECLARE SUB setlimits () DECLARE SUB bottom () DECLARE SUB fileout () DECLARE SUB lgdatacount () DECLARE FUNCTION value! (data$) DECLARE SUB synchro () DECLARE FUNCTION textonly$ (x$) DECLARE SUB notify (texte$) ON ERROR GOTO erro Cls notify ("Démarrage du programme...") SLEEP 1 x = 0 lgdata = 10 lstate = 0 recmode = 0 mode$ = "OH" lhaute = 800000000 lbasse = 0 OPEN "com1:4800,n,7,2,rs,cs,ds,cd" FOR RANDOM AS #2 notify ("Attente Connexion...") lgdatacount WHILE (1) visu$ = RIGHT$(visu$, 1) + LEFT$(visu$, 7) 'on prend 'lgdata' caracteres, mais on vire le CR qui est a la fin. in$ = INPUT$(lgdata, #2) in$ = LEFT$(in$, lgdata - 1) a$ = INKEY$ IF (a$ <> "") THEN IF a$ = CHR$(27) THEN notify ("Fermeture du port. Fin du programme.") CLOSE SLEEP 1 SYSTEM: END END IF a$ = UCASE$(a$) IF a$ = "M" THEN bottom PRINT TIME$; "> Entrez l'ident du mode :"; LINE INPUT mode$ mode$ = UCASE$(mode$) END IF IF a$ = "C" THEN lgdatacount IF a$ = "F" THEN fileout IF a$ = "S" THEN synchro IF a$ = "L" THEN setlimits END IF IF (x) THEN text$ = textonly(in$) IF (LEFT$(text$, 2) <> mode$) THEN IF (x <> -1) THEN ' On demande de passer le multimetre sur ' le mode correct. IF mode$ = "OH" THEN notify ("[REQ] Passer le multimetre en ohmmetre...") ELSE notify ("[REQ] Passer le multimetre en mode " + mode$ + "...") END IF x = -1 tmer = TIMER ELSE ' Decompte pour la synchro automatique LOCATE 23, 60 temp = 30 - INT(TIMER - tmer) IF temp < 0 THEN synchro: x = 0: ELSE PRINT temp END IF ELSE ' Marche de croisiere... text$ = MID$(text$, 3, 1) IF text$ = "M" THEN factor = 1000000 ELSEIF text$ = "K" THEN factor = 1000 ELSE factor = 1 END IF dat = value(in$) * factor IF (x = -1) THEN synchro LOCATE 1, 5 ' Sauvegarde des données IF (recmode = 1) THEN PRINT #1, TIMER - timerref; CHR$(9); dat IF reccoul THEN reccoul = 0: ELSE reccoul = 4 COLOR reccoul ELSE COLOR 0 END IF PRINT "[REC] "; COLOR 14 IF dat < lbasse THEN PRINT "[LOW] "; IF lstate <> -1 THEN notify ("Limite basse depassée (" + STR$(dat) + ")") lstate = -1 SOUND 1000, 1 SOUND 500, 2 END IF ELSEIF dat > lhaute THEN PRINT "[HIGH]"; IF lstate <> 1 THEN notify ("Limite haute depassée (" + STR$(dat) + ")") lstate = 1 SOUND 1000, 1 SOUND 2000, 2 END IF ELSEIF lstate <> 0 THEN SOUND 100, 1 lstate = 0 alarm (0) END IF PRINT " ", COLOR 7 PRINT x, in$, "-> "; dat, x = x + 1 END IF ELSE notify ("Premiere lecture effectuée : " + in$) x = 1 END IF WEND notify ("Programme terminé.") CLOSE END ' TRAITEMENT DES ERREURS erro: IF (ERR = 57) THEN notify ("Erreur d'entrée/Sortie...") synchro ELSEIF (ERR = 69) THEN notify ("Debordement du tampon d'E/S...") synchro RESUME ELSE SOUND 1000, 1 notify ("Erreur" + STR$(ERR) + " à la ligne" + STR$(ERL) + " ! Continuer ? [O/N]") DO a$ = UCASE$(INKEY$) IF (a$ = "O") THEN EXIT DO IF (a$ = "N") THEN notify ("Fermeture du port. Lancement d'une erreur.") CLOSE #2 SLEEP 3 ON ERROR GOTO 0 RESUME EXIT DO END IF LOOP END IF RESUME SUB bottom COLOR 7, 0 LOCATE 18, 1 PRINT SPACE$(80); LOCATE 24, 2 END SUB SUB center (row, text$) LOCATE row, INT(42 - LEN(text$) / 2) PRINT text$; END SUB SUB fenetre (couleur) COLOR 15, couleur FOR y = 3 TO 12 FOR x = 20 TO 60 STEP 5 LOCATE y, x PRINT " "; NEXT x NEXT y END SUB SUB fileout SHARED recmode SHARED timerref IF (recmode <> 1) THEN notify ("Enregistrement lancé.") recmode = 1 OPEN "file_out.csv" FOR APPEND AS #1 timerref = TIMER ELSE notify ("Enregistrement stoppé.") recmode = 0 CLOSE #1 END IF END SUB SUB lgdatacount SHARED lgdata synchro notify ("Detection de la longueur du train de données...") LOCATE 23, 60 lgdata = 1 in$ = INPUT$(1, #2) WHILE (in$ <> CHR$(13)) lgdata = lgdata + 1 in$ = INPUT$(1, #2) WEND PRINT " =>"; lgdata; "Octets." END SUB SUB notify (texte$) bottom COLOR 7, 0 PRINT TIME$; "> "; texte$ END SUB SUB purge in$ = INPUT$(1, #2) notify ("Vidage du tampon...") LOCATE 23, 45 WHILE (in$ <> CHR$(13)) PRINT in$; in$ = INPUT$(1, #2) WEND END SUB SUB setlimits SHARED lbasse SHARED lhaute SOUND 1000, 1: SOUND 2000, 2 bottom PRINT TIME$; "> Entrez la limite basse :"; INPUT lbasse bottom PRINT TIME$; "> Entrez la limite haute :"; INPUT lhaute synchro END SUB SUB synchro in$ = INPUT$(1, #2) notify ("Synchronisation en cours...") LOCATE 23, 45 WHILE (in$ <> CHR$(13)) PRINT in$; in$ = INPUT$(1, #2) WEND END SUB FUNCTION textonly$ (x$) chaine$ = "" FOR a = 1 TO LEN(x$) y$ = UCASE$(MID$(x$, a, 1)) y = ASC(y$) IF (y < 91) AND (y > 64) THEN chaine$ = chaine$ + y$ END IF NEXT a textonly$ = chaine$ END FUNCTION FUNCTION value (z$) x$ = "" FOR a = 1 TO LEN(z$) y$ = MID$(z$, a, 1) y = ASC(y$) IF (y < 58) AND (y > 47) THEN x$ = x$ + y$ ELSEIF y = 46 THEN x$ = x$ + "." END IF NEXT a value = VAL(x$) END FUNCTION