[C++]Help !! Port série

Help !! Port série [C++] - C++ - Programmation

Marsh Posté le 03-05-2004 à 18:14:06    

Alors voila j'ai trouvé un petit code et je l'ai reaménagé pour moi meme sauf que biensur ca marche pas. Le but est d'une machine 1 envoyé une chaine de caractère sur une machine 2.
Voivi les codes utilisés :
Pour l'emission sur la machine 1 :

Code :
  1. // FICHIERS D'INCLUSION
  2. //------------------------------------------------------------------------------
  3. #include <windows.h>
  4. #include <winbase.h>
  5. #include <stdio.h>
  6. #include <conio.h>
  7. #include <string.h>
  8. // CONSTANTES
  9. //-------------------------------------------------------------------------------
  10. // Définition du code d'erreurs
  11. typedef enum
  12. {
  13.     e_ErrCom_None,    // Pas d'erreur
  14.     e_ErrCom_Creation,   // Erreur lors de la création du flux
  15.     e_ErrCom_Utilise,   // Le port com est déjà utilisé
  16.     e_ErrCom_Inexistant,  // Le port com n'existe pas
  17.     e_ErrCom_Timeout,   // Timeout lors d'une émission-réception
  18.     e_ErrCom_Emission,   // Erreur lors de l'émission
  19.     e_ErrCom_Reception,   // Erreur lors de la réception
  20.     e_ErrCom_Definition_Trame,  // Erreur de définition de la trame
  21.     e_ErrCom_Nack,    // Demande non prise en coompte
  22.     e_ErrCom_Checksum   // Erreur de checksum
  23. } e_ErrCom;
  24. // Nom du port série
  25. #define PORT1       "COM1"
  26. #define PORT2       "COM2"
  27. // Définition des vitesses de communication
  28. #define V2400       2400
  29. #define V4800       4800
  30. #define V1200       1200
  31. #define V9600       9600
  32. // Définition du nombre de bits
  33. #define BITS_7  7
  34. #define BITS_8  8
  35. // Définition du nombre de bits de stop
  36. #define BIT_DE_STOP_1   1
  37. #define BIT_DE_STOP_2   2
  38. // Définition de la parité
  39. #define PAS_DE_PARITE   'N'
  40. #define PARITE_IMPAIRE  'O'
  41. #define PARITE_PAIRE    'E'
  42. // Codes de retour génériques
  43. #define OK 1
  44. #define KO 0
  45. // Longueur max réservée pour une trame
  46. #define LG_TRAME    100
  47. // PROTOTYPES
  48. //----------------------------------------------------------------------------
  49. e_ErrCom OuvreCom(char *strPort,long BaudRate,int BitsSize,int Parity,int StopBits);
  50. e_ErrCom EmissionCom(void *trameRecue, unsigned int nCount);
  51. void FermeCom();
  52. // VARIABLES GLOBALES
  53. //-----------------------------------------------------------------------------
  54. DCB g_DCB;                          // structure dcb du port
  55. e_ErrCom g_ErrCom= e_ErrCom_None;   // Variable des erreurs de com
  56. HANDLE g_hCom = 0;     // handle de la com
  57. char *trameRecue="salut\0";
  58. unsigned int NbMxCar = 100;
  59. unsigned int NbCarRecus;
  60. HWND hyper_term;
  61. void main (void)
  62. {
  63.    
  64. printf("Envoi du message\n" );
  65. //Exemple de configuration du port serie :
  66.     g_ErrCom=OuvreCom(PORT1,V9600,BITS_8,PARITE_PAIRE,BIT_DE_STOP_1);
  67.     //Exemple d'emission
  68. g_ErrCom=EmissionCom(trameRecue,7);
  69. printf("%s",trameRecue);
  70. printf("Fin d'envoi du message\n" );
  71. // FermeCom();
  72. }
  73. //------------------------------------------------------------------------------
  74. // FONCTION : OuvreCom
  75. //------------------------------------------------------------------------------
  76. // DESCRIPTION  :
  77. // Initialise et ouvre un port série
  78. //
  79. //------------------------------------------------------------------------------
  80. // PARAMETRES   :  
  81. //      - strPort       Nom du port "COM1","COM2"
  82. //      - BaudRate      Vitesse
  83. //      - BitsSize      Taille de l'info
  84. //      - Parity        Parité
  85. //      - StopBits      Nombre de bits de stop
  86. //
  87. // RETOUR   :Code d'erreur
  88. //------------------------------------------------------------------------------
  89. e_ErrCom OuvreCom(char *strPort,long BaudRate,int BitsSize,int Parity,int StopBits)
  90. {
  91.     g_ErrCom = e_ErrCom_None;
  92.     // On ouvre le port série
  93.     g_hCom = CreateFile(strPort,GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,CREATE_NEW,FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING ,NULL);
  94.     if(g_hCom == INVALID_HANDLE_VALUE)
  95.     {
  96.         // Echec
  97.         g_ErrCom=e_ErrCom_Creation;
  98.     }
  99.     else
  100.     {
  101.         // On vide les buffers
  102.         PurgeComm(g_hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);     
  103.         // On paramètre le port série
  104.         g_DCB.DCBlength = sizeof(DCB);
  105.         //Configuration actuelle
  106.         GetCommState(g_hCom, &g_DCB);
  107.         //Modification du DCB
  108.         g_DCB.BaudRate=BaudRate;
  109.         g_DCB.ByteSize=BitsSize;
  110.         g_DCB.Parity=Parity;
  111.         g_DCB.StopBits=StopBits;
  112.         g_DCB.fDtrControl=DTR_CONTROL_DISABLE;
  113.         //Configuration de la liaison serie
  114.         SetCommState(g_hCom,&g_DCB);
  115.     }
  116.     return g_ErrCom;
  117. }
  118. //----------------------------------------------------------------------------
  119. // FONCTION : EmissionCom
  120. //----------------------------------------------------------------------------
  121. // DESCRIPTION  :
  122. // Emission d'octets sur la liaison série
  123. //
  124. //----------------------------------------------------------------------------
  125. // PARAMETRES   :  
  126. //      -lpBuf Pointeur sur les octets a emettre
  127. //      -nCount Nombre d'octet a emettre
  128. //
  129. //----------------------------------------------------------------------------
  130. // RETOUR   :Code d'erreur
  131. //----------------------------------------------------------------------------
  132. e_ErrCom EmissionCom(void * trameRecue,unsigned int nCount)
  133.     DWORD NumBytes=0;
  134.     if(g_hCom!=NULL)
  135.     {
  136.         // On pari sur pas d'erreur
  137.         g_ErrCom=e_ErrCom_None;
  138.         //Emission du buffer
  139.  if(WriteFile(g_hCom,trameRecue,nCount,&NumBytes,NULL)==0)
  140.         {
  141.             g_ErrCom=e_ErrCom_Emission;
  142.         }
  143.     }
  144.     else
  145.         //Le port n'a pas été ouvert
  146.         g_ErrCom=e_ErrCom_Creation;
  147. printf("%s\n",trameRecue);
  148.     return g_ErrCom;
  149. }
  150. //-----------------------------------------------------------------------
  151. // FONCTION : FermeCom
  152. //-----------------------------------------------------------------------
  153. // DESCRIPTION  :
  154. // Ferme le port série préalablement ouvert avec OuvreCom
  155. //
  156. //-----------------------------------------------------------------------
  157. // PARAMETRES   :  
  158. //      Néant
  159. //-----------------------------------------------------------------------
  160. // RETOUR   :Néant
  161. //-----------------------------------------------------------------------
  162. void FermeCom()
  163. {
  164.     if(g_hCom!=NULL)
  165.     {
  166.         CloseHandle(g_hCom);
  167.     }
  168. }


 
Pour la reception sur la machine 2 :
 

Code :
  1. // FICHIERS D'INCLUSION
  2. //------------------------------------------------------------------------------
  3. #include <windows.h>
  4. #include <winbase.h>
  5. #include <stdio.h>
  6. #include <conio.h>
  7. #include <string.h>
  8. // CONSTANTES
  9. //-------------------------------------------------------------------------------
  10. // Définition du code d'erreurs
  11. typedef enum
  12. {
  13.     e_ErrCom_None,      // Pas d'erreur
  14.     e_ErrCom_Creation,  // Erreur lors de la création du flux
  15.     e_ErrCom_Utilise,       // Le port com est déjà utilisé
  16.     e_ErrCom_Inexistant,    // Le port com n'existe pas
  17.     e_ErrCom_Timeout,   // Timeout lors d'une émission-réception
  18.     e_ErrCom_Emission,      // Erreur lors de l'émission
  19.     e_ErrCom_Reception,     // Erreur lors de la réception
  20.     e_ErrCom_Definition_Trame,  // Erreur de définition de la trame
  21.     e_ErrCom_Nack,  // Demande non prise en coompte
  22.     e_ErrCom_Checksum       // Erreur de checksum
  23. } e_ErrCom;
  24. // Nom du port série
  25. #define PORT1       "COM1"
  26. #define PORT2       "COM2"
  27. // Définition des vitesses de communication
  28. #define V1200       1200
  29. #define V2400       2400
  30. #define V4800       4800
  31. #define V9600       9600
  32. // Définition du nombre de bits
  33. #define BITS_7  7
  34. #define BITS_8  8
  35. // Définition du nombre de bits de stop
  36. #define BIT_DE_STOP_1   1
  37. #define BIT_DE_STOP_2   2
  38. // Définition de la parité
  39. #define PAS_DE_PARITE   'N'
  40. #define PARITE_IMPAIRE  'O'
  41. #define PARITE_PAIRE    'E'
  42. // Codes de retour génériques
  43. #define OK 1
  44. #define KO 0
  45. // Longueur max réservée pour une trame
  46. #define LG_TRAME    100
  47. // PROTOTYPES
  48. //----------------------------------------------------------------------------
  49. e_ErrCom OuvreCom(char *strPort,long BaudRate,int BitsSize,int Parity,int StopBits);
  50. e_ErrCom ReceptionCom(void *lpBuf, unsigned int nCountMax, unsigned int *pCountRead);
  51. void FermeCom();
  52. // VARIABLES GLOBALES
  53. //-----------------------------------------------------------------------------
  54. DCB g_DCB;                          // structure dcb du port
  55. e_ErrCom g_ErrCom= e_ErrCom_None;   // Variable des erreurs de com
  56. HANDLE g_hCom = 0;
  57. HWND hyper_term;       // handle de la com
  58. char *trameRecue [10];
  59. //Nombre de caracteres maxi a lire
  60. unsigned int NbMaxCar=100;
  61. //pointeur sur le nombre de caractère recu
  62. unsigned int NbCarRecus;
  63. void main (void)
  64. {
  65.     //Exemple de configuration du port serie :
  66.     g_ErrCom=OuvreCom(PORT1,V9600,BITS_8,PARITE_PAIRE,BIT_DE_STOP_1);
  67. //Exemple de reception
  68. printf("Attention Reception...\n" );
  69. g_ErrCom=ReceptionCom(trameRecue,NbMaxCar,&NbCarRecus);
  70. printf("%s\n",trameRecue);
  71. printf("Fin Reception\n" );
  72. //Fermeture du port de communication
  73. }
  74. //------------------------------------------------------------------------------
  75. // FONCTION : OuvreCom
  76. //------------------------------------------------------------------------------
  77. // DESCRIPTION  :
  78. // Initialise et ouvre un port série
  79. //
  80. //------------------------------------------------------------------------------
  81. // PARAMETRES   :  
  82. //      - strPort       Nom du port "COM1", "COM2"
  83. //      - BaudRate      Vitesse
  84. //      - BitsSize      Taille de l'info
  85. //      - Parity        Parité
  86. //      - StopBits      Nombre de bits de stop
  87. //
  88. // RETOUR   :Code d'erreur
  89. //------------------------------------------------------------------------------
  90. e_ErrCom OuvreCom(char *strPort,long BaudRate,int BitsSize,int Parity,int StopBits)
  91. {
  92.     g_ErrCom = e_ErrCom_None;
  93.     // On ouvre le port série
  94.     g_hCom = CreateFile(strPort,GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING,NULL);
  95.     if(g_hCom == INVALID_HANDLE_VALUE)
  96.     {
  97.         // Echec
  98.         g_ErrCom=e_ErrCom_Creation;
  99.     }
  100.     else
  101.     {
  102.         // On vide les buffers
  103.         PurgeComm(g_hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);     
  104.         // On paramètre le port série
  105.         g_DCB.DCBlength = sizeof(DCB);
  106.         //Configuration actuelle
  107.         GetCommState(g_hCom, &g_DCB);
  108.         //Modification du DCB
  109.         g_DCB.BaudRate=BaudRate;
  110.         g_DCB.ByteSize=BitsSize;
  111.         g_DCB.Parity=Parity;
  112.  g_DCB.StopBits=StopBits;
  113.         g_DCB.fDtrControl=DTR_CONTROL_DISABLE;
  114.         //Configuration de la liaison serie
  115.         SetCommState(g_hCom,&g_DCB);
  116.     }
  117.     return g_ErrCom;
  118. }
  119. //---------------------------------------------------------------------------
  120. // FONCTION : ReceptionCom
  121. //---------------------------------------------------------------------------
  122. // DESCRIPTION  :
  123. // Reception de caractères sur la liaison série
  124. //
  125. //---------------------------------------------------------------------------
  126. // PARAMETRES   :  
  127. //      -lpBuf Pointeur sur le buffer de caractère a lire
  128. //      -nCountMax Nombre maxi de caractère a lire
  129. //      -pCountRead Pointeur sur le nombre de caractères lus
  130. //---------------------------------------------------------------------------
  131. // RETOUR   :Code d'erreur
  132. //---------------------------------------------------------------------------
  133. e_ErrCom ReceptionCom(void *trameRecue,unsigned int nCountMax, unsigned int* pCountRead)
  134. {
  135. COMSTAT Stat;
  136. DWORD Errors;
  137. unsigned int nCarALire;
  138. unsigned long NCarLus=0;
  139.     if(g_hCom!=NULL)
  140.     {
  141.         //on pari sur pas d'erreur
  142.         g_ErrCom=e_ErrCom_None;
  143.         //Pour éviter de gérer un time out
  144.         Sleep(5000);
  145.         //Pour connaitre le nombre d'octets dans le buffer d'entrée
  146.         ClearCommError(g_hCom,&Errors,&Stat);
  147.         nCarALire=Stat.cbInQue;
  148.         //On effectue la lecture si il y a des caractères présents
  149.         if( (nCarALire>0)&&(nCarALire<=nCountMax) )
  150.         {
  151.             if(ReadFile(g_hCom,trameRecue,nCarALire,&NCarLus,NULL)==0)
  152.   {   
  153.                 g_ErrCom=e_ErrCom_Reception;
  154.             }
  155.         }
  156.         *pCountRead=NCarLus;
  157.     }
  158.     else
  159.         //Le port n a pas été ouvert
  160.         g_ErrCom=e_ErrCom_Creation;
  161.     //Compte rendu de l'exécution
  162.     return g_ErrCom;
  163. }
  164. //-----------------------------------------------------------------------
  165. // FONCTION : FermeCom
  166. //-----------------------------------------------------------------------
  167. // DESCRIPTION  :
  168. // Ferme le port série préalablement ouvert avec OuvreCom
  169. //
  170. //-----------------------------------------------------------------------
  171. // PARAMETRES   :  
  172. //      Néant
  173. //-----------------------------------------------------------------------
  174. // RETOUR   :Néant
  175. //-----------------------------------------------------------------------
  176. void FermeCom()
  177. {
  178.     if(g_hCom!=NULL)
  179.     {
  180.         CloseHandle(g_hCom);
  181.     }
  182. }


 
Alors ca ca marche un peu près du style on envoie la chaine salut et sur l'autre pc ca écit sW8t (comprend pas, sans doute une erreur)
Mais la ou cela devient interressant c'est que je me suis dis que j'allais regardé les réglages d'hyperterminal je cree une connection je mregarde et je ferme tout. Et la miracle ca marche je me dis impeccable mais en fait non car mes codes ne fonctionne que lorsque je lance hyperterminal avent. Je suis meme alle jusqu'a regarde les trames a l'analyseur de protocoles !!
Donc la si qq veut bien me donner le code qui marche cela eviterai que je devienne fou
Merci a tous.

Reply

Marsh Posté le 03-05-2004 à 18:14:06   

Reply

Marsh Posté le 03-05-2004 à 18:28:44    

- pour la reception sur la machine 2 utilise un tableau tout court au lieu de "char *trameRecue [10];" car je suis pas sûr que ca soit volontaire...
- enleve la parité
- pour el createfile essaye comme ca : CreateFile(strPort,GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL)
avec generic_write pour l'emission...
 
moi j'avais fait comme ca et ca marchait..


---------------
Fleur de métal, entité invulnérable, vêtue tant bien que mal, d'une muraille inébranlable...
Reply

Marsh Posté le 03-05-2004 à 18:31:34    

ben le probleme c'est que j'ai deja essaye tout ca et ce que j'ai mis la haut c'est les derniers trucs testes mais rien a fiare ca veut pas marche

Reply

Marsh Posté le 03-05-2004 à 18:38:23    

ce code source je m'en suis inspiré et j'ai trop galeré pour faire marcher mon appli... :p
qd t'envoies juste un caractere ca plante aussi ?
 
sinon pour la structure DCB essaye avec les constantes predefinies http://msdn.microsoft.com/library/ [...] cb_str.asp
je crois que j'avais eu des pb aussi avec ca...


---------------
Fleur de métal, entité invulnérable, vêtue tant bien que mal, d'une muraille inébranlable...
Reply

Marsh Posté le 03-05-2004 à 19:18:49    

non en fait un seul caracteres ca marche impec mais quand je passe a 2 c'est impossible le deuxiemes est totalement faux.

Reply

Marsh Posté le 03-05-2004 à 19:20:42    

les constantes predefinies j'ai aussi essaye mais ca change rien mais il fo absolument que j'ai un code pour envoyer une chaine c'est kan meme pas bien complique kan meme.
En plus je comprends pas ce coup d'hyperterminal

Reply

Marsh Posté le 03-05-2004 à 20:00:03    

&numBytes et &NCarLus sont corrects apres l'ecriture et la lecture ?
 
si demain t'as toujours pas la solution j'essaierai de te montrer mon code pour comparer...
là je peux pas tester sur ce pc en plus... :/


Message édité par myst78 le 03-05-2004 à 20:00:22

---------------
Fleur de métal, entité invulnérable, vêtue tant bien que mal, d'une muraille inébranlable...
Reply

Marsh Posté le 03-05-2004 à 20:08:46    

ok merci bien je teste tout ca demain moi aussi au boulot et on reparle demain de tout ca merci et bonne soiree

Reply

Marsh Posté le 03-05-2004 à 20:09:21    

pour infos les 2 variables ne sont pas tjs corrects ca depend des fois

Reply

Marsh Posté le 03-05-2004 à 21:27:22    

si qq veut bien testé de son cote ou sii d'autre idée ne pas hésiter merci

Reply

Marsh Posté le 03-05-2004 à 21:27:22   

Reply

Marsh Posté le 03-05-2004 à 23:21:50    

Alaix a écrit :


 
Alors ca ca marche un peu près du style on envoie la chaine salut et sur l'autre pc ca écit sW8t (comprend pas, sans doute une erreur)
Mais la ou cela devient interressant c'est que je me suis dis que j'allais regardé les réglages d'hyperterminal je cree une connection je mregarde et je ferme tout. Et la miracle ca marche je me dis impeccable mais en fait non car mes codes ne fonctionne que lorsque je lance hyperterminal avent. Je suis meme alle jusqu'a regarde les trames a l'analyseur de protocoles !!
Donc la si qq veut bien me donner le code qui marche cela eviterai que je devienne fou
Merci a tous.


 
T'es sûr que c'est pas le contrôle de flux hard qui fout la zone ?
Si tu as un analyseur de protocole, cela ne devrait pas être un problème pour vérifier ça.
 
Tu devrais essayer de virer complètement le contrôle de flux.
Genre méthode radicale :
 

Code :
  1. g_DCB.fOutxCtsFlow=FALSE;
  2. g_DCB.fOutxDsrFlow=FALSE;
  3. g_DCB.fDtrControl=DTR_CONTROL_DISABLE;
  4. g_DCB.fDsrSensitivity=FALSE;
  5. g_DCB.fOutX=FALSE;
  6. g_DCB.fInX=FALSE;
  7. g_DCB.fRtsControl=RTS_CONTROL_DISABLE;


 
Tu peux également faire des trucs du genre EscapeCommFunction(g_hCom, CLRDTR);
 
 
Sinon, ce genre de problème peut arriver si tu utilise du matos plus ou moins exotique (genre adaptateur USB/série; à faible débit c'est vraiment l'enfer).
 
Sinon, j'aime bien le

Code :
  1. #define OK 1
  2. #define KO 0


 
:D

Reply

Marsh Posté le 05-05-2004 à 17:36:12    

merci c'est bon ca marche maintenant merci a tous

Reply

Marsh Posté le 05-05-2004 à 19:43:12    

Alaix a écrit :

merci c'est bon ca marche maintenant merci a tous


 
C'était quoi le problème ? Que ça puisse servir à d'autres ;)

Reply

Marsh Posté le 21-07-2004 à 12:37:43    

Bonjour

Reply

Marsh Posté le 21-07-2004 à 12:39:07    

oup desole erreur de manip. Je voulais dire bonjour a tous.
 
Donc j ai exactement le meme probleme, et je ne sais pas d ou ca vient et comment faire pr arranger ca. Jai essayé pas mal de choses differents. Je me demande si ca ne vien pas de la configuration du DCB . Si on pouvait ma ider je serais ravi
 
Merci

Reply

Sujets relatifs:

Leave a Replay

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