Go Down

Topic: Lecteur QR code + LCD + imprimante (Read 4204 times) previous topic - next topic

J-M-L

#120
Aug 18, 2017, 10:25 am Last Edit: Aug 18, 2017, 10:34 am by J-M-L
Quote
Désolé, je ne suis pas très familié avec avec tous les thermes "Quote", "Tags" mais je viens de voir la différence grâce à vous, effectivement, c'est beaucoupo plus lisible.
--> toujours temps d'éditer vos post ci dessus et de remplacer [quote] par [code] et [/quote] par [/code] :)

Quote
Il y a confusion, je pensais que mySerial.read()) retournait la chaîne de caractères complète, donc effectivement ceci ne peut fonctionner.
--> ben oui :)

il faut lire caractère par caractère, bâtir un buffer (cf le tuto sur Serial) et ensuite une fois que vous avez reçu la chaîne faire vos tests et extraire la partie qui vous intéresse
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

DjLab

#121
Aug 18, 2017, 01:26 pm Last Edit: Aug 18, 2017, 02:06 pm by DjLab
Ça y est, j'ai modifié les quote par code et /code par /quote de tous les post, beaucoup plus lisible.
Désolé, ce n'est pas de la fainéantise de ma part mais après cette longue période d'inactivité sur ce sujet, j'ai confondu les quote et les code.
Je potasse ce que tu m'a donné.

DjLab

Grace au tuto sur le Serial, en particulier en utilisant l'exemple 3 en le modifiant légèrement, j'ai enfin une chaîne de caractère qui s'affiche.
Youpi, merci J-M-L.
J'ai modifié
Code: [Select]
char startMarker = '-'; pour qu'il détecte le "-" qui est mon début de chaîne, par contre je ne sais pas comment modifier
Code: [Select]
char endMarker = '9'; pour qu'il ne m'affiche que les 9 caractères qui suivent le "-", le "9" est considéré comme caractère à trouver pour la fin de la chaine?

Voici le code au complet :
Code: [Select]
#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX pin 10, TX pin 11

const byte numChars = 32;
char receivedChars[numChars];

boolean newData = false;

void setup() {
  Serial.begin(9600); // Baud rate moniteur série
  while (!Serial) {
    ;
  }

  mySerial.begin(9600); // Baud rate appareil

}

void loop() {
  recvWithStartEndMarkers();
  showNewData();
}

void recvWithStartEndMarkers() {
  static boolean recvInProgress = false;
  static byte ndx = 0;
  char startMarker = '-';
  char endMarker = '9';
  char rc;

  while (mySerial.available() > 0 && newData == false) {
    rc = mySerial.read();

    if (recvInProgress == true) {
      if (rc != endMarker) {
        receivedChars[ndx] = rc;
        ndx++;
        if (ndx >= numChars) {
          ndx = numChars - 1;
        }
      }
      else {
        receivedChars[ndx] = '\0'; // terminate the string
        recvInProgress = false;
        ndx = 0;
        newData = true;
      }
    }

    else if (rc == startMarker) {
      recvInProgress = true;
    }
  }
}

void showNewData() {
  if (newData == true) {
    Serial.println(receivedChars);
    newData = false;
  }
}

J-M-L

#123
Aug 18, 2017, 03:24 pm Last Edit: Aug 18, 2017, 03:26 pm by J-M-L
Bravo :)

en fait vous devriez uniquement recevoir la chaîne avec un marqueur de début. une fois ce marqueur reçu quand vous rajoutez les éléments dans le tableau et faites ndx++ il suffit de comparer ndx à 9 pour savoir quand vous avez tout reçu

sinon il faudrait vérifier si votre appareil envoie un '\n' par exemple à la fin du message, auquel cas c'est votre marqueur de fin et vous ne conservez que les 9 premiers caractères en rajoutant
receivedChars[9] = '\0';
lors de la réception du caractère de fin (comme ça la chaîne est coupée)



Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

DjLab

Bonsoir J-M-L.

Malheureusement mon lecteur de code barre ne renvoi pas de '\n', la deuxième solution ne pourra fonctionner.

Par contre pour la première, vos explications nous on permis de retoucher le code et...ça fonctionne  :)

Grand merci à vous tous, en particulier J-M-L, j'ai énormément appris, c'est la première fois que je code et, malgré les belles galères que j'ai connues, je trouve ça géniale et très intéressant, c'est dingue ce que l'on peu faire avec un simple arduino UNO.

Pour ceux que ça intéresserai, je posterais 4 codes comme suit :

1- lecteur code barre / QR Code + LCD + imprimante avec liaison USB
2- lecteur code barre / QR Code + LCD + imprimante avec liaison USB et fonction de filtrage de données
3- lecteur code barre / QR Code + LCD + imprimante avec liaison série
4- lecteur code barre / QR Code + LCD + imprimante avec liaison série et fonction de filtrage de données

A bientôt !!!

DjLab

Bonjour à tous,

Voici le bout de programme qui m'a permis d'afficher les 9 caractères qui suivent le "-" de ma chaîne.

Mais je viens de me rendre compte que certains codes barres n'étaient pas formatés de la même façon  >:(
Sur ces derniers il y a 7 caratères et il faudrait tous les afficher.
J'ai essayé pleins de trucs pour que les deux formats fonctionnent ensemble (soit il trouve le "-" et il affiche les 9 caractères, soit il ne trouve pas le "-" et il affiche tout), mais rien n'y fait, totalement novice en programmation, je galère grave, help me  :o
Code: [Select]

void loop() {
  recvWithStartEndMarkers();
  showNewData();
}

void recvWithStartEndMarkers() {
  static boolean recvInProgress = false;
  static byte ndx = 0;
  char startMarker = '-';
  char rc;

  while (mySerial2.available() > 0 && newData == false) {
    rc = mySerial2.read();

    if (recvInProgress == true) {
      if (ndx <= 8) {
        receivedChars[ndx] = rc;
        ndx++;
      }
      else {
        receivedChars[ndx] = '\0';
        ndx = 0;
        newData = true;
        recvInProgress = false;
      }
    }
    else if (rc == startMarker) {
      recvInProgress = true;
    }
  }
}

DjLab

Bonjour à tous.

Finalement, je m'en suis sortie avec lesz différents formats de QR Code.

J'ai un nouveau problème...

J'avais confectionné un petit interface RS232 / TTL sur base de ce schéma (en supprimant Q2 et R4 car pas besoin de transmettre) :

J'ai voulu faire propre en achetant ceci : https://www.dfrobot.com/product-196.html

Tout a été câblé correctement :
- GND interface --> GND Arduino
- VCC interface --> 5V Arduino
- TXD interface --> PIN11 Arduino (celle qui est utilisée pour envoyer les données, mais non utilisé dans le programme)
- RXD interface --> PIN10 Arduino (celle qui est utilisée pour recevoir les données)

J'ai eu un doute sur une inversion TXD / RXD de l'interface, au vue du schéma, la broche 9 du MAX202 est bien le OUT, cette broche est reliée à la PIN appelée RXD.

Mais rien ne fonctionne, le module s'allume, mais rien dans le moniteur série.

Y a t'il une astuce, des résistances à mettre quelque part, j'ai rien vue sur le net.

Par avance, merci de votre aide.

al1fch

#127
Sep 13, 2017, 04:56 pm Last Edit: Sep 13, 2017, 05:46 pm by al1fch
Bonjour

Le montage à MAX202 doit fonctionner contrairement à celui à transistor qui ne marche pas dans tous les cas

la sortie 9 du MAX202 DOIT être reliée à l'entrée RX de l'ARDUINO
l'entrée  10 du MAX202 DOIT être réliée à la sortie TX de l'ARDUINO


Ces deux lignes sont unidirectionnelles :  une sortie -->  une entrée
Le croisement TX-RX est logique et incontournable.
D'après le schéma le croisement est réalisé sur la carte d'interface
le  RX repéré sur la carte est donc à relier au RX Arduino, idem pour les TX
Mettre face à face deux sorties dans  un 'bras de fer' n'est "en général"  pour les composants, parfois ça casse.

kamill

Bonjour,

Du coté arduino, ça me semble bien connecté.
Par contre du coté DB9 la pin 2 appelée RXD est une sortie et la pin 3 appelée TXD une entrée, alors que en général sur un connecteur male la pin 2 RXD est une entrée et la pin 3 TXD une sortie (connexion type PC).

al1fch

#129
Sep 13, 2017, 05:14 pm Last Edit: Sep 13, 2017, 05:47 pm by al1fch
DB9, il y avait (il y a donc encore içi ou là ) les deux types : DTE ou DCE,  le côté 'Terminal' ou le côté 'Equipement de communication' http://ltxfaq.custhelp.com/app/answers/detail/a_id/1216/~/rs232---dte-and-dce-connectors
d'ou les câbles RS232 croisés ou pas,  ainsi  les 'boites de croisement"...

Les deux types (DTE ou DCE) ne correspondent malheureusement toujours au 'sexe' de la prise:smiley-sad:
Le "en général' mentionné  par Kamil n'est peut être pas vérifié içi ?
Il faudrait le brochage de la DB9 du périphérique.



kamill

Justement dans la plupart des cas ce genre de lecteur est fourni avec un câble permettant de le raccorder sur un PC. Or les pins du connecteur de l'interface sont croisées par rapport au PC.
D'où problème potentiel.

al1fch

#131
Sep 13, 2017, 05:24 pm Last Edit: Sep 13, 2017, 06:09 pm by al1fch
je pense que kamil a mis le doigt sur le problème !

Ce n'est pas côté Arduino qu'il y a un problème de croisement, par contre côté DB9 RS232  la question se pose !!
Vu la protection des MAX202, MAX232...... vis à vis des courts circuits la liaison  [ TX Lecteur <-> TX Interface] n'a sans doute pas porté à conséquence à part l'absence de fonctionnement.

.....ça marchait avant avec l'interface à 2 transistors  et en voulant 'faire propre' DjLab s'est créé un problême !

Le lecteur étant fait pour se connecter à un PC il faut que l'interface présente le même brochage que celui d'un PC, l'interface actuelle se présentant plutôt comme un autre périphérique destiné à être relié à un PC

DjLab

Bonsoir,

Merci à tous de m'avoir répondu aussi rapidement.

Je n'avais pas pensé à vérifier coté DB9, effectivement la broche 2 est la sortie de donnée, à raccorder sur la broche 8 "IN" du MAX202.

Je ne comprenait pas pourquoi il y avait des câbles croisés......maintenant j'ai la réponse.

Je test demain matin et vous tiens au courant.

Encore merci à vous.

DjLab

Bonjour,

YOUPIIIIII !!!

C'était tout bêtement ça, il fallait croiser les DB9.

Ça marche nickel, au moins c'est plus propre comme montage qu'avec le transistor.

Merci kamill et al1fch de m'avoir aidé.

Go Up