Gestion du RTS sur un port série

Gestion du RTS sur un port série - API Win32 - Programmation

Marsh Posté le 06-02-2009 à 09:28:20    

Bonjour,
 
Attention, c'est un problème technique assez pointu !
 
Je développe en Builder C++ sous Windows XP.
Mon application pilote un port série pour dialoguer avec un indicateur de poids (une balance) en RS485 2 fils.
Côté matériel j'ai donc un convertisseur RS232 / RS485 entre le PC et l'indicateur de poids.
La prise de ligne se fait par le signal RTS : lors de l'envoi de la trame de requête, le signal RTS 'monte' (la ligne RS485 est donc prise), puis le RTS retombe dès que le dernier caractère a été émis (la ligne RS485 est libérée), l'indicateur de poids peut alors répondre.
Ce fonctionnement du RTS est entièrement géré par l'API Windows.
Pour cela j'utilise les fonctions :
 
//ouverture du port série :
hdcom=CreateFile(comx,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN­_EXISTING,0,0);
//Reset du port :
ClearCommError(hdcom,&pErr,NULL);
//Init du port série :
SetCommState(hdcom,&dcb);
//Envoie des données :
crw = WriteFile(hdcom,buffer,len,&nbcarecrits,NULL);
//Lecture de la réponse :
crr = ReadFile(hdcom,buffer,len,&nbcarlus,NULL);
 
Voici mon problème :
Si mon application est le seul programme lancé sur le PC, je me retrouve avec des erreurs de réception.
Je lance une autre application (Google Earth par exemple), la liaison fonctionne correctement.
J'ai réalisé d'autres essais :

  • utilisation du port série de la carte mère (pilote Microsoft) ou utilisation d'une carte série multivoies (pilote MOXA) : idem.
  • lancement d'une autre application que Google Earth : idem, à partir du moment qu'elle consomme un peu de mémoire.
  • essais sur un autre PC, d'une autre marque : idem.
  • essais en liaison avec un automate programmable en RS485 2 fils : idem.


J'ai branché l'oscilloscope pour visualiser le signal RTS et le signal de réponse de l'indicateur de poids (côté 5V sur la carte de l'appareil) : lorsque mon application est seule à tourner sur le PC, le RTS retombe trop tard (l'indicateur a déjà commencé à répondre).
Si une autre application est lancée, le signal RTS retombe plus tôt et la liaison fonctionne correctement.
 
Bien sûr, la solution technique est d'utiliser un convertisseur RS232 / RS485 qui gère le retournement tout seul, sans avoir besoin du RTS.
Mais j'aimerais bien conserver mes convertisseurs actuels et surtout comprendre le phénomène.
 
Si quelqu'un a une idée, je suis preneur.

Reply

Marsh Posté le 06-02-2009 à 09:28:20   

Reply

Marsh Posté le 25-02-2009 à 15:48:39    

Hello,  
 
Voila un problème d'informatique industriel bien classique.
Mais par expérience je te conseillerais d'attaquer le problème à plus bas niveau : Gère le RTS toi même.  
Tu le mets non géré dans la config (SetCommState) puis tu le fais monter AVANT l'envoi de ta trame et descendre dès que ton buffer est vide.  
Jette un oeil sur la fonction EscapeCommFunction qui permet de fait ca.
Microsoft n'a jamais su gérer correctement une liaison série !
 
A+

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed