communication par port com - C++ - Programmation
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
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 :
|
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
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.
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) !
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
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 )).
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.
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.
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 ** donc j'ai toujours un peu de mal à pouvoir le comparer...
merci de m'aider
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 :
|
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 :
|
Code :
|
Voila j'espere que ca t aidera.
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.
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 ?
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??
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.
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
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
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 :
|
puis je faitça dans mon cpp:
Code :
|
et mon programme plante ensuite sur :
Code :
|
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...
est ce qu'on est maudit?? est ce que quelqu'un a une illumination???merci d'avance...
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 :
|
Maintenant juste comem ca sans un bout de code plus consequent dur de dure pkoi.
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...
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:
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:
Par contre on a un probleme a la lecture sur le port. La fonction WaitCommEvent() attend et reste bloquée...
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