communication par port com

communication par port com - C++ - Programmation

Marsh Posté le 02-06-2003 à 10:59:24    

Nous avons un programme qui communique avec une carte par port COM.  
 
Notre structure de port ressemble a ça:  
 

Code :
  1. //Récupération des informations enregistées du port série dans votre structure.  
  2.    GetCommState (hPort, // instance d'accès de votre port série  
  3.    &PortDCB);         // Structure de configuration  
  4.    // mise à jour de la structure  
  5.    PortDCB.DCBlength = sizeof (DCB);
  6.    PortDCB.BaudRate = 2400;
  7.    PortDCB.fBinary = TRUE;
  8.    PortDCB.fParity = TRUE;
  9.    PortDCB.fOutxCtsFlow = FALSE;
  10.    PortDCB.fOutxDsrFlow = FALSE;
  11.    PortDCB.fDtrControl = DTR_CONTROL_ENABLE;
  12.    PortDCB.fDsrSensitivity = FALSE;
  13.    PortDCB.fTXContinueOnXoff = TRUE;
  14.    PortDCB.fOutX = FALSE;
  15.    PortDCB.fInX = FALSE;
  16.    PortDCB.fErrorChar = FALSE;
  17.    PortDCB.fNull = FALSE;
  18.    PortDCB.fRtsControl = RTS_CONTROL_ENABLE;
  19.    PortDCB.fAbortOnError = FALSE;
  20.    PortDCB.ByteSize = 8;
  21.    //PortDCB.Parity = NOPARITY;  
  22.    PortDCB.StopBits = ONESTOPBIT;
  23. //Renvoie des nouvelles informations dans le registre du port série
  24. if (!SetCommState (hPort, &PortDCB))
  25.  {
  26.    //code d'erreur
  27.  MessageBox ("Une erreur est survenue lors de la configuration du port série","erreur", MB_OK);
  28.  //dwError = GetLastError ();
  29.  return FALSE;
  30.  }


 
Deja on n'est pas sur que la structure soit configuré correctement. Il nous faudrait configurer la structure pour avoir une parité impair, un longueur d'information de 8bits et un stop bit.  
 
L'envoie de demande de parametre semble fonctionner:  
 

Code :
  1. void ecrire(char c)              /* ‚criture sur le port s‚rie */
  2.     {
  3.    DWORD dwNumBytesWritten;
  4.    BYTE Byte = c;
  5.    if (!WriteFile (hPort, // Instance d'accès de votre port série  
  6.    &Byte,                //Pointeur sur la donnée à envoyer  
  7.     1,                    //Nombre de byte à envoyer  
  8.    &dwNumBytesWritten,   //Pointer sur la variable contenant le nombre  
  9.                        //byte écrit dans le buffer  
  10.     NULL))                //Doit être NULL pour Windows CE  
  11.       {
  12.          //code d'erreur  
  13.       MessageBox ("Une erreur est survenue lors de l'écriture sur le port","erreur", MB_OK);
  14.       }
  15.    }


 
Par contre on a un probleme a la lecture sur le port. La fonction WaitCommEvent() attend et reste bloquée...  
 
 

Code :
  1. DWORD dwCommStatus; // variable de stockage pour les évènements  
  2.    
  3.          
  4.    //Cette fonction définit les évènements pour lesquels  
  5.    //ont va réagir par rapport à notre instance  
  6.    SetCommMask (hPort,
  7.    EV_RXCHAR ); //ici EV_RXCHAR indique que l'on va détecter la réception           
  8.             //de données (cette entrée est de type DWORD)  
  9.             //Cette fonction est bloquante, elle va attendre  
  10.             //des événements définit par le mask et  
  11.             //Elle stockera le type d'événement qui l'aura réveillée dans une variable.  
  12.    WaitCommEvent (hPort, //instance d'accès du port série  
  13.    &dwCommStatus,       //Pointeur sur la variable de stockage pour les évènements  
  14.                       //Cette entrée est de type LPDWORD  
  15.    0);                  //pointeur sur la structure d'overlapped.  
  16.                       //Ici il n'y en a pas.  
  17.                       //cette entrée est de type LPOVERLAPPED  
  18.             //Cette fonction permet la lecture du buffer d'entrée du port série  
  19.    while(ReadFile(hPort,      //Instance sur l'accès du port série  
  20.     &Byte,               //Conteneur pour récupérer le byte lu  
  21.    1,                   //Nombre de byte à lire  
  22.    &dwBytesTransferred, //Pointer sur le nombre de byte lu, sert à  
  23.                       //la gestion propre de la fonction read.  
  24.    0)!=0)                 //Doit être NULL pour Windows CE  
  25.    {tab[i]=Byte;
  26.    i++;}


 
 
 
Donc si quelqu'un voyais d'ou venait le(s) probleme(s)...  
Comme on débute dans la communication par port com on a un peu de mal, et de l'aide serait la bienvenue.  
 
Merci d'avance


Message édité par KarmaKiller le 03-06-2003 à 08:34:34
Reply

Marsh Posté le 02-06-2003 à 10:59:24   

Reply

Marsh Posté le 02-06-2003 à 12:49:23    

deja, pour la fct GetCommState(), son but est de remplir la struct device-control block, donc je vois pas pourquoi t'as besoin de la modifier apres l'appel a GetCommState(). Si tu modifies les infos de ta struct, il faut appeler SetCommState() pour en informer ton port com, sinon je vois pas l'interet...
 
ensuite pour le WaitCommEvent() qui reste bloqué, c'est chelou... t'as bien appelé SetCommMask() avec les bons parametres pour définir les evenements que tu veux ? montres aussi l'ouverture de ton port com (le CreateFile).
 
exemple des msdn : (la difference est qu'eux font un CreateFile avec le overlapped)
http://msdn.microsoft.com/library/ [...] events.asp

Reply

Marsh Posté le 03-06-2003 à 08:36:27    

J'ai édité mon post et j'ai rajouté le code du setcommstate.
Et voila l'utilisation du createfile:

Code :
  1. LPSTR lpszPortName = _T("COM1:" );
  2.        
  3.  // Les deux points ( : ) sont important ils indiquent à la
  4.  //fonction qu'il s'agit du chemin d'une ressource de communication.
  5.  //Ce chemin est connu de Windows grâce à la base de registre          de l'OS
  6.  //Il n'est donc pas nécessaire de connaître l'adresse de
  7.  //base du port série en question
  8.  //ouverture du port serie
  9.  hPort = CreateFile (
  10.  lpszPortName,                  //pointeur sur le nom du port
  11.  GENERIC_READ | GENERIC_WRITE,  //accès en lecture ou en écriture
  12.  0,                             //Share mode
  13.  NULL,                          //pointeur vers les attributs de securite
  14.  OPEN_EXISTING,                 //Cela indique que l'instance sera créée à condition que le port de  
  15.            //communication demandé existe et donc est connu de l'OS                             
  16.  0,                             //attribut du port
  17.  NULL);                         //Handle du port avec attribut a copier
  18. //vérification sur la création de l'instance
  19. if ( hPort == INVALID_HANDLE_VALUE )
  20. {
  21.    MessageBox ("Une erreur est survenue lors de l'ouverture du port","erreur", MB_OK);
  22. }

Reply

Marsh Posté le 03-06-2003 à 09:27:47    

Vu que tu es sur Visual la, y a un composant magique pour les com qui est un composant ActiveX (que tu peux en plus enregistrer au cas ou ds ton soft qsi pas installe etc), MSCOMM32.ocx.
 
A partir de lui tu peux creer une classe (enfin VC++ te le fait) et y a tout pour la gestion des ports com et l'avantage c qu'il te previent via une callback (bien pratique).
 
MSDN est ton amie :)

Reply

Marsh Posté le 03-06-2003 à 11:29:04    

Je viens d'essayer avec l'activeX et on a un probleme, les methodes auquelles on a accés avec notre VC++6 ne sont pas les memes que celles indiquées dans l'aide ou bien dans tous les tutoriaux qu'on a trouvé. De plus notre MSCOMM32.ocx est bien le meme que celui utilisé dans les tutoriaux...
 
Exemple: pour configurer le numéro de port, normalement la fonction est:
NotrePort.CommPort(.....)  
 
alors que nous c'est  
NotrePort.SetCommPort(.......)
 
Donc nous n'avons aucune méthode qui correspond et c'est vraiment pas pratique. Si quelqu'un avait une idée du probleme, il faudrait soit trouver un tutorial avec nos méthodes ou bien trouver pourquoi est ce qu'on a pas les bonnes méthodes.
 :heink:  

Reply

Marsh Posté le 03-06-2003 à 13:35:09    

En 16 bits, je fais comme suit (suis amateur donc pas "optimisé" ) mais je sais combien de caractères je dois recevoir (d'un Keithley). Sait pas si ça peut aider.
 
int RecoitCaract(int idComDev, int NbTour, char *BuffRecu)
{
// Reçoit NbTour caractères un par un et les place dans la chaîne
//
    int   PosCaract, Dumy;
    char  Bid[2];
 
    PosCaract = 0;
    for (int kT = 0; kT < NbTour; kT ++) // réception de "Nombre" caractères un par un
    {
      do  // Attente d'arrivée d'un caractère
      {
 Yield();
 Dumy = ReadComm(idComDev, Bid, 1);
 if (Dumy < 0)
 { // Y a erreur d'accès port
          return 2;
        }
      } while (Dumy < 1);
      BuffRecu[PosCaract] = Bid[0];
      PosCaract ++;
    }
    return 0;
}
// fin du module RecoitCaract
 
idComDev vient de OpenComm("COM2:", 1024, 128);
 
En 32 bits, on doit pouvoir faire autrement (et mieux).
 
Ai pas encore essayé timer pour voir si on n'a toujours rien reçu au bout d'un certain temps (pr sortir du module) !


Message édité par Carbon_14 le 03-06-2003 à 13:37:13
Reply

Marsh Posté le 03-06-2003 à 14:43:47    

Merci mais justement je cherche à y faire en 32 bits. Sinon j'ai essayer avec ce fameux controle activX, mais j'ai un probleme:
la fonction GetInput retourne un VARIANT et je voudrais comparer cette valeur avec un caractére; or sa ne marche pas. J'ai une erreur qui m'indique que la convertion d'un VARIANT en char n'est pas possible.
Donc comment puis je comparer ce variant avec un char??
 
merci :(

Reply

Marsh Posté le 03-06-2003 à 15:17:15    

Aucune idée (variant, j'ai entre apreçu ça en VB3 mais toujours fui).
ActiveX, juste de nom (les soirées sont trop courtes pour écrire du code (C) et suivre les "nouveautés", voire essayer de se mettre au C++ (bof :ouch:)).
 
Le ReadFile()
              //Cette fonction permet la lecture du buffer d'entrée du port série  
     while(ReadFile(hPort,      //Instance sur l'accès du port série  
      &Byte,               //Conteneur pour récupérer le byte lu  
     1,                   //Nombre de byte à lire  
     &dwBytesTransferred, //Pointer sur le nombre de byte lu, sert à  
                        //la gestion propre de la fonction read.  
     0)!=0)                 //Doit être NULL pour Windows CE  
     {tab[i]=Byte;  
     i++;}
 
il ne peut pas servir tout seul ? En testant son état.  
Ca bloque un peu en attente de caractère issu de COMx:, mais ça évite la fonction "immobile" qui ne répond jamais.
 [:yoyoz]

Reply

Marsh Posté le 03-06-2003 à 16:47:55    

Pour le controle ActiveX je te donnerais un code enfin morceau ce soir desole la pas le temps de chercher.
 
Mais sinon pour le variant y a le champ de l'union tonvar.pbstrVal qui devrait contenir le char recu (ou les char) si reelement c ce champ qui est rempli ds le variant.

Reply

Marsh Posté le 03-06-2003 à 17:04:17    

c'est une bonne idée mais le resultat de tonvar.pbstrVal  est un unsigned short **   :cry:  :cry: donc j'ai toujours un peu de mal à pouvoir le comparer...
 
merci de m'aider :cry:

Reply

Marsh Posté le 03-06-2003 à 17:04:17   

Reply

Marsh Posté le 03-06-2003 à 19:55:03    

Re alors pour le ComCtrl ca donne ceci (desole un peu long)
 
la class genere via le ocx version j'sais pas trop mais version normalement (dispo sous 2K)

Code :
  1. #define MAX_NUM_PORT 4
  2. #define ID_BASE_COMMCTRL 2001    // le ID de base des message recu
  3. class CCommCtrl : public CWnd
  4. {
  5. protected:
  6. DECLARE_DYNCREATE(CCommCtrl)
  7. public:
  8. CLSID const& GetClsid()
  9. {
  10.  static CLSID const clsid
  11.   = { 0x648a5600, 0x2c6e, 0x101b, { 0x82, 0xb6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14 } };
  12.  return clsid;
  13. }
  14. virtual BOOL Create(LPCTSTR lpszClassName,
  15.  LPCTSTR lpszWindowName, DWORD dwStyle,
  16.  const RECT& rect,
  17.  CWnd* pParentWnd, UINT nID,
  18.  CCreateContext* pContext = NULL)
  19. { return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID); }
  20. BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle,
  21.  const RECT& rect, CWnd* pParentWnd, UINT nID,
  22.  CFile* pPersist = NULL, BOOL bStorage = FALSE,
  23.  BSTR bstrLicKey = NULL)
  24. { return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID,
  25.  pPersist, bStorage, bstrLicKey); }
  26. // Attributes
  27. public:
  28. BOOL GetCDHolding();
  29. void SetCDHolding(BOOL);
  30. long GetCDTimeout();
  31. void SetCDTimeout(long);
  32. short GetCommID();
  33. void SetCommID(short);
  34. short GetCommPort();
  35. void SetCommPort(short);
  36. BOOL GetCTSHolding();
  37. void SetCTSHolding(BOOL);
  38. long GetCTSTimeout();
  39. void SetCTSTimeout(long);
  40. BOOL GetDSRHolding();
  41. void SetDSRHolding(BOOL);
  42. long GetDSRTimeout();
  43. void SetDSRTimeout(long);
  44. BOOL GetDTREnable();
  45. void SetDTREnable(BOOL);
  46. long GetHandshaking();
  47. void SetHandshaking(long);
  48. short GetInBufferSize();
  49. void SetInBufferSize(short);
  50. short GetInBufferCount();
  51. void SetInBufferCount(short);
  52. BOOL GetBreak();
  53. void SetBreak(BOOL);
  54. short GetInputLen();
  55. void SetInputLen(short);
  56. long GetInterval();
  57. void SetInterval(long);
  58. BOOL GetNullDiscard();
  59. void SetNullDiscard(BOOL);
  60. short GetOutBufferSize();
  61. void SetOutBufferSize(short);
  62. short GetOutBufferCount();
  63. void SetOutBufferCount(short);
  64. CString GetParityReplace();
  65. void SetParityReplace(LPCTSTR);
  66. BOOL GetPortOpen();
  67. void SetPortOpen(BOOL);
  68. short GetRThreshold();
  69. void SetRThreshold(short);
  70. BOOL GetRTSEnable();
  71. void SetRTSEnable(BOOL);
  72. CString GetSettings();
  73. void SetSettings(LPCTSTR);
  74. short GetSThreshold();
  75. void SetSThreshold(short);
  76. VARIANT GetOutput();
  77. void SetOutput(const VARIANT& );
  78. CString GetInput();
  79. void SetInput(LPCTSTR);
  80. short GetCommEvent();
  81. void SetCommEvent(short);
  82. private:
  83. // Operations
  84. public:
  85. void AboutBox();
  86. };


je passe le cpp genere.
 
 
Sinon apres pour l'utiliser (important le CWnd en base et le EVENTSINK), la ca marche pour 4 port COM.

Code :
  1. class CSerialCom : public CWnd
  2. {
  3. DECLARE_DYNCREATE(CSerialCom)
  4. public:
  5. CSerialCom();
  6. virtual ~CSerialCom();
  7. // Retourne le nombre de port COM dispo
  8. int m_fniNumberOfPort();
  9. // Fonction pour ajouter/modifier/fermer un port
  10. BOOL   m_fnbAddComm(int);
  11. BOOL   m_fnbModifyPort(int, int&, int&, int&, char*);
  12. void   m_fnvCloseCom(int);
  13. protected:
  14. void   m_fnvCommEvent(int);
  15. void   DoEvents();
  16. private:
  17. CCommCtrl   CommCtrl;  // L'objet CComCtrl
  18. public:
  19. // Overrides
  20. // ClassWizard generated virtual function overrides
  21. //{{AFX_VIRTUAL(CSerialCom)
  22. //}}AFX_VIRTUAL
  23. // Implementation
  24. protected:
  25. // Generated message map functions
  26. //{{AFX_MSG(CSerialCom)
  27. afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
  28. //}}AFX_MSG
  29. afx_msg void OnCommEvent0();
  30. afx_msg void OnCommEvent1();
  31. afx_msg void OnCommEvent2();
  32. afx_msg void OnCommEvent3();
  33. DECLARE_EVENTSINK_MAP()
  34. DECLARE_MESSAGE_MAP()
  35. };


 

Code :
  1. IMPLEMENT_DYNCREATE(CSerialCom, CWnd)
  2. BEGIN_MESSAGE_MAP(CSerialCom, CWnd)
  3. //{{AFX_MSG_MAP(CSerialCom)
  4. ON_WM_CREATE()
  5. //}}AFX_MSG_MAP
  6. END_MESSAGE_MAP()
  7. BEGIN_EVENTSINK_MAP(CSerialCom, CWnd)
  8. ON_EVENT(CSerialCom, ID_BASE_COMMCTRL + 0, 1, OnCommEvent0, VTS_NONE)
  9. ON_EVENT(CSerialCom, ID_BASE_COMMCTRL + 1, 1, OnCommEvent1, VTS_NONE)
  10. ON_EVENT(CSerialCom, ID_BASE_COMMCTRL + 2, 1, OnCommEvent2, VTS_NONE)
  11. ON_EVENT(CSerialCom, ID_BASE_COMMCTRL + 3, 1, OnCommEvent3, VTS_NONE)
  12. END_EVENTSINK_MAP()
  13. CSerialCom::CSerialCom()
  14. {
  15. }
  16. CSerialCom::~CSerialCom()
  17. {
  18. }
  19. void CSerialCom::DoEvents()
  20. {
  21. MSG msg;
  22. while (::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
  23. {
  24.  if (!AfxGetThread()->PumpMessage())
  25.   return;
  26. }
  27. }
  28. int CSerialCom::OnCreate(LPCREATESTRUCT lpCreateStruct)
  29. {
  30. if (CWnd::OnCreate(lpCreateStruct) == -1)
  31.  return -1;
  32. return 0;
  33. }
  34. int CSerialCom::m_fniNumberOfPort(CUIntArray* List)
  35. {
  36. int uiNum = 0;
  37. WCHAR pwchLicenseKey[] =
  38. {
  39.  0x0043, 0x006F, 0x0070, 0x0079, 0x0072, 0x0069,
  40.  0x0067, 0x0068, 0x0074, 0x0020, 0x0028, 0x0063,
  41.  0x0029, 0x0020, 0x0031, 0x0039, 0x0039, 0x0034,
  42.  0x0020
  43. };
  44. BSTR bstrLicense = ::SysAllocStringLen(pwchLicenseKey, sizeof(pwchLicenseKey)/sizeof(WCHAR));
  45. for (int i=0; i<MAX_NUM_PORT; i++)
  46. {
  47.  CComCtrl strCurrent;
  48.  // Create the MSCOMM32 OLE Control.
  49.  if (!strCurrent.Create(NULL,0,CRect(0,0,0,0),this,ID_BASE_COMMCTRL + i, NULL, FALSE, bstrLicense))
  50.  {
  51.   TRACE0("Failed to create OLE Communications Control\n" );
  52.   AfxMessageBox("Unable to create MSCOMM32 control" );
  53.   ::SysFreeString(bstrLicense);
  54.   return 0;      // fail to create
  55.  }
  56.  strCurrent.SetCommPort(i+1);
  57.  TRY
  58.  {
  59.   strCurrent.SetPortOpen(TRUE);
  60.   strCurrent.SetPortOpen(FALSE);
  61.   uiNum++;
  62.  }
  63.  CATCH_ALL(e)
  64.  {
  65.  }
  66.  END_CATCH_ALL
  67. }
  68. ::SysFreeString(bstrLicense);
  69. return uiNum;
  70. }
  71. BOOL CSerialCom::m_fnbAddComm(int iID)
  72. {
  73. if ((iID < 0) || (iID > MAX_NUM_PORT))
  74.  return FALSE;
  75. WCHAR pwchLicenseKey[] =
  76. {
  77.  0x0043, 0x006F, 0x0070, 0x0079, 0x0072, 0x0069,
  78.  0x0067, 0x0068, 0x0074, 0x0020, 0x0028, 0x0063,
  79.  0x0029, 0x0020, 0x0031, 0x0039, 0x0039, 0x0034,
  80.  0x0020
  81. };
  82. CCommCtrl* pCom = new CCommCtrl;
  83. BSTR bstrLicense = ::SysAllocStringLen(pwchLicenseKey, sizeof(pwchLicenseKey)/sizeof(WCHAR));
  84. // Create the MSCOMM32 OLE Control.
  85. if (!pComCreate(NULL,WS_VISIBLE,CRect(0,0,0,0),this,ID_BASE_COMMCTRL + iID, NULL, FALSE, bstrLicense))
  86. {
  87.  AfxMessageBox("Unable to create MSCOMM32 control" );
  88.  return FALSE;      // fail to create
  89. }
  90. ::SysFreeString(bstrLicense);
  91. pCom->SetInBufferSize(16*1024);
  92. pCom->SetRThreshold(1);
  93. CString str;
  94. str.Format("%d,N,%d,%d", 9600,8,1);
  95. pCom->SetSettings(str);
  96. pCom->SetCommPort(iID+1);
  97. TRY
  98. {
  99.  pCom->SetPortOpen(TRUE);
  100.  return TRUE;
  101. }
  102. CATCH_ALL(e)
  103. {
  104.  delete pCom;
  105.  return FALSE;
  106. }
  107. END_CATCH_ALL
  108. return FALSE;
  109. // A TOI DE DELETE OU IL FAUT LE pCom la c pas fait
  110. }
  111. BOOL CSerialCom::m_fnbModifyPort(int iID, int& speed, int& bit, int& stop, char* parity)
  112. {
  113. if ((iID < 0) || (iID > MAX_NUM_PORT))
  114.  return FALSE;
  115. CCommCtrl* pCom = XXXX;  // Tu le recupes de qqpart suivant ton architecture
  116. if (pCom != NULL) {
  117.  CString str;
  118.  str.Format("%d,%c,%d,%d", speed, *parity, bit, stop);
  119.  pCom->CommCtrl.SetPortOpen(FALSE);
  120.  pCom->CommCtrl.SetSettings(str);
  121.  pCom->CommCtrl.SetPortOpen(TRUE);
  122.  return TRUE;
  123. }
  124. return FALSE;
  125. }
  126. void CSerialCom::m_fnvCloseCom(int iID)
  127. {
  128. if ((iID < 0) || (iID > MAX_NUM_PORT))
  129.  return;
  130. CCommCtrl* pCom = XXXX;  // Tu le recupes de qqpart suivant ton architecture
  131. if (pCom != NULL) {
  132.  pCom->CommCtrl.SetPortOpen(FALSE);
  133.  delete pCom;
  134. }
  135. }
  136. /////////////////////////////////////////////////////////////////////////////
  137. // Evenements Comm
  138. /////////////////////////////////////////////////////////////////////////////
  139. void CSerialCom::OnCommEvent0()
  140. {
  141. m_fnvCommEvent(0);
  142. }
  143. void CSerialCom::OnCommEvent1()
  144. {
  145. m_fnvCommEvent(1);
  146. }
  147. void CSerialCom::OnCommEvent2()
  148. {
  149. m_fnvCommEvent(2);
  150. }
  151. void CSerialCom::OnCommEvent3()
  152. {
  153. m_fnvCommEvent(3);
  154. }
  155. void CSerialCom::m_fnvCommEvent(int iID)
  156. {
  157. CCommCtrl* pCom = XXXX; // Tu le recupes de qqpart suivant ton architecture
  158.       // En verifiant que l'ID est bien le bon
  159. if (pCom != NULL) {
  160.  CString csTmp = pCom->GetInput();
  161.  // csTmp c les nouvelles donnees dispo pour le port
  162.  // tu en fais ce que tu veux
  163. }
  164. }


 
 
Voila j'espere que ca t aidera.


Message édité par VisualC++ le 03-06-2003 à 19:56:43
Reply

Marsh Posté le 05-06-2003 à 10:20:45    

Merci mais on a toujours un probleme...A  la fin de ton code tu copies le resultat de ton pCom->GetInput() dans une CString;or d'après ce que je sais le GetInput() renvoie un VARIANT ou un tagVARIANT me semble-t-il.Le compilateur nous dit qu'il ne peut pas faire la conversion:
 
 
D:\microZ\microZDlg.cpp(1724) : error C2679: binary '=' : no operator defined which takes a right-hand operand of type 'struct tagVARIANT' (or there is no acceptable conversion)
 
 
Y a-t-il un moyen de copier ce resultat dans une CString ou est ce que c'est un bug du compilateur ou autre.

Reply

Marsh Posté le 05-06-2003 à 11:32:26    

Ben moi la definition de la methode GetInput() genere a partir de la version 6.0.188 du composant renvoie bien une CString.
 
Quelle version du composant pour toi ?

Reply

Marsh Posté le 05-06-2003 à 11:41:32    

c'est dans quel *.ocx???c'est bien dans MSComm32.ocx??
nous la version qu'on a c'est 6.00.8169...
 
Nous quand on insere cet ocx ,ça nous génère une class CMSComm
mais elle comporte les memes elements(je crois) que ta classe CCommCtrl .
 
au pire tu pourrait nous envoyer ton ocx à ares_le_grand@caramail.com??

Reply

Marsh Posté le 05-06-2003 à 12:00:30    

Oui c bien mscomm32.ocx, euh moi de memoire c 6.0.1xxx me semble (et avant je faisait avex le 5.x ... enfin je dit avant mais j ai fait ca y a 4 ans)
 
CMSComm ou pareil c le nom par defaut si je me souvient bien.
 
Ce soir oui je peux t envoyer ca np, la poste XP et j ai pas le mm controle.

Reply

Marsh Posté le 05-06-2003 à 14:49:54    

bon pour ça je pense qu'on a reussi a se debrouiller .
pour information on peut convertir un variant encstring en fesant:
#include <comutil.h>
VARIANT var;
CString str = (char *)(_bstr_t) _variant_t(var)
 
mais bon la ona de nouvelles erreurs sur lesquel on se penche en ce moment...on aura peut-etre besoin d'aide plus tard :)  
 

Reply

Marsh Posté le 05-06-2003 à 15:02:23    

Euh pour la conversion y a je crois une focntion qui fait ca (mais jsais plus ou ds les utils)
 
Np si on peut t aider


Message édité par VisualC++ le 05-06-2003 à 15:02:37
Reply

Marsh Posté le 05-06-2003 à 15:14:18    

bon,ça  a  pas mis beaucoup  de temps avant qu'on se retrouve bien planté...
 
dans ma classe je déclare :

Code :
  1. CMSComm *comm1;


 
puis je faitça dans mon cpp:

Code :
  1. comm1 = new CMSComm;


 et mon programme plante ensuite sur :

Code :
  1. comm1->SetCommPort(1);


 
cela ne nous étonne que peu étant donné qu'au debugage on voit que le new renvoie NULL...
de plus quand on tape "comm1->" sous Visual C++6 cela devré nous afficher la liste des méthodes...or i nous affiche RIEN...
 :cry:  
est ce qu'on est maudit?? :pt1cable: est ce que quelqu'un a une illumination???merci d'avance...

Reply

Marsh Posté le 05-06-2003 à 16:19:29    

Manque un create quand mm avant toute methode. Comem dit le CommCtrl est dervie d'un CWnd (gravce auquel il peut balancer les evenement entre autre) donc faut faire un create comem indique ds les bouts de code.
 
Essaye ce code ds une classe derivee de CWnd (et avec le DYNCREATE ) et avec comme indique le DECLARE_EVENTSINK_MAP()

Code :
  1. WCHAR pwchLicenseKey[] =
  2. {
  3. 0x0043, 0x006F, 0x0070, 0x0079, 0x0072, 0x0069, 
  4. 0x0067, 0x0068, 0x0074, 0x0020, 0x0028, 0x0063, 
  5. 0x0029, 0x0020, 0x0031, 0x0039, 0x0039, 0x0034, 
  6. 0x0020
  7. };
  8. BSTR bstrLicense = ::SysAllocStringLen(pwchLicenseKey, sizeof(pwchLicenseKey)/sizeof(WCHAR));
  9. CMSComm comm1;
  10. if (!comm1.Create(NULL,0,CRect(0,0,0,0),this,ID_BASE_COMMCTRL + i, NULL, FALSE, bstrLicense))
  11. {
  12.   TRACE0("Failed to create OLE Communications Control\n" );
  13.   AfxMessageBox("Unable to create MSCOMM32 control" );
  14.   ::SysFreeString(bstrLicense);
  15.   return 0;      // fail to create  
  16. }
  17. comm1.SetCommPort(i+1);
  18. TRY {
  19.   comm1.SetPortOpen(TRUE);
  20.   comm1.SetPortOpen(FALSE);
  21. }
  22. CATCH_ALL( e ) {
  23. }
  24. ::SysFreeString(bstrLicense);


 
 
Maintenant juste comem ca sans un bout de code plus consequent dur de dure pkoi.


Message édité par VisualC++ le 05-06-2003 à 16:20:06
Reply

Marsh Posté le 05-06-2003 à 16:40:11    

à priori sa fonctionne :) ...bon....maintenant on passe à l'ecriture sur le port...sa devrait mieux aller maintenant... :lol:  :wahoo:  :wahoo:

Reply

Sujets relatifs:

Leave a Replay

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