Problème de communication série

Bonjour,

Je suis nouveau sur le forum et dans la communauté Arduino.

Mon problème : je souhaite faire une application windows qui communique avec un arduino micro par le port série USB de la carte. Jusqu'à là je ne pense pas que ce soit bien sorcier.

Mon application est développé sous visual studio 2017 en C#, j'ai fait un bout de code qui envoi un octet lors de l'appui sur un bouton de l'application. Coté arduino un bout de code attend un message puis renvoi le message par le port série ci dessous le code :

byte octetRecu = 0;

void setup() {
  // put your setup code here, to run once:
  /*Serial Port*/
  Serial.begin(9600); 
}

void loop() {
  // put your main code here, to run repeatedly:
if (Serial.available()>0)
    {
      receptionData();
    }
}

void receptionData()
{
  octetRecu = Serial.read();
  Serial.println(octetRecu);
}

Le code arduino fonctionne parfaitement avec le moniteur série de l'IDE et j'ai bien mes 2 leds qui s'allume (TX et RX) de l'arduino lors de l'envoi d'un octet et le caractère s'affiche dans la console.

Par contre avec mon application windows je n'ai que la led RX de l'arduino qui s'allume. Je ne comprend pas d'où ça peut venir. La configuration du port com coté windows est 9600 bauds 8 bits pas de parity 1 bit de stop.

Est ce qu'il y a une subtilité supplémentaire que j'aurais zapper.

Merci par avance.

Tom

Pour information j'ai essayé avec TeraTerm (une sorte d'hyperTerminal) et le fonctionnement est comme avec le moniteur serie de l'IDE, donc le problème vient de mon application visual mais je ne comprend pas pourquoi.

Tom

Une chose étrange se passe lorsque j'utilise TeraTerm ou moniteur série, lorsque je change la vitesse de communication sur l'un ou l'autre, des données sont passées à l'arduino (je vois la led RX clignoter). Du coup est ce qu'il n'y aurai pas de message qui passe lors d'un changement de vitesse de port que je ne fais pas avec mon application visual ?

J'ai aussi fait l'essai avec une application QT (l'exemple terminal série) et ça ne fonctionne pas non plus.

Salut
La communication série sous avec l'API WIN32 est une galère. Je te conseillerais plutôt d'utiliser PYTHON est PYSERIAL.
Tu obtiendras de plus une application portable, compatible Windows et Linux.

Aucune donnée n'est échangée sur la ligne lors d'un changement de vitesse.

@+

Bonsoir,

Merci pour cette réponse je vais regarder du côté python, j'avoue ne pas trop connaître ce langage si vous avez un exemple de code avec liaison série je serais preneur. Par contre il y a quand même un truc étrange lorsque j'utilise moniteur série lorsque je change le baudrate ou que ferme la fenêtre j'ai la led rx qui clignote comme si une data passait...

je fais de la communication série depuis 30 ans et je puis vous assurer qu'aucune donnée n'est échangée lors d'un changement de baudrate. Le DTR peut bouger par contre.

On trouve énormément de tutos sur le WEB.
[python - Full examples of using pySerial package - Stack Overflow]python - Full examples of using pySerial package - Stack Overflow]python - Full examples of using pySerial package - Stack Overflow](python - Full examples of using pySerial package - Stack Overflow)
Attention de coupler la bonne version de PYTHON et PYSERIAL.
Avec PYTHON 2.7, PYSERIAL 2.7.
Avec PYTHON 3.4, PYSERIAL 3.4.

Personnellement j'utilise PYTHON 2.7 mais c'est plus une question d'habitude et de facilité.

@+

Dans les exemples on trouve souvent des lignes du genre :

ser = serial.Serial(
   port='/dev/ttyUSB1',
   baudrate=9600,
   parity=serial.PARITY_ODD,
   stopbits=serial.STOPBITS_TWO,
   bytesize=serial.SEVENBITS
)

Remplacer '/dev/ttyUSB1' (device série sous LINUX) par le port de communication Windows 'COM2', 'COM3', etc.
En général le port et le baudrate suffisent. Les valeurs par défaut sont 9600, 8bits, sans parité, 1 bit de stop, sauf précision contraire de ta part.

#ouverture COM2 9600 baud
ser = serial.Serial('COM2')
#ouverture COM2 115200 baud, timeout en réception 1 seconde
ser = serial.Serial('COM2', 115200, timeout=1)

La doc :

@+

PYTHON est un langage fonctionnel génial.
Cela vaut vraiment le coup de se former. On perd beaucoup moins de temps qu'avec C ou C++.

Tous mes développements à domicile sont faits en PYTHON, principalement sur RASPBERRY PI :

  • serveur de mesure de consommation/production EDF
  • serveur WEB
  • récepteur de télécommande infra-rouge
  • scripts de commande JSON pour mon serveur DOMOTICZ
  • etc.

N'hésite pas à poster ton code si tu as des soucis.

@+

Bonjour,

Merci pour toutes ses informations. Je n'hésiterais donc pas à revenir en cas de problème.

Encore merci.

Bonne journée

Par contre avec mon application windows je n'ai que la led RX de l'arduino qui s'allume

Bonjour,
on ne sait pas quel type d'arduino, donc quelle interface usb série est utilisée. S'il est de classe cdc, genre ch340, il faut penser à le configurer à la bonne vitesse dans le gestionnaire de périphériques

hbachetti:
PYTHON est un langage fonctionnel génial.
Cela vaut vraiment le coup de se former. On perd beaucoup moins de temps qu'avec C ou C++.

la productivité est effectivement plus grande qu'avec C ou C++ en effet mais Le temps gagné bien sûr se fait au détriment de l'optimisation des performances.

C ou C++ restent imbattables lorsque la vitesse d'exécution ou le contrôle de la mémoire (systèmes embarqués comme nos arduinos) sont importants. De manière générale Python n'est pas du tout adapté pour programmer à un niveau proche de la machine. Ensuite on peut méler Python et C/C++

Perso je déteste le fait que Les blocs de code sont définis par leur indentation...

—-

Pour la question du changement de baud aucune donnée n’est envoyée mais votre arduino (suivant le type) va rebooter parce que le programme va toucher DTR - c’est pour c’est peut être cela que vous voyez

trimarco232:
Bonjour,
on ne sait pas quel type d'arduino, donc quelle interface usb série est utilisée. S'il est de classe cdc, genre ch340, il faut penser à le configurer à la bonne vitesse dans le gestionnaire de périphériques

Bonjour dans mon premier post j'avais indiqué qu'il s'agissait d'un arduino micro. Je ne sais pas si c'est ça le type mais ce que je constate c'est que ça fonctionne très bien avec le moniteur série mais pas avec mon application visual. Par contre l'arduino comprend très bien ce que je lui envoie...

Merci en tout cas de prendre le temps de répondre.

Tom

Bonjour,
j'avais zappé ... je regarderai demain quand j'aurai vb net et un micro sous la main (de mémoire, ça marchait !)

J-M-L:
Pour la question du changement de baud aucune donnée n’est envoyée mais votre arduino (suivant le type) va rebooter parce que le programme va toucher DTR - c’est pour c’est peut être cela que vous voyez

Merci pour l'information. C'est quand même vraiment étrange car je n'arrive pas à envoyer une trame de l'arduino vers mon application. Aucune data ne sort de l'arduino (la LED TX ne s'allume pas).

Tom

Montage réalisé en croisant Tx et Rx ?

C ou C++ restent imbattables lorsque la vitesse d'exécution ou le contrôle de la mémoire (systèmes embarqués comme nos arduinos) sont importants. De manière générale Python n'est pas du tout adapté pour programmer à un niveau proche de la machine.

Je répondrais que tout dépend du développeur C et de sa capacité à pondre des algorithmes efficaces.
Il y a beaucoup d'idées reçues à ce sujet. Il ne faut pas oublier que PYTHON n'est pas un langage interprété, comme BASIC. Il est pré-compilé. Il ne faut pas oublier non plus que PYTHON est écrit en C.
Et son gros avantage, c'est la portabilité.

Il est bien entendu hors de question de faire du PYTHON sur une plateforme ARDUINO, c'est même impossible, il faut une RASPBERRY PI minimum. Même sur de gros STM32 F4, malgré leurs 180MHz d'horloge et leur 512K de FLASH, nous autres, développeurs embarqué, continuons à développer en C.

Enfin, pour ce qui est de programmer à un niveau proche de la machine, C et C++ ne permettent pas non plus de le faire sur une plateforme LINUX ou WINDOWS, étant donné que de toutes façons l'OS vous interdit toute action directe sur le matériel. Tout passe par les drivers, forcément écrits en C.

A partir du moment où on développe sur PC, les différences de performances entre C et PYHON passent inaperçues.
A mon sens développer en C sur PC en dehors du KERNEL, relève de l'aberration.
Pour augmenter les performances sur PC, rien de tel que de remplacer WINDOWS par LINUX. WINDOWS est un exemple parfait d'ailleurs de ce que peuvent faire de mauvais développeurs C.

Pour ceux qui ont quand même envie ou besoin de développer des applications de communication série sous Windows en C / C++, voici le source code de PySerial, dont on peut largement s'inspirer :

Comme on peut le voir c'est intégralement écrit en C !!!

le fichier serial/serialwin32.py concerne la partie WINDOWS.

ça fonctionne très bien avec le moniteur série mais pas avec mon application visual

Pour thomasmicolon : si le moniteur série reçoit c'est que ton ARDUINO envoie. Seule ton application PC est en cause. Je suppose que tu fermes bien ton moniteur série quand tu lances ton appli PC ???
Pour ce qui est de ton IDE ARDUINO, je pense que le port série est ouvert lors du téléchargement et il est fermé ensuite.
Dans ton application PC Prends bien l'habitude d'afficher des messages d'erreur en cas de problème lors de l'ouverture, de l'écriture ou de la lecture du port série, en affichant la raison exacte (port déjà ouvert, port inconnu, etc.)
Toutes choses dont tu n'aurais pas à te préoccuper en PYTHON grâce à sa gestion par exceptions.

@+

Christian_R:
Montage réalisé en croisant Tx et Rx ?

Il n'y a pas d'inversion possible entre TX et RX car j'utilise le même port de liaison série que celui pour charger le programme dans l'arduino et j'arrive parfaitement à charger le programme. J'arrive d'ailleurs aussi à lui envoyer un caractère qu'il comprend parfaitement à la réception de ce caractère, j'allume la LED intégré.

hbachetti:
Pour thomasmicolon : si le moniteur série reçoit c'est que ton ARDUINO envoie. Seule ton application PC est en cause. Je suppose que tu fermes bien ton moniteur série quand tu lances ton appli PC ???
Pour ce qui est de ton IDE ARDUINO, je pense que le port série est ouvert lors du téléchargement et il est fermé ensuite.
Dans ton application PC Prends bien l'habitude d'afficher des messages d'erreur en cas de problème lors de l'ouverture, de l'écriture ou de la lecture du port série, en affichant la raison exacte (port déjà ouvert, port inconnu, etc.)
Toutes choses dont tu n'aurais pas à te préoccuper en PYTHON grâce à sa gestion par exceptions.

@+

Merci je vais jeter un oeil aux messages d'erreur. Mais comme je l'ai expliqué j'arrive à envoyer un caractère à l'arduino, le truc c'est qu'elle ne me répond pas. Je n'utilise pas les RTS, CTS, DSR, DCD ou DTR est ce que ça peut venir de là ? Le moniteur série le paramétrerais par défaut ??

Merci pour le coup de main

Bon j'ai résolu mon problème, il faut activer le DTR du portCom dans visual ou autre pour que l'arduino puisse émettre des données.

Ça aidera peut être quelqu'un.

Bonjour,
merci, ça doit être une particularité du leonardo, bien vu !