Acquisition sur plusieurs ports RS232 [Résolu]

- - Dernière réponse :  Utilisateur anonyme - 16 nov. 2011 à 12:21
Bonjour,

J'ai créé un petit programme d'acquisition de données sur le port RS232.

Nous avons 12 balances qui prennent des mesures et les envoies aux différents ports.

Je croyais qu'en créant une form avec des multi-tab et des indexes, que je pourrais gérer 12 ports séries avec mon programme vb.

Cependant, dès que je change d'onglet, on dirait que le port du l'onglet précédent se ferme tout seul et il m'indique une erreur et se ferme automatiquement.

Est-ce que j'ai manqué quelque chose ou bien mon application est mal dessiné?

Que devrais-je utiliser comme contrôle?

Bi0hazard
Afficher la suite 

18 réponses

Meilleure réponse
3
Merci
Salut Bio,
Excuse mais je n'ai même pas un port série pour tester...

Alors j'imagine que l'erreur survient à cette ligne?
MSComm1(z).Output = "SEND" & vbCr


Essaye de faire comme ça:
Private Sub timerStep_Timer(index As Integer)
On Error Resume Next
'si le port est déjà ouvert il passe à la ligne d'après, sinon il l'ouvre
MSComm1(z).PortOpen = True 'si erreur ici il va à la ligne suivante
MSComm1(z).Output = "SEND" & vbCr
End Sub


Tu me diras si c'est bon...

Et bonjour au Québec

CF2i - Guadeloupe
Ingénierie Informatique

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 193 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Utilisateur anonyme
0
Merci
Salut,
Non c'est tout à fait possible, je me rappelle un moment je gérais 32 ports série sur un projet.

Par contre je n’utilisais pas de TAB, tu dois avoir une erreur quelque part vu que le port se ferme.

Laisse nous un bout de ton prog....



CF2i - Guadeloupe
Ingénierie Informatique
Commenter la réponse de Utilisateur anonyme
0
Merci
Voilà l'erreur en question:






Option Explicit
Dim InputDat(11) As String
Dim RecvDat(11) As String
Dim SendDat(11) As String
Dim FlagEsc(11) As Boolean
Dim inidata(11) As String               'Valeurs pour fichier .ini
Dim FlagChange(11) As Boolean           'Variable pour détecter le changement dans les txtBox
Dim FlagExperiment(11) As Boolean       'Variable pour détecter une expérimentation en cours
Dim DataNum(11) As Long
Dim NextTime(11) As Double


Private Sub timerStep_Timer(index As Integer)

MSComm1(z).Output = "SEND" & vbCr

End Sub


Public Sub loadINI()

Dim x As Integer

For x = 0 To 11
    iniScaleName(x) = GetINISetting("Balance" & x, "ScaleName", App.Path & "\SETTINGS.INI")
        If iniScaleName(x) "" Then iniScaleName(x) "Balance"
    iniComPort(x) = GetINISetting("Balance" & x, "ComPort", App.Path & "\SETTINGS.INI")
        If iniComPort(x) "" Then iniComPort(x) defaultComPort
    iniBaudRate(x) = GetINISetting("Balance" & x, "BaudRate", App.Path & "\SETTINGS.INI")
        If iniBaudRate(x) "" Then iniBaudRate(x) defaultBaudRate
    iniDataBits(x) = GetINISetting("Balance" & x, "DataBits", App.Path & "\SETTINGS.INI")
        If iniDataBits(x) "" Then iniDataBits(x) defaultDataBits
    iniParity(x) = GetINISetting("Balance" & x, "Parity", App.Path & "\SETTINGS.INI")
        If iniParity(x) "" Then iniParity(x) defaultParity
    iniStopBits(x) = GetINISetting("Balance" & x, "StopBits", App.Path & "\SETTINGS.INI")
        If iniStopBits(x) "" Then iniStopBits(x) defaultStopBits
    iniFluxControl(x) = GetINISetting("Balance" & x, "FluxControl", App.Path & "\SETTINGS.INI")
        If iniFluxControl(x) "" Then iniFluxControl(x) defaultFluxControl
DoEvents
Next x

End Sub






Je ne vois pas tellement quel bout de code vous vouliez, j'ai mis ce que je croyais être utile.
Bi0hazard
Commenter la réponse de Utilisateur anonyme
0
Merci
Re:
Excuse mais j'ai pas vb6 d'installé (j'ai Vb2010)

Mais a première vue t'as essayé de faire une opération (lecture ou écriture) sans que le port en question soit ouvert.

Essaye d'ouvrir tous les ports dans ton Private Sub Form_Load()
Juste pour voir s'il fait la même erreur.



CF2i - Guadeloupe
Ingénierie Informatique
Commenter la réponse de Utilisateur anonyme
Messages postés
14565
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
13 octobre 2019
136
0
Merci
Bonjour,

J'ajouterais en plus de Acive, Tu peux faire un contrôle utilisateur pour une balance, ensuite, tu peux charger dynamiquement les balances, et chaque contrôle gèrera sa propre connexion série.
et pour switcher, tu joues sur la visibilité du contrôle par exemple.

A voir si il est autorisé d'indexer les contrôles, même s'il sont dans des tabs différents.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Commenter la réponse de NHenry
0
Merci
Salut Henry
Tu peux faire un contrôle utilisateur pour une balance

Tu veux dire 'par balance'?

C'est un peu ce que je voulais lui faire voir, mais sans VB6...
Le port série n'est pas géré du tout de la même façon en .NET



CF2i - Guadeloupe
Ingénierie Informatique
Commenter la réponse de Utilisateur anonyme
Messages postés
14565
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
13 octobre 2019
136
0
Merci
Bonjour,

@Acive
Comme son programme est sensé (d'après ce que j'ai compris) gérer des balances.
En faisant 1 contrôle utilisateur qui ne s'occupe que d'une balance, ça permet d'éclaircir le code tout en permettant de pouvoir gérer jusqu'à 16 balances (limite du contrôle MSComm fourni par M$) .

Sinon, concernant le problème, mets des points d'arrêts sur chaque close des ports, car je pense que tu fermes les ports sans le vouloir.
Un port ne se ferme pas tout seul.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Commenter la réponse de NHenry
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
61
0
Merci
Salut

Vu de loin, il n'y a aucune raison qu'un port série se ferme seul, jamais vu ça.
Il faudrait approfondir ce qui se passe quand tu changes d'onglet.
Lances-tu du code lors de ces changements d'onglet ?
Touche t-il la communication d'une des balances ?

Je ne le précise pas, mais il te faut gérer autant de port COM que de bascule.
Le code que tu nous as montré n'a rien à voir avec la COM.
Que sont ces variables que tu renseignes à partir de tes fichiers INI ? Comment sont-elles dimensionnées et utilisées ?
Quand je vois ceci
If iniDataBits(x) = "" Then
je suis étonne de voir qu'il puisse s'agir d'une variable de type String (inadapté).
Mais là n'est pas le problème.

Comment lis-tu les données ?
Comment gères-tu les évènements de chaque port ?
Notamment, il doit y avoir un évènement qui se déclenche à la fermeture du port. Programme quelque chose sur l'apparition de cet évènement puis utilise le débogage pour voir quel bout de code provoque cette demande.
Débogage :
- F9 sur une ligne de code; elle change de couleur
Le programme s'y arrêtera au prochain passage
Survole avec la souris tes variables pour visualiser leur contenu, ou va dans la fenêtre de debogage (Ctrl-G) et tape
? maVariable
pour qu'elle s'inscrive dans la fenêtre.
- F8 (VB6) ou F10 (.Net) pour avancer d'une ligne de code
- F5 pour continuer normalement

Vala
Jack, =fr 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)
Commenter la réponse de cs_Jack
0
Merci
Salut Henry
alors je ne me rappelle plus comment j'ai fait pour gérer 32 ports Rs232 en 2004 (je crois), je sais aussi qu'on pouvait ajouter autant de ports qu'on voulait (c'était des modules de 8 ports connectés en USB)
C'était un sex-shop à Paris où chaque utilisateur pouvait appuyer sur lecture, avance rapide, pause etc en envoyant un code en rs232 (j'en ai fait d'autres avec 384 magnétoscopes et 150 utilisateurs, mais pas d la même façon)

Salut Jack
quand tu dis que
il n'y a aucune raison qu'un port série se ferme seul, jamais vu ça

Je ne pense pas qu'il se ferme pas le port, c'est une erreur qui ferme carrément l'appli (d'après ce que j'ai vu)



CF2i - Guadeloupe
Ingénierie Informatique
Commenter la réponse de Utilisateur anonyme
0
Merci
Bonjour,

Premièrement soyez indulgent. Le programme est encore en version bêta. Je suis pas codeur professionnel alors j'essai de me débrouiller. Le ménage n'est pas encore fait dans le code. Étant donné que c'est au travail, on essai avant pour savoir si la théorie se tient, on améliore ensuite.

Mais a première vue t'as essayé de faire une opération (lecture ou écriture) sans que le port en question soit ouvert.

Essaye d'ouvrir tous les ports dans ton Private Sub Form_Load()
Juste pour voir s'il fait la même erreur.


Non. Je n'ai que changé de tab. Et en changeant de tab, il n'y a pas d'événement.

Tu peux faire un contrôle utilisateur pour une balance, ensuite, tu peux charger dynamiquement les balances, et chaque contrôle gèrera sa propre connexion série.
et pour switcher, tu joues sur la visibilité du contrôle par exemple.


Ce que j'ai fait, c'est que j'ai mit 12 contrôles MSCOMM étalé sur les 12 tabs. Chaque MSCOMM à un # d'index différent (comme tous les contrôles que vous voyez, se sont tous le même mais avec des # d'index différent. Vous me suivez?

Lances-tu du code lors de ces changements d'onglet ?
Touche t-il la communication d'une des balances ?


À mémoire d'homme, je dirais que non. Je n'ai pas le programme chez moi. Il est au travail donc je pourrai seulement updater lundi matin (GMT -5).

Le code que tu nous as montré n'a rien à voir avec la COM.
Que sont ces variables que tu renseignes à partir de tes fichiers INI ? Comment sont-elles dimensionnées et utilisées ?


Je mettrai le code plus spécifique lundi. Ceci dit, tu viens de faire allumer une cloche. Je ne me souviens pas d'avoir adapté mon code gérant les comms avec les index. Je crois que c'est seulement une erreur de syntaxe lorsque je déclare la procédure tel que:
Private Sub MScomm1(index as Integer)


If iniDataBits(x) = "" Then
je suis étonne de voir qu'il puisse s'agir d'une variable de type String (inadapté).


Oui, il faut que je change pour utiliser les index d'une liste. C'est en voit de changer.

Survole avec la souris tes variables pour visualiser leur contenu, ou va dans la fenêtre de debogage (Ctrl-G) et tape


Oui, merci. J'utilise déjà les commandes de Debug.Print pour m'afficher certaines variable en cours de route. C'est très utile.


Merci du support.











Bi0hazard
Commenter la réponse de Utilisateur anonyme
0
Merci
Salut Bi
Alors d'abord nous avons 5 heures en hiver et 6 en été de différence (je travaille uniquement avec des entreprises en métropole et ça fait que je me lève souvent à 3/4 heures du matin).
La en ce moment il est 20h29 chez moi.
Et contrairement à ce qu'on puisse penser je suis un blanc Parisien (même si ça semble bizarre)

Quand je t'ai dit:
t'as essayé de faire une opération (lecture ou écriture) sans que le port en question soit ouvert


C'est parce que c'est marqué sur ton message d'erreur c'est tout, t'as du t'en apercevoir je pense.

Écoute, tu retournes à ton taff tu regardes un peu, le matin de bonne heure (très important) et tu testes...

Bon je ne suis personne pour te donner des conseils, mais essaye de gérer un seul port pour voir et ainsi de suite.

Désolé pour le support collectif...



CF2i - Guadeloupe
Ingénierie Informatique
Commenter la réponse de Utilisateur anonyme
0
Merci
Bonjour en ce lundi matin heure du Québec!

Événement MSComm1(index as integer)
Private Sub MSComm1_OnComm(index As Integer)

Dim ret As Integer
 
    
    Select Case MSComm1(z).CommEvent
    Case comEventRxOver
        ret = MsgBox("Input Buffer Overflowed !", 16)
    Case Is > 10
        ret = MsgBox("Communication Error " & CStr(MSComm1(z).CommEvent) & " !", 16)
    Case comEvReceive
        InputDat(z) = MSComm1(z).Input
        
        If FlagEsc(z) Then
            Select Case InputDat(z)
                Case "D"
                    RecvDat(z) = RecvDat(z) + Date$
                Case "T"
                    RecvDat(z) = RecvDat(z) + Time$
            End Select
            
            FlagEsc(z) = False
            Debug.Print RecvDat(z)
            Debug.Print InputDat(z)
            
        Else
            Select Case InputDat(z)
                Case Chr$(13)       '<CR>
                    ConvDat(z) = RecvDat(z)
                    RecvDat(z) = ""
                        If chkTime(z).Value Then
                            ConvDat(z) = ConvDat(z) + "," + Time$
                        End If
                
                        If chkDate(z).Value Then
                            ConvDat(z) = ConvDat(z) + "," + Date$
                        End If
                
                        If chkSeqNum(z).Value = 1 Then
                            DataNum(z) = DataNum(z) + 1
                            ConvDat(z) = ConvDat(z) + "," + CStr(DataNum(z))
                        End If
                
                DoEvents
                RichTextBox(z).UpTo Chr$(255), True, False
                RichTextBox(z).SelText = ConvDat(z) & Chr(13) & Chr(10)
                
            Case Chr$(10)                               '<LF>
            Case Chr$(6)                                '
                RecvDat(z) = RecvDat(z) + ""
            Case Chr$(27)
                FlagEsc(z) = True
            Case Else
                RecvDat(z) = RecvDat(z) + InputDat(z)
            
            End Select
        End If
        
    Case comEvSend
    
    End Select
End Sub


Private Sub SSTab1_Click(PreviousTab As Integer)
z = SSTab1.Tab
Debug.Print "CurrentTab: " & z
End Sub



Bi0hazard
Commenter la réponse de Utilisateur anonyme
0
Merci
Des updates?


Bi0hazard
Commenter la réponse de Utilisateur anonyme
Messages postés
14565
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
13 octobre 2019
136
0
Merci
Bonjour,

On Error Resume Next
N'est à utiliser que si c'est justifié, car ça masque les erreurs, là, je pense qu'un gestion améliorée des erreurs serait utile.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Commenter la réponse de NHenry
0
Merci
Salut Henry,
Oui certes, mais déjà pour tester, pour voir si ça fonctionne.

Sinon il faut juste tester si le port es ouvert:
if mscomm.portopen false then mscomm.portopen True
Par exemple, mais de toute façon il y a une erreur autre pour que les ports se ferment comme ça.

Mais bon j'ai pas 12 balances en rs232 chez moi et encore moins 12 ports


CF2i - Guadeloupe
Ingénierie Informatique
Commenter la réponse de Utilisateur anonyme
Messages postés
14565
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
13 octobre 2019
136
0
Merci
Bonjour,

Acive, j'utilise un logiciel permettant de simuler des liaisons NullModem entre 2 ports virtuels directement accessible par les applications, lors que je fais des tests, c'est très pratique :)
Malheureusement, le développeur a apparemment abandonné ce projet. J'ai l'install pour un Win32, jamais testé sur un Win64.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Commenter la réponse de NHenry
0
Merci
La réponse d'acive semble fonctionner.

Je n'ai pas encore vraiment testé les 12 ports, mais en voulant tester seulement le changement d'onglet, j'arrivais a une erreur.

Maintenant je change d'onglet et je n'ai plus l'erreur.

à suivre pour le développement


Bi0hazard
Commenter la réponse de Utilisateur anonyme
0
Merci
Salut,

Bio, alors c'est un peu ce qu'on disait Henry et moi, ce n'est pas la solution à ton problème, même si ça fonctionne.
Tu dois bien y avoir un comm.portopen = false quelque part mal placé.

Henry: C'est pas mal ton simulateur, moi je connecte un adaptateur usb/rs232 pour les tests...
Et à propos de win64, c'est une galère, je l'ai installé une fois (par erreur) et t'as du mal à trouver des drivers pour n'importe quel périphérique.
J'étais obligé de réinstaller le 32.



CF2i - Guadeloupe
Ingénierie Informatique
Commenter la réponse de Utilisateur anonyme