Communication entre un Arduino et une caisse enregistreuse.

Bonjour !

Je dispose d’un Arduino mega 2560, d’un RS232 Shield V2 et d’une caisse enregistreuse JDC.
Ils sont relié par un câble série croisé en 9600 bauds
Je souhaiterais récupérer les trames envoyé par la caisse lors de la validation d’un produit par exemple.

Ayant essayé divers code en rapport comme celui d’eskimon : eskimon.fr/104-arduino-302

Je ne parvient pas à recevoir ne serais ce un caractère.

La caisse envois un ENQ et attend un ACK pour communiquer la trame de débit
Voici le code que j’ai commencer à réaliser mais il ne fonctionne pas.

#include <Arduino.h>
#include <SPI.h> // Bibliothèque Serial Peripheral Interface

byte data = 0;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  if (Serial.available() > 0)
  {
  data = Serial.read();
  Serial.println(data);
  if (data != 0x05)
  {
    data = Serial.read();
  }
    
    else if (data == 0x05)
    {
      Serial.write(0x06);
    }
  }
}

Merci d’avance pour votre aide, je suis bloqué pour mon projet :confused:

Est ce que la caisse transmet bien en 9600 bauds ?

Christian_R: Est ce que la caisse transmet bien en 9600 bauds ?

Oui en 9600 bauds et en 7 bits de donnée, 1 bit de parité impaire

Bonjour à vous,

J'ai une question concernant le branchement de la carte Ethernet Shield avec le PC. Est-il possible de la avec un câble série croisé directement avec le PC et d'établir une connexion local entre un logiciel sur le PC et la carte ?

Merci d'avance.

Nawor: Oui en 9600 bauds et en 7 bits de donnée, 1 bit de parité impaire

Bonsoir tu parle de cable croisé, mais t'es tu déjà assuré hors arduino qu'il y a de l'activité (ENQ) sur la sortie rs232 de ta caisse ? entre GND et DATA ( GND=5 si DB9 , GND=7 si DB25)

d'autre part tu es certain que ta caisse envoie un ENQ automatiquement ? Pas besoin d'activation logicielle sur la caisse et/ou activation hard de certains signaux de la liaison RS232 (DTR,CTS, autres)

bonjour, tu pourrais donner la ref de la caisse?

Bonjour à tous, merci pour vos réponse,

walid1992: Bonjour à vous,

J'ai une question concernant le branchement de la carte Ethernet Shield avec le PC. Est-il possible de la avec un câble série croisé directement avec le PC et d'établir une connexion local entre un logiciel sur le PC et la carte ?

Merci d'avance.

J'utilise un RS232 Shield V2 et non un Ethernet shield. Qu'entend tu par "établir une connexion local entre un logiciel sur le PC et la carte", l'on peut recevoir une trame en connectant la caisse au PC et en écoutant le port.

Artouste: Bonsoir tu parle de cable croisé, mais t'es tu déjà assuré hors arduino qu'il y a de l'activité (ENQ) sur la sortie rs232 de ta caisse ? entre GND et DATA ( GND=5 si DB9 , GND=7 si DB25)

d'autre part tu es certain que ta caisse envoie un ENQ automatiquement ? Pas besoin d'activation logicielle sur la caisse et/ou activation hard de certains signaux de la liaison RS232 (DTR,CTS, autres)

Oui il y en a, quand je lis les trames directement sur le PC sans passer par Arduino voici ce que j’obtiens : |500x250

Ces trames ne correspondent pas au protocole de la caisse car l'on devrait récupérer de l’hexadécimal. Le protocole indique que pour toute communication un ENQ est envoyé. Non il n'y a pas de contrôle de flux logiciel.

infobarquee: bonjour, tu pourrais donner la ref de la caisse?

C'est une JDC ELEGANCE 150 II 6P

Merci d'avance pour vos prochaines réponses

Nawor: Oui il y en a, quand je lis les trames directement sur le PC sans passer par Arduino voici ce que j’obtiens : |500x250

Ces trames ne correspondent pas au protocole de la caisse car l'on devrait récupérer de l’hexadécimal. Le protocole indique que pour toute communication un ENQ est envoyé. Non il n'y a pas de contrôle de flux logiciel.

bonjour pas de gestion logicielle OK mais gestion Hard peut etre , connecté sur PC quelles sont les signaux de controle utilisés ? la connection rs232 est en DB9 ?

Artouste: bonjour pas de gestion logicielle OK mais gestion Hard peut etre , connecté sur PC quelles sont les signaux de contrôle utilisés ? la connection rs232 est en DB9 ?

Bonjour, Merci pour ta réponse. "Le protocole n'utilise aucun contrôle de flux matériel" c'est écrit dans le protocole. Tu parle du checksum ? C'est bien du DB9.

Du coup j'ai réussi à décomposer la trame en Hexa et on obtiens bien le ENQ. |496x500

Si je pouvais lire ces même donnée à partir de l'Arduino ce serais parfait =).

comme il semble que ton shield rs232 permette la redirection avec jumper (attention à l’inversion TX/RX)
connecte le en 2 et 3 pour l’utiliser en software serial
en utlisant le programme dessous ça devrait faire une redirection caisse <—>serial uno (usb)

#include <SoftwareSerial.h>

SoftwareSerial BTSerial(2, 3); // RX | TX
// RX arduino <--- TX cible 
// TX arduino ---> RX cible

void setup()
{
  Serial.begin(9600); // vitesse serial monitor
  
  BTSerial.begin(9600);  // vitesse software serial
}

void loop()
{  
  if (BTSerial.available())
    Serial.write(BTSerial.read());

 
  if (Serial.available())
    BTSerial.write(Serial.read());
}

Artouste:
comme il semble que ton shield rs232 permette la redirection avec jumper (attention à l’inversion TX/RX)
connecte le en 2 et 3 pour l’utiliser en software serial
en utlisant le programme dessous ça devrait faire une redirection caisse <—>serial uno (usb)

Merci pour ta réponse, j’étais justement en train de regarder de mon coté au niveau des pin aussi.

J’ai bien connecté en pin 2, 3 et tester le code mais cela ne me renvoie rien dans le Serial monitor. J’ai inversé les TX/RX a plusieurs reprise pour être sur que cela ne vienne pas de ça.

Nawor: Merci pour ta réponse, j'étais justement en train de regarder de mon coté au niveau des pin aussi.

J'ai bien connecté en pin 2, 3 et tester le code mais cela ne me renvoie rien dans le Serial monitor. J'ai inversé les TX/RX a plusieurs reprise pour être sur que cela ne vienne pas de ça.

en fait à ce stade , le shield rs232 n'a jamais été "certifié" fonctionnel avec le petit programme de test , lorsque tu envoie des infos par le serial monitor , vois tu de l'activité sur les leds TX/RX du shield ? C'est toi qui a soudé les connecteurs ? tu dispose d'un oscillo ?

Artouste: en fait à ce stade , le shield rs232 n'a jamais été "certifié" fonctionnel avec le petit programme de test , lorsque tu envoie des infos par le serial monitor , vois tu de l'activité sur les leds TX/RX du shield ? C'est toi qui a soudé les connecteurs ? tu dispose d'un oscillo ?

Non pas d'activité au niveau des leds avec le programme de test ou quand j'envois des info par le serial moniteur. Mais j'ai deja vu ces led s'allumer pour des programme qui ne dépendait pas de la connection RS232 du shield. C'est mon prof qui à soudé les connecteurs. Oui j'ai la possibilité d'utiliser un oscillo.

Nawor: Non pas d'activité au niveau des leds avec le programme de test ou quand j'envois des info par le serial moniteur. Mais j'ai deja vu ces led s'allumer pour des programme qui ne dépendait pas de la connection RS232 du shield. C'est mon prof qui à soudé les connecteurs. Oui j'ai la possibilité d'utiliser un oscillo.

Alors , il faut pister de l'activité à l'oscillo les entrées/sorties du max232 coté connecteur DB9 (rs232) et lignes de jumper je suppose que tu a un oscillo bicourbe , une voie sur la ligne RS232 , une voie sir la ligne TTL

Artouste: Alors , il faut pister de l'activité à l'oscillo les entrées/sorties du max232 coté connecteur DB9 (rs232) et lignes de jumper je suppose que tu a un oscillo bicourbe , une voie sur la ligne RS232 , une voie sir la ligne TTL

Je vois pas exactement comment réaliser ce test. Voici comment j'ai brancher ça. peut tu me guider plus précisément pour le branchement et pour la visualisation sur l'ocillo. |500x375

Je pense que le problème est plus lié au code. Merci d'avance.

Nawor: Je vois pas exactement comment réaliser ce test. Voici comment j'ai brancher ça. peut tu me guider plus précisément pour le branchement et pour la visualisation sur l'ocillo.

Je pense que le problème est plus lié au code. Merci d'avance.

il faut tester directement sur le max 232 regarde le datasheet , ce composant est simplement est convertisseur double RS232/TTL si rien n'arrive ni ne sort c'est qu'il y a un souci hard.

le code de test est on ne peut plus simple , ça duplique simplement si tu ne vois rien passer , c'est que ça coince qq part. il faut déjà te preocupper de valider ton shield. avec un oscillo c'est une manip qui prend 2 minutes , mais ce n'est pas simple d'expliquer à distance. Ton prof ne peut pas t'aider à faire cette manip de levée de doute ?

Dans ta photo, je ne vois pas de masse sur la prise DB9. Il faut une masse entre ton shield et la caisse.

Artouste: il faut tester directement sur le max 232 regarde le datasheet , ce composant est simplement est convertisseur double RS232/TTL si rien n'arrive ni ne sort c'est qu'il y a un souci hard.

le code de test est on ne peut plus simple , ça duplique simplement si tu ne vois rien passer , c'est que ça coince qq part. il faut déjà te preocupper de valider ton shield. avec un oscillo c'est une manip qui prend 2 minutes , mais ce n'est pas simple d'expliquer à distance. Ton prof ne peut pas t'aider à faire cette manip de levée de doute ?

Bonjour, Merci pour vos réponses, J'ai tester au niveau des cable avec l'ocillo et j'ai bien la donnée qui transite mais mon prof ne veut pas tester le Max232 (par rapport au court circuit possible ; et il dit que ca viens du code) ou du moin il ne veut pas m'aider à le tester, j'ai essayer des broches dont je ne suis pas sûr mais rien ne passsait au niveau de l'ocillo. Si les broches son vraiment spécifique pourrais tu me dire quels broche tester au niveau de la photo que tu avais ajouté précédement, merci.

fdufnews: Dans ta photo, je ne vois pas de masse sur la prise DB9. Il faut une masse entre ton shield et la caisse.

Sur la photo j'essais juste de tester le Shield, sinon c'est un cable rs232 qui fait le liens entre la caisse et l'arduino donc je suppose qu'il y a une masse.

donc je suppose qu'il y a une masse.

Mauvaise réponse. Essaye encore.

Comment veux-tu travailler proprement en te basant sur des suppositions?

Pour le test tu fais un petit programme qui envoie en boucle un caractère sur le TX de ton shield. 1) Tu regardes à l'oscilloscope ce qui sort de l'Arduino, 2) Tu regardes à l'oscilloscope ce qui sort du shield (ATTENTION le driver RS232 inverse le signal), 3) Tu reboucles TX sur RX dans la prise DB9 de sortie du shield (le 2 et le 3 normalement) 4) Tu regardes à l'oscilloscope ce qui entre dans l'Arduino (ATTENTION le récepteur RS232 inverse le signal), 5) Tu modifies ton programme de test pour envoyer sur Serial le caractère reçu comme ça tu peux l'afficher dans le terminal et ainsi toute ta chaîne est validée.

fdufnews:
Mauvaise réponse. Essaye encore.

Comment veux-tu travailler proprement en te basant sur des suppositions?

Pour le test tu fais un petit programme qui envoie en boucle un caractère sur le TX de ton shield.

  1. Tu regardes à l’oscilloscope ce qui sort de l’Arduino,
  2. Tu regardes à l’oscilloscope ce qui sort du shield (ATTENTION le driver RS232 inverse le signal),
  3. Tu reboucles TX sur RX dans la prise DB9 de sortie du shield (le 2 et le 3 normalement)
  4. Tu regardes à l’oscilloscope ce qui entre dans l’Arduino (ATTENTION le récepteur RS232 inverse le signal),
  5. Tu modifies ton programme de test pour envoyer sur Serial le caractère reçu comme ça tu peux l’afficher dans le terminal et ainsi toute ta chaîne est validée.

J’ai tester avec un autre RS232 v2 Shield mais ca bloque toujour au niveau de “if (Serial.available() > 0) {”
Le Serial.available() est toujours égal à 0 malgré le fait que je lui envoie belle et bien des donnée soit par le PC soit par la caisse. L’ocillo capte bien les données aussi.

J’ai un PC qui envois un caractère en continu toutes les secondes, ce PC recoit bien le message “Test” mais l’arduino ne veut pas lire le caractère.

#include <SoftwareSerial.h>

SoftwareSerial Caisse(2, 3); // RX | TX

byte carlu = 0; //variable contenant le caractère à lire
int cardispo = 0; //variable contenant le nombre de caractère disponibles dans le buffer

void setup()
{
  Serial.begin(9600);
  Caisse.begin(9600);
}
void loop()
{
  Caisse.println("Test");
  cardispo = Caisse.available();
  Serial.println(cardispo);

  while(cardispo > 0) //tant qu'il y a des caractères à lire
  {
    carlu = Caisse.read(); //on lit le caractère
    Caisse.print(carlu); //puis on le renvoi à l’expéditeur tel quel
    cardispo = Caisse.available(); //on relit le nombre de caractères dispo
  }
  //fin du programme
  delay(500);
}