Concaténation des valeur reçu du prot com

Signaler
Messages postés
21
Date d'inscription
dimanche 14 février 2010
Statut
Membre
Dernière intervention
14 février 2010
-
Messages postés
21
Date d'inscription
dimanche 14 février 2010
Statut
Membre
Dernière intervention
14 février 2010
-
je suis débutant dans vb et je veut lire les valeur qu'envois mon pic 16f877 et les concaténer
le pic envois 32bit par un bloc de 8 bit donc il faut que mon application vb concaténe les valeurs reçu à partir du port com
j'ai déja trouvé une application qui reçois ces valeur à partir du port com sauf que je ne sais pas comment faire pour reconstruire la valeur envoyé?
je suis etudiant en génie mécanique et c'est dans le cadre de mon projet de fin d'étude que je doit réaliser cet application alors merci infiniment de votre aide...

11 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
Salut et bienvenu
Est-ce que ton périférique t'envoie des Bits (0/1) ou des Bytes (0/255) ?
Parce que je ne vois pas trop comment tu peux récupérer actuellement des Bits. Faudra donner des explications.
De toute façon, ce que tu récupèreras sera sous forme de Bytes, eux même constitués de Bits.

Si tu dois concaténer les données reçues, il va de soi que tu dois mémoriser les valeurs reçues à l'instant T, puis ajouter celles reçues à T+1, etc
Pour cela, il te suffit de déclarer une variable de stockage dans la partie déclaration de la page de code de ta forme. De cette façon, elle gardera son contenu entre deux exécutions de ton code de lecture du port COM.
Private maVariableStockage As String ou
Private maVariableStockage() As Byte
selon que tu travailles avec des String ou des Bytes.

Concaténation :
Si les données récupérées sont de type String, facile : juste à faire
maVariableStockage = maVariableStockage & mesDonnéesReçue
Pour les Bytes, c'est plus compliqué puisque tu auras surement recours à un tableau de Bytes, mais les tableaux ne se concatènent pas.
Supposons que maVariableStockage() soit un tableau d'actullement 16 données (0 à 15)
Supposons que tu viennes de lire 18 données de ton port COM. mesDonnéesReçue() sera donc un tableau de 0 à 17.
Pour concaténer ces tableaux, il te faut d'abord redimensionner maVariableStockage() pour qu'elle puisse accueillir les nou_velles données :
Juste avant, on va mémoriser le n° du dernier élément existant (on en aura besoin juste après)
NbBytes = UBound(maVariableStockage)
[color=blue]Redim Preserve maVariableStockage(0 To (NbBytes + UBound(mesDonnéesReçue) + 1))
Puis faire une boucle de transfert :
For r = 0 To UBound(mesDonnéesReçue)
maVariableStockage(NbBytes + 1 + r) = mesDonnéesReçue(r)
Next r

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
21
Date d'inscription
dimanche 14 février 2010
Statut
Membre
Dernière intervention
14 février 2010

merci monsieur jack
je vais vous donner un exemple
je reçois dans mon port COM 243,5 sous la forme binaire biensur (0et1) sauf que le pic envois chaque chiffre tout seul et sur 8 bit donc je reçois sur mon port COM chaque chiffre tous seul et je devrais les reconcaténer
je vais essayer et je vous donnerai de mes nouvelles
merci et bonne année...
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
243,5 ?
Je me demande bien sous quelle forme ?
S'il s'agit d'un LittleEndien, c'est encore une autre affaire ...

Oui, sur 8 bits, c'est à dire 1 Byte !
Tu reçois 1 Bytes après l'autre parce que TU as choisis de ne lire qu'un Byte.
Au moment de ta réception de données, tu peux connaitre la longueur du Buffer, c'est à dire le nombre de Bytes à lire : Si tu lis ces données au travers d'un tableau dimensionné au nombre de Bytes à lire, tu auras lu, en une fois, tous les Bytes disponiles.
Mais cela restera un tableau de Bytes.
Si les Bytes correspondent aux codes ASCII des chiffres 2, 4, 3 et 5 (c'est à dire 50, 52, 51 et 53), tu peux faire simple en lisant directement une chaine String judicieusement dimensionnée à la longueur du Buffer.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
21
Date d'inscription
dimanche 14 février 2010
Statut
Membre
Dernière intervention
14 février 2010

merci encore 1000 fois
mais ça serait inoubilable de votre part si vous me donniez un exemple pour que je comprene ce buffer parce qu'à vrai dire je n'ai aucune idée de quoi sagit
je suis un vrai débutant et je n'ai jamais étudié de la programmation da ma vie
et je doit faire fonctionner cet application
dans la suite je vous fournis un cahier des charges pour que vous me guidez mieu

j'ai un fluide sous pression et je veut afficher la courbe de la pression en fonction du temps sur excel
je dispose de :
un capteur de pression qui convertie une pression en un signal 4-20mA
j'ai déjà convertie le signal 4-20mA en RS232 en réalisant une carte d'interface dans la quel j'ai utilisé le PIC 16f877
j'ai programmé le PIC de tel sorte qu'il envois 32bit par bloc de 8 bit donc pour envoyer 253,4 j'envoie chaque chiffre tous seul sur 8 bit par la suite j'ai besoin d'une interface visuel pour exploiter le signal à partir du port COM
Pour cela je doit créer une application qui réalise les taches suivantes:
lire les valeur à partir du port COM
concaténer les chiffres reçus
attribuer à chaque valeur reçu son temps correspondant
afficher un tableau dans le quel on a une valeur de la pression qui correspond à un temps bien définis
exemple de tableau que je voudrais réaliser

Pression en bar 20 22 25
Temps 10:12:30 10:13:00 10:13:30

Si je pourrais avoir un tableau comme ci dessus mon problème sera résolu
je voudrai avoir un programme qui me permet de choisir le temps échantillonnage
j'ai commencer à apprendre le langage Visual Basic mais je sais pas par quoi commencer ni comment faire
comment réaliser un algorithme et comment etre sur que le programme correspond à mon but
je sais que c'est réalisable mais comment?
C'est dans le cadre de mon projet de fin d'étude et à vrai dire j'ai pas encore trop de temps car les soutenances des projets seront fixé début janvier.
merci infiniment de votre aide
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
Je suis paumé.
Tu lis les données du port série, mais tu ne sais pas comment ...
Tu disais "j'ai déja trouvé une application qui reçois ces valeur à partir du port com"
Donc tu sais comment les données sont lues, non ?

Sinon, tu fais une recherche de "port série" ou "port serie" parmi les Codes (sauf .Net) et tu auras des exemples.

Tout se passe dans le seul et unique évènement de MSComm : "OnComm"
Il te suffit de filtrer la raison du déclenchement de cet évènement pour ne garder que comEvReceive et faire la lecture du buffer du port.
Pour filtrer la raison ..., regarde l'exemple donné dans l'aide de MSComm
Quand tu traiteras comEvReceive, il te suffit de lire le Buffer du port avec Input
Extrait de l'exemple fourni dans l'aide de MSComm dans VB6 pour lire le buffer sous forme ASCII (String) :
Dim CommData as String
' Définit un bloc de données de 10 caractères.
MSComm1.InputLen = 10
' Lit les données.
CommData = MSComm1.Input


As-tu déjà quelque chose qui ressemble à ça dans ton programme ?

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
21
Date d'inscription
dimanche 14 février 2010
Statut
Membre
Dernière intervention
14 février 2010

voici mon programme la seul chose qui me reste c'est la concaténation
je veux tous d'abors envoyer 123,5
le pic envois comme suit
le pic envois 1 sur 8 bit
le pic envois 2 sur 8 bit
le pic envois 3 sur 8 bit
le pic envois 5 sur 8 bit
sauf que le mscomm n'a qu'une seul case de reception (d'apres ce que je sais)donc il faut stocker chaque chiffre dans une case mémoire et par la suite les concaténer pour les mettre dans la case textbox4 de la pression du form1
en plus le cycle que j'ai décrit se repete plusieur fois (30 seconde ou autre) selon le temps d'échtillonage que j'ai choisi

voici mon programme jusqu'à ce moment
j'ai bien sur utilisé le port.dll pour la lecture à partir du com
mon probleme et que toute les valeur reçu sont reçu dans la meme case
comment faire aidez moi s'il vous plait
merci

Private Sub CmdQuitter_Click()
CLOSECOM
End Sub

Private Sub form_load()
Label9 = Date
Label10.Caption = Weekday(Date, vbMonday)
If Label10.Caption "1" Then Label10.Caption "Lundi"
If Label10.Caption "2" Then Label10.Caption "Mardi"
If Label10.Caption "3" Then Label10.Caption "Mercredi"
If Label10.Caption "4" Then Label10.Caption "Jeudi"
If Label10.Caption "5" Then Label10.Caption "Vendredi"
If Label10.Caption "6" Then Label10.Caption "Samedi"
If Label10.Caption "7" Then Label10.Caption "Dimanche"
Label11 = Time
OPENCOM ("com1,1200,n,1")
Timer1.Enabled = True
End Sub

Private Sub Form_Unload(Cancel As Integer)
CLOSECOM
End Sub

Private Sub Timer1_Timer()
TxtRecu.Text = READBYTE
End Sub
Private Sub Timer3_Timer()
Text11 = Time
Timer3.Enabled = False
Text12 = Text4
End Sub
Private Sub Timer4_Timer()
Text13 = Time
Timer4.Enabled = False
Text14 = Text4
End Sub
Private Sub Timer5_Timer()
Text15 = Time
Timer5.Enabled = False
Text16 = Text4
End Sub
Private Sub Timer6_Timer()
Text17 = Time
Timer6.Enabled = False
Text18 = Text4
End Sub
Private Sub Timer7_Timer()
Text19 = Time
Timer7.Enabled = False
Text20 = Text4
End Sub
Private Sub Timer8_Timer()
Text21 = Time
Timer8.Enabled = False
Text22 = Text4
End Sub
Private Sub Command1_Click()
Dim oXL As Excel.Application
Dim oWB As Excel.Workbook
Dim OSheet As Excel.Worksheet
Dim ORng As Excel.Range


'On Error GoTo Err_Handler

'Start Excel and get Application object.
Set oXL = CreateObject("Excel.Application")
oXL.Visible = True

'Obtenir un nouveau classeur.
Set oWB = oXL.Workbooks.Add
Set OSheet = oWB.ActiveSheet



'Créer un tableau pour définir les valeurs à la fois.
Dim saNames(2, 5) As String
saNames(0, 1) = "pression"
saNames(1, 1) = "temps"
saNames(0, 2) = Text11
saNames(1, 2) = Text12
saNames(0, 3) = Text13
saNames(1, 3) = Text14
saNames(0, 4) = Text15
saNames(1, 4) = Text16
saNames(0, 5) = Text17
saNames(1, 5) = Text18
'Fill B1: G2 avec un tableau de valeurs (prénoms et nom de famille).
OSheet.Range("A1", "F2").Value = saNames
End Sub
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
Ouh lala
Port.DLL est, dans mon esprit, une vieille DLL (*) pour accéder au port parallèle, pas Com
(*) pas sûr qu'elle fonctionne toujours sous XP.SP3-Vista-W7

Merci pour ton code, mais il manque le plus important : La fonction READBYTE !

NON et NON, MsComm sait gérer n'importe quelle taille (maxi 8192 octets, de mémoire) de chaine.
La preuve dans le dernier exemple de code que je t'ai fourni où l'instruction lit 10 caractères (2) en une fois.

Comprends bien que ton transmetteur envoie les données en continu et qu'il n'attend pas que tu veuilles bien lire le port Comm pour envoyer cette données.
Donc, si tu veux connaitre la valeur qu'il enverra dans 5 secondes, il te faudra lire toutes les données envoyées entre maintenant et dans 5 secondes, même si tu n'en fais rien.

La question : Si ton transmetteur envoie des données, comment fait-il la séparation entre chacune d'elle ?
Envoie t-il 12351235123512351235... ?
ou bien fait-il suivre chaque donnée par un caractère de séparation, genre 1235*1235*1235*1235*... où le * peut être n'importe quel caractère comme un retour chariot (13), un retour à la ligne (10), un espace (32)
La méthode de tri des données dépend de cette info.

Alors, si tu dois lire "1235", le plus simple :
- Comme je te le disais, déclarer une variable dans la partie déclaration de ta forme
Private maVariableStockage As String
- Lire cycliquement avec un Timer, par exemple, le buffer à condition qu'il y aiut quelque chose dedans :
Do While MSComm1.InBufferCount > 0
  MSComm1.InputLen = MSComm1.InBufferCount
  maVariableStockage = maVariableStockage & MSComm1.Input
Loop

Et, à la suite, traiter le contenu de maVariableStockage pour isoler tes données.
Le traitement de ce contenu dépend de la réponse à la question ci-dessus.

Lexique : 8 bits 1 octet 1 byte = 1 caractère

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
21
Date d'inscription
dimanche 14 février 2010
Statut
Membre
Dernière intervention
14 février 2010

Donc si j'utilise ça

Dim CommData as String
' Définit un bloc de données de 10 caractères.
MSComm1.InputLen = 10
' Lit les données.
CommData = MSComm1.Input

et puisque dans mon cas il s'agit de 4 caractéres
donc le textbox de la pression actuelle
affichera directement la valeur 123,5
sans ni concatener ou autre

j'ai programmé le pic de tel sorte qu'il envois 1 ,il attends 1 seconde, ensuite il envois 2 ,il attend un seconde ...jusqu'à l'arret du systeme

donc chaque chiffre est envoyé pandant une seconde

donc il faut que l'application vb lit les 4 chiffre un par un et apres 4 secondes elle les concatene dans l'ordre et les met dans une textbox sachant que je peu bien choisir que ça soit une seconde ou autre

en plus s'il vous plait c'est quoi buffer et à quoi ça sert?

peut etre que mes questions vous paraisse un peu bizarre,c'est parceque je n'ai jamais étudié de la programmation dans ma vie
et il y a moins d'une semaine que j'ai debuté avec vb

merci de votre aide...
Messages postés
21
Date d'inscription
dimanche 14 février 2010
Statut
Membre
Dernière intervention
14 février 2010

Merci de votre aide mais voici la solution que j'ai adopté
et elle est fonctionelle


Private Sub Timer1_Timer()
For compteur = 0 To 3 Step 1
If compteur 0 Then a READBYTE
If compteur 1 Then b READBYTE
If compteur 2 Then c READBYTE
If compteur 3 Then d READBYTE
    Next
Label7 = a & b & c & "," & d
End Sub
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
Définition de Buffer : http://fr.wikipedia.org/wiki/Buffer
La solution étaot encore plus simple : Attendre que le buffer atteigne au moins 4 caractères avant de le lire :
If MSComm1.InBufferCount >= 4 Then
  MSComm1.InputLen = 4
  Label17.Caption = MSComm1.Input
End If

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
21
Date d'inscription
dimanche 14 février 2010
Statut
Membre
Dernière intervention
14 février 2010

Bonjour ,
PUisque j'ai utilisé port.dll
je ne peut pas utiliser la solution que vous avez donné
en plus mon pc est windows xp pack3 et le port.dll fonctionne sans probleme
merci infiniment de votre aide...