IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[C#] Comment utiliser le port série pour la lecture de code-barres ?


Sujet :

C#

  1. #1
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut [C#] Comment utiliser le port série pour la lecture de code-barres ?
    Bonjour,

    j'aimerais lire un code-barre à l'aide d'un lecteur de code à barres. Ce lecteur est connecté sur le port série et j'utilise donc la classe System.IO.Ports.SerialPort.

    J'ai quelques soucis pour lire les données reçues.

    Le délégué suivant est appelé quand un code-barre est scanné:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
            void m_PortScan_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                Console.WriteLine("Données lues.");
     
                // Lecture jusqu'au caractère de retour à la ligne
                string codeBarre = m_PortScan.ReadTo("\r\n");
     
                if (codeBarre != string.Empty)
                {
                    // Lancement de l'évenement "Nouveau Code Barre lu"
                    if (NouveauCodeBarreLu != null)
                        NouveauCodeBarreLu(this, new CodeBarreEvent(m_CodeBarreScanne));
                }
            }
    J'utilise la méthode ReadTo("\r\n") pour récupérer le code-barre car j'ai observé que les code-barres étaient terminés par \r\n.
    Le souci est que le délégué est appelé deux fois car le code-barre commence aussi par \r\n.
    Donc l'utilisation de ReadTo me gêne un peu.

    Mais j'ai aussi essayé d'utiliser la méthode Read(byte[] buffer,int offset, int count).

    Le souci est que si je scanne trop vite les code-barres, j'obtiens un décalage des caractères reçues, qui n'est pas récupérable. Par exemple, si mon code-barre est 0123456789. En scannant correctement, il n'y a pas de problème. Par contre, si je scanne trop vite (c'est à dire que le temps entre deux scan est très court), je vais avoir 012345678912345 et la fois d'après, si je scanne correctement j'obtiendrais 3456789012345.

    Je me demandais comment faire, pour lire un code-barre de façon fiable à tous les coups.

    Merci.
    Au revoir

  2. #2
    Invité
    Invité(e)
    Par défaut
    Je pense que tu devrai faire ta détection de \r\n toi même. Perso j'utiliserai la methode read et je stockerai tous les caracteres un par un dans une variable tampon et ensuite j'analyserai le resultat avec une expression reguliere cela devrai être assez simple.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 26
    Points : 19
    Points
    19
    Par défaut
    La longueur d'un code barre n'est pas fixe (je crois que par xemeple le commerce utilise 13 chiffres pour les codes internationaux), tu pourrais donc lire 13 chiffres par 13 chiffres non ?

    Vu que ton code bar se termine normalement par \r\n tu devrais aussi vérifier que il n'y a rien APRES ces caractères...

    De la meme maniere tu pourrais effectuer deux instructions READTO, la première enlèverait le début du code barre, la seconde te renvoie le code barre.

  4. #4
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut
    En fait, les code barres ne se terminent pas tous par \r\n. Tout dépend du lecteur.

  5. #5
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut
    Mais comment dois-je faire exactement ?

    Je dois appeler ReadTo dans le délégué m_PortScan_DataReceived ?

    Je suppose que je dois l'appeler avant ?
    Dans le contructeur par exemple, pour initialiser la lecture ?

    Merci de votre aide.

  6. #6
    Membre expert

    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    1 581
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 581
    Points : 3 016
    Points
    3 016
    Par défaut
    Tu peux tout lire avec la méthode ReadExisting par exemple, le tout te sera retourné dans une string. Etant donné que tu as un séparateur de code-barres, tu peux utiliser la méthode Split() de ton string afin de créer un tableau de codes barres.

    Si tu as une longueur définie pour les codes-barres, tu t'assures que chaque élément de ton tableau est bien de cette longueur pour être certain que tes codes barres sont valides.

    Si ce n'est pas le cas, (tu devrais au maximum te retrouver avec un code barre invalide par splittage) tu sais que la première partie du prochain split correspondra à complèter ce code barre invalide. Donc tu conserves l'ancienne que tu concatènes avec le premier élément de ton nouveau tableau.

    Sinon, si tu as une longueur définie, tu peux aussi tout simplement lire ton port série byte par byte (ReadChar) dans une boucle et à chaque fois que tu as lu "n" bytes, tu appelles ton délégué

  7. #7
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut
    Bonjour,

    merci pour ta réponse.

    tu as un séparateur de code-barres
    Qu'entends-tu pas séparateur de code-barres ?

    Selon le lecteur utilisé, mon code-barre commence et termine par \r\n, et sur d'autre lecteurs par \r.

    Si tu as une longueur définie pour les codes-barres, tu t'assures que chaque élément de ton tableau est bien de cette longueur pour être certain que tes codes barres sont valides.
    En fait, le lecteur peut lire différent code-barre, donc de longueur différente.

    Je gère ça dans une classe au-dessus, une classe qui s'abonne à l'évenement lancé par la classe de lecture du code-barre. Cette classe vérifie notamment le type de code-barre associé à la chaîne de caractère reçue.

    Si ce n'est pas le cas, (tu devrais au maximum te retrouver avec un code barre invalide par splittage) tu sais que la première partie du prochain split correspondra à complèter ce code barre invalide. Donc tu conserves l'ancienne que tu concatènes avec le premier élément de ton nouveau tableau.
    Oui effectivement, les codes génèrent plusieurs évenements et sont reçues en plusieurs fois. Du coup j'utilise la concaténation.

    En fait, je me suis décidé à utiliser la méthode Read(buffer,0,portSerie.BytesToRead) car ensuite je vérifie pour chaque octet lu si ce n'est pas un caractère \r, \n ou \0 que je supprime de la chaîne de caractères.
    Enfin je pourrai faire la même chose avec ReadExisting, je pense.

    Merci.

Discussions similaires

  1. Comment utiliser le port série RS232
    Par Minos2 dans le forum Apple
    Réponses: 7
    Dernier message: 28/01/2010, 09h57
  2. Comment utiliser le port série avec WxWidget
    Par LOMA.fr dans le forum wxWidgets
    Réponses: 1
    Dernier message: 28/10/2007, 16h45
  3. Réponses: 6
    Dernier message: 29/06/2007, 12h43
  4. comment utiliser le port com a mes application?
    Par zakichanedz dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 27/05/2007, 20h03
  5. Réponses: 6
    Dernier message: 03/05/2007, 11h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo