Rs232 acquisition temps reel

Signaler
Messages postés
2
Date d'inscription
lundi 18 novembre 2013
Statut
Membre
Dernière intervention
19 novembre 2013
-
Messages postés
2
Date d'inscription
lundi 18 novembre 2013
Statut
Membre
Dernière intervention
19 novembre 2013
-
bonjour,
j'ai ecrit une petit routine qui lit le port serie( 115200 baud) a travers vba et affiche le resultat sur un graphe.
En fait je lis lis a travers un micro plusieurs register I²C
( 6registres) mais je n'arrive pas a lire toutes mes datas car ells sont cadence a 800HZ, ma boucle rate une ou plusieurs valeurs.
J'aimerais pourvoir lire mes registres toutes les 1ms .
Y' a t'il un moyen de ne plus vaoir de latence dans mes lecture ou de forcer une lecture toutes les 1ms?

Ci dessous mon code :


Merci
Philippe

Do While CB_RUN_DEMO.Caption = "STOP"
ec.AsciiLine = "R01-06" lecture des 6 registres a travers RS232
ec.WAITmS = 0.1
n = ec.AsciiLine

XOUT_MSB = H2D(Left(n, 3))
XOUT_LSB = H2D(Mid(n, 4, 3))
YOUT_MSB = H2D(Mid(n, 7, 3))
YOUT_LSB = H2D(Mid(n, 10, 3))
ZOUT_MSB = H2D(Mid(n, 13, 3))
ZOUT_LSB = H2D(Right(n, 3))


'intff = H2D(ec.AsciiLine)


If i > 1000 Then

i = 1000

Range("Y2:AC1000").Copy Range("Y1:AC999")

End If

XOUT = SL(XOUT_MSB, 6) + SR(XOUT_LSB, 2)
YOUT = SL(YOUT_MSB, 6) + SR(YOUT_LSB, 2)
ZOUT = SL(ZOUT_MSB, 6) + SR(ZOUT_LSB, 2)

Worksheets("Demo").Cells(i, 25) = IIf(XOUT < 8192, XOUT, XOUT - 16384)
Worksheets("Demo").Cells(i, 26) = IIf(YOUT < 8192, YOUT, YOUT - 16384)
Worksheets("Demo").Cells(i, 27) = IIf(ZOUT < 8192, ZOUT, ZOUT - 16384)

i = i + 1


Loop

2 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Bonjour,
Essaye plutôt de passer par un tremplin (un tableau dynamique, par exemple) que tu alimentes par les données brutes. Cela réduira considérablement la durée de chaque enregistrement (évitera tant les calculs que la mise à jour de tes cellules)
Utilise in fine ce tableau pour faire toutes tes opérations et mises à jour.
Messages postés
2
Date d'inscription
lundi 18 novembre 2013
Statut
Membre
Dernière intervention
19 novembre 2013

Bonjour,
merci pour cette suggestion je vais regarder .
Par contre si je ne veux pas afficher de resultats sur un graphe mais juste faire des accès sur le port série, y'a til le moyen de controler ou de forcer le temps de la boucle?
Le but etant toujours de recuperer les informations toutes les 1 ms .

Le code serait le suivant :

Do While CB_RUN_DEMO.Caption = "RUN"
ec.AsciiLine = "R00" 'lecture continue de ce registre
ec.WAITmS = 0.1
If ec.AsciiLine = 1 Then
ec.AsciiLine = "R01-06" 'register "x y z" 01 to 06
ec.WAITmS = 0.1
n = ec.AsciiLine
End If
Loop

Actuellement cette boucle est trop lente .je voudrais garantir que cette boucle ( quand le registre 00 passe a 1) se fasse en moins d'1ms, en considerant que les lectures des registres elle memes se fasse en quelques µs)

Merci de votre aide
Philippe