supergalaboy
Messages postés6Date d'inscriptionmardi 30 mai 2006StatutMembreDernière intervention13 janvier 2010
-
21 nov. 2008 à 10:53
NHenry
Messages postés15156Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention29 septembre 2024
-
25 nov. 2008 à 12:28
Bonjour à tous,
Je rencontre un petit problème dans le développement d'une application en VB 2005.
L'application est connectée à un automate qui envoi 3 trames différentes à la vitesse de 1 trame par secondes. Le format des trame sont:
10 02 90 XX XX ... XX XX 10 03
10 02 91 XX XX ... XX XX 10 03
10 02 92 XX XX ... XX XX 10 03
ou les XX représentent la donnée. La difficulté supplémentaire est que la longeur des trames n'est pas fixe (d'ou les ...), la longueur dépend de la présence ou pas de la valeur hexa 10 dans les données. Si une des donnée = 10 alors, l'automate rajoute un 10 devant cette valeur pour montrer que c'est bien de la donnée et non pas le 10 (du 10 03) qui annonce la fin de la trame.
Actuellement, j'utilise le SerialPort pour récupérer par événement la réception des trames.
Après ça, je regarde combien d'octet sont présent dans le buffer et je lis le buffer en mettant les données dans un tableau. Suite à cela, je fais une boucle qui cherche dans le tableau le début d'une trame et une fois détecté, j'affecte les valeurs à des variables.
Mon problème arrive à ce moment là. Puisque les trames ont des longueurs aléatoires (ajout des 10 devant les 10), je ne peux pas directement affecter la donnée à la bonne variable. Je cherche donc un moyen de détecter la fin de la trame 10 03 afin d'être sur d'avoir toute la trame, pour après supprimer les 10 redondant et enfin pouvoir affecter les différentes valeurs aux variables.
Auriez vous des idées pour m'aider?
Merci d'avance
P.S: voici mon code:
Private Sub RS232_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles RS232.DataReceived
Dim nb_octet As Integer = RS232.BytesToRead ' on récupère le nombre d'octet présent dans le tampon
Dim trame(nb_octet - 1) As Byte ' Tableau acceuillant les données au format byte
Dim i As Integer
RS232.Read(trame, 0, nb_octet) 'on lit le port
For i = 0 To nb_octet If trame(i) 16 And trame(i + 1) 2 And (trame(i + 2) = 145 Or trame(i + 2) = 146) Then
' 1) J'ai détecter le début de la trame, je voudrais trouver la fin de celle-ci et avoir la trame complète dans une variable (TrameRecu)
' 2) Je supprime dans la variable TrameRecu les 10 en trop
' 3) J'affecte chaque octet à une variable
Dim Value1 = mid(....)
Dim Value2 = mid(...)
Dim Value3 = mid(...)
End If
NHenry
Messages postés15156Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention29 septembre 2024159 21 nov. 2008 à 12:36
Bonjour,
Je te propose une implémentation :
En attribut :
private mBufferData as new list(of byte)
private mLastEscapeChar as boolean
Ensuite dans l'event :
Private Sub RS232_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles RS232.DataReceived
Dim ltRecv As byte()
redim ltrecv(RS232.BytesToRead-1) ' on récupère le nombre d'octet présent dans le tampon
rs232.Read(ltrecv,0,ltrecv.length)
for i as integer=0 to ltrecv.getupperbound(0)
if ltrecv(i)=&h10 then
if mlastescapechar then
mlastescapechar=false
mBufferData.add(ltrecv(i))
else
mlastescapechar=true
end if
elseif mlastescapechar then
select case ltrecv(i)
case 2
mBufferData.clear
case 3
'Evenement pour fin de trame
end select
mlastescapechar=false
else
mBufferData.add(ltrecv(i))
end if
Next i
End Sub
supergalaboy
Messages postés6Date d'inscriptionmardi 30 mai 2006StatutMembreDernière intervention13 janvier 2010 25 nov. 2008 à 09:17
Bonjour,
c'est un CRC 16 classique. J'arrive bien à vérifier que ma trame est bonne. Après ça, je découpe ma trame en plusieurs variables (variable de 1 byte ou 2 byte en fonction de la valeur (c'est de l'hexa)).
L'idéal serait d'avoir un compteur qui indique le numéro de la ligne dans laquelle je souhaite écrire le fichier excel et après, que je balaye les cases de cette ligne de la gauche vers la droite en écrivant mes valeurs dedans.
J'ai regardé sur le forum, dans tous les exemples, les données passent dans un dataset pour aller dans l'excel mais je suppose qu'il est possible de copier directement la valeur Hexa dans une case excel. non?
Merci de ton aide
Bonne journée
Vous n’avez pas trouvé la réponse que vous recherchez ?