Plusieurs lecteurs de code à barre [Résolu]

Messages postés
2
Date d'inscription
jeudi 4 janvier 2007
Statut
Membre
Dernière intervention
17 mars 2010
- - Dernière réponse : Adn56
Messages postés
1220
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
- 17 mars 2010 à 20:02
Bonjour,

Je cherche comment brancher plusieurs lecteurs de code à barres sur un même PC, et développer l'application qui traitera les données. Les lecteurs sont sur port série.
Aujourd'hui, je sais récupérer les données d'un port série, et les traiter.

Comment faire en sorte de récupérer les données sur plusieurs (4 ?) ports série simultanément, sans jamais perdre de données ? Faut-il passer par du multi-thread ?

Merci pour vos lumières :-)
Afficher la suite 

3 réponses

Meilleure réponse
Messages postés
1220
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
3
Merci
salut, j'ai fais plusieurs applis indus avec 4/6 ou 8ports RS232 et je ne passe pas par des thread, mais par le receive des ports, il faut en revanche leurs donner la fin de trame reçu pour qu'il déclenche l'événement receive.
Tu peux aussi passer par un timer qui scrute les buffer que tu déclares. Ex :
++
    ' Port de coms RS232
    ' déclaration du buffer tampon de réception des ports com
    Dim buffer1, buffer2 As String

' config des ports et ouverture ici le com4, dans une sub qui va bien ^^
 ' Configuration du port série 4
        Try
            With SerialPort4
                .PortName = LireINI("com4", "Portname")
                .BaudRate = CInt(LireINI("com4", "Vitesse"))
                .DataBits = CInt(LireINI("com4", "Databits"))
                .StopBits = CType(LireINI("com4", "Stopbit"), Ports.StopBits)
                .Handshake = CType(LireINI("com4", "protocole"), Ports.Handshake)
                .NewLine = Chr(32) & Chr(60) ' défini la fin de trame du port com4 (sinon CRLF par défaut)
                .Open()
            End With
        Catch ex As Exception
            MsgBox("COM4 plus disponible", MsgBoxStyle.Critical)
        End Try

'exemple d'une sub qui envoie une demande et attend la réponse, puis la traduit :

    Private Function lectureHD2001(ByVal num_com As SerialPort) As Double() 'appelé par le timer
        buffer = String.Empty ' efface les anciennes valeurs
        Dim data(3) As Double  ' valeurs renvoyées par la fonction
        For i As Integer = 0 To 2
            data(i) = 0 'initialise les valeurs
        Next i
        Dim out As Boolean = False 'pour sortir de la boucle 
        Dim ok As Boolean = False ' test si on doit traduire la réception ou pas
        Dim fin As Double
        fin = Environment.TickCount + 500 ' On ajoute 1/2sec au compteur programme pour avoir le temps
        Do
            'ecriture 
            num_com.WriteLine("A00ZS2")
            Application.DoEvents()
            Pause(100)
            ' si reception dans le buffer et s'il contient un & (symbol OK pour le HD2001) ?=NOK pour info
            If Not buffer Is Nothing AndAlso buffer.Contains("&") _
            AndAlso Not buffer.Contains("?") AndAlso Not buffer.Contains("#") Then
                out = True
                ok = True
            ElseIf ((Environment.TickCount >= fin)) Then 'And buffer Is Nothing Then
                out = True
                ok = False
                ' truc à faire si défaut
                If num_com.PortName = "COM2" Then Ajout_ligne_LV1(4, "pas de réponse du module ambiant")
                If num_com.PortName = "COM3" Then Ajout_ligne_LV1(4, "pas de réponse du module sécheur")
            End If
        Loop While (out = False)
        If ok Then
            Dim data_buffer() As String = Split(buffer, "$") ' coupe la trame reçu en morceaux
            Dim supp As Char() = {CChar("&"), CChar(" ")} ' liste des caractéres à supprimer
            For i As Integer = 0 To data_buffer.Length - 1 ' pour chaque morceaux
                data_buffer(i) = data_buffer(i).Trim(supp) ' supprimer les caratéres non utile
                data_buffer(i) = data_buffer(i).Replace(".", ",") ' remplacer le point par une virgule
            Next ' sinon cela fait buguer le cast en Dbl !
            For i As Integer = 0 To data_buffer.Length - 1 ' pour chaque morceaux
                If data_buffer(i) "ERROR" Then data_buffer(i) "0"
            Next i
            data(0) = CDbl(data_buffer(0)) ' °C
            data(1) = CDbl(data_buffer(1)) ' %HR
            data(2) = CDbl(data_buffer(5)) ' %HPA
            ' dans le cas du HD2001.2 on lit en plus la vitesse d'air
            ' vérifions que data_buffer(6) ne soit pas vide avant la conversion
            If data_buffer(6) <> "" Then data(3) = CDbl(data_buffer(6)) ' m/sec
        Else ' si trame reçu NOK alors placer 0 
            For i As Integer = 0 To 2
                data(i) = 0
            Next i
        End If

        Return data
    End Function 'lecture des deux modules HD2001 (suivant le port serie)




++

Dire « Merci » 3

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

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

Commenter la réponse de Adn56
Messages postés
1220
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
3
Merci
alors là, j'utilise le .NET, donc je ne sais pas, mais je te conseille d'avoir une sub par écoute de port com, ou alors d'utiliser un bit qui te permet de savoir si la sub de traitement à fini ou pas.
dsl, vb6 jamais fait -_-'

Dire « Merci » 3

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

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

Commenter la réponse de Adn56
Messages postés
2
Date d'inscription
jeudi 4 janvier 2007
Statut
Membre
Dernière intervention
17 mars 2010
0
Merci
Bonjour,

Merci Adn56 pour ton retour d'expérience, je vais donc tenter le coup.
Si je comprends bien ton code, c'est toi qui demande ponctuellement l'écoute du port, en lançant ta sub lectureHD2001.
Dans mon cas, le programme doit "se contenter" d'écouter en permanence les X ports connectés, et les traiter dès réception.

J'utilise un bout de code, que j'ai trouvé sur un forum, qui utilise l'évènement OnComm :

Private Sub MSComm1_OnComm()
    Dim temp As String
    Dim Buffer As String
    
    Select Case MSComm1.CommEvent
        'liste des erreurs possibles
        Case comEventBreak      ' On a reçu un signal d&#8217;interruption (Break)
        Case comEventCDTO       ' Timeout de la porteuse
        Case comEventCTSTO      ' Timeout du signal CTS (Clear To Send)
        Case comEventDSRTO      ' Timeout du signal de réception
        Case comEventFrame      ' Erreur de trame
        Case comEventOverrun    ' Des données ont été perdues
        Case comEventRxOver     ' Tampon de réception saturé
        Case comEventRxParity   ' Erreur de parité
        Case comEventTxFull     ' Tampon d&#8217;envoi saturé
        Case comEventDCB        ' Erreur de réception DCB (jamais vu)
    
        ' liste des événements possibles qui sont, eux, normaux
        Case comEvCD            ' Changement dans la broche CD (porteuse)
        Case comEvCTS           ' Changement dans broche CTS
        Case comEvDSR           ' Changement dans broche DSR (réception)
        Case comEvRing          ' Changement dans broche RING (sonnerie)
    
        Case comEvReceive       ' Si on reçoit des données
            Sleep (100)
            temp = MSComm1.Input
            Call Consolide_comm1(temp)  ' Routine de traitement
    
        Case comEvSend          ' Il y a des caractères à envoyer
        Case comEvEOF           ' On a reçu le caractère EOF
            MsgBox ("eof")
    End Select
End Sub


En passant, je me demande encore pourquoi je définis une variable buffer qui ne sert pas...

Aujourd'hui, avec un seul COM, pas de problème. Mais comment réagit VB6 lorsqu'un deuxième port envoie des données alors que je suis en train de traiter autre chose (Consolide_comm1 par exemple) ?

Merci !
Commenter la réponse de epimagique