Gambas France BETA


Pas de compte ? Incription

Récuperer tous les caractères d'une chaine...(GB2)

1
AuteurMessages
spheris#1 Posté le 6/12/2012 à 23:58:35
Bonsoir,
Je récupère une chaine alphanumérique par RS232 toutes les secondes environ de ce type :

13234567

Je sépare les 4 premiers caracteres qui correspond à une valeurs d'un capteur
Les 4 de droites correspondent à l'autre capteur.

En RS232 sur vieux PC aucun souci, la chaine est recu quasi instantannée, et je la traite directement dans la fonction :

1
2
3
4
5
6
PUBLIC SUB SerialPort1_Read()
DIM madonneerecue AS STRING
READ #SerialPort1, madonneerecue, Lof(SerialPort1)
capteur1.text = Left$(madonneerecue,4) 'textbox 1
capteur2.text = Right$(madonneerecue,4) ' textbox2
END


et ça marche très bien.
Le problème se pose avec adaptateur USB/RS232 sur nouveau PC. La chaine est réceptionnée mais est plus longue, du coup probleme de traitement.
comment dois-je m'y prendre pour ajuster cette latence et recevoir toute la donnée complète ?
Merci de vos réponses
;)

Foromus#2 Posté le 7/12/2012 à 09:10:50
Bonjour,

Sans avoir la prétention de répondre au problème :
Est-ce que la donnée reçue est de longueur différente à chaque fois ? (Len = 7 ou 8 sou 9 suivant les cas)
Si tel n'est pas le cas - la longueur est fixe, un Mdl$(a,b) (ou qqchose du genre que je n'ai pas exactement en tête), permettrait une extraction correcte.
Si c'est le cas - longueur aléatoire, le souci sera de repérer où sont les deux bonnes données dans le fatras. Il faut d'abord voir ce qui est exactement compris dans la valeur "madonneerecue" et si sa longueur est bien aléatoire ou pas.

Mais je suppose que ce raisonnement a déjà été fait...
Bon, maintenant, je dis que sur mon ordinateur, pas si vieux quand même, il y a toujours les deux ports (prises) série et parallèle...
spheris#3 Posté le 8/12/2012 à 06:20:12
Foromus,
Merci pour ta réponse.
En fait, la différence fondamentale entre le RS232 et l'usb est qu'en RS232 'madonneerecu' est une chaine reçue dans sa totalité immédiatement alors qu'en USB je recois morceau par morceau pour finalement avoir la chaine complète.
Mais Je pense que la solution est dans ce que tu dis. Compter le nombre de caractere me parait une bonne solution, ou ajouter des bornes.

La taille de madonnerecu est de 8 caracteres et ne change jamais.
Foromus#4 Posté le 8/12/2012 à 09:00:32
Bonjour Spheris,

Exact en ce qui concerne la différence entre RS232 et USB !
Bon, maintenant, je ne comprends pas trop... Si madonnerecue fait toujours 8 caractères, où est le problème ?
Si c'est le fait qu'elle arrive par morceaux, pas de problème non plus : il suffit d'attendre, au fur et à mesure qu'elle arrive, qu'elle fasse ses 8 caractères et quand elle les a - et seulement après qu'elle les ait, on la traite, non ?... Avec un len, il est facile de la bloquer tant qu'elle n'a pas le compte.
Autrement, ce que je disais ci-dessus, c'est qu'un ordinateur a toujours ses ports série et parallèle, maintenant, pourquoi passer par un usb ? A moins d'avoir une carte d'acquisition différente ? Car je suppose que les capteurs sont bien reliés à une carte avant de pouvoir être pris en compte par un programme ?..

A une époque, il me souvient d'un magasin qui proposait justement une carte d'acquisition, laquelle pouvait recevoir une bonne dizaine de capteurs, logiques et analogiques (genre inter ou thermostat, etc.), et qui devait être programmée en Visual Basic. Je suppose que ça existe encore, j'aimerais bien retrouver des détails là-dessus. Juste pour le plaisir car si je parle ne mettre un ordinateur pour piloter la chaudière, je me fais tuer sur place par ma compagne...
spheris#5 Posté le 8/12/2012 à 11:55:47
Merci foromus,
Maintenant passons à la pratique :
Question : Ou mets-tu le LEN ?

1
2
3
4
5
PUBLIC SUB SerialPort1_Read()
DIM madonneerecue AS STRING
READ #SerialPort1, madonneerecue, Lof(SerialPort1)
TextArea1.Insert(madonneerecue & Chr$(10))
END


Il semble qu'avec le RS232, toute la chaine envoyée d'un coup , la fonction Read est lue 1 fois
avec l'usb il semble que la chaine soit lue plusieurs fois.
Le LEN est mal placé dans cette fonction là, ne crois-tu pas ?
;)
Jack#6 Posté le 8/12/2012 à 12:51:45
Salut,

je ne sais pas comment fonctionne l'USB car je n'ai jamais utilisé. Je suis comme Foromus, j'utilise du RS232.

La solution est peut-être de passer par une boucle.

PUBLIC SUB SerialPort1_Read()
DIM madonne,madonneerecue AS String
while len(madonne) < 8
READ #SerialPort1, madonneerecue, Lof(SerialPort1)
madonne &= madonneerue
wend
capteur1.text = left$(madonne,4) 'textbox 1
capteur2.text = Right$(madonne,4) ' textbox2
END
Pour un code démocratique nationalisons Gambas.
Foromus#7 Posté le 8/12/2012 à 13:32:48
Bonjour,

Effectivement, je pensais à utiliser un boucle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
PUBLIC SUB SerialPort1_Read()
DIM madonneerecue AS STRING
DIM Tempo AS STRING
DIM Secu AS INTEGER

Secu =0
Tempo = ""
DO
READ #SerialPort1, madonneerecue, Lof(SerialPort1)
Tempo = Tempo & madonneerecue
Secu += 1
IF Secu > 10 THEN RETURN ' Pour sortir de la boucle si ça merde...
LOOP UNTIL Len(Tempo) = 8
....
....

TextArea1.Insert(madonneerecue & Chr$(10))
....
....
CATCH
Message.Info(" Souci avec la collecte...")

END


Bon, en priorité, il faudrait d'abord de voir ce qui sort de Read #Serial Port1". En mettant un point d'arrêt à cette ligne, et en faisant un pas-à-pas F6, on devrait pouvoir lire concrètement ce qui est retenu, non ?
Après, n'ayant pas utilisé le système, ce que je dis, c'est purement théorique...
1