Envoyer un caractère de controle en C vers un port série
Kurpeus1
Messages postés42Date d'inscriptionlundi 16 octobre 2006StatutMembreDernière intervention21 mars 2007
-
25 oct. 2006 à 18:45
yann_lo_san
Messages postés1137Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention23 janvier 2016
-
26 oct. 2006 à 13:28
Bonjour,
Voila je ne suis pas un expert en C, mais j'y travaille ^^
Je suis en train de programmer un programme qui communique avec un terminal portable via le port RS232. Pour communiquer avec lui j'utilise un code trouvé sur ce forum qui me permet d'envoyer des trucs vers le port série. Mon problème est le suivant. Mon terminal ne me répond que si je lui dit bonjour, il est très poli mais c'est un peu agaçant ^^ Donc il faut que je lui envoie le caractère 0f en hexa soit 015 en decimal ou encore SI pour Shift In. Seul problème je sais pas comment lui envoyer ca.
la fonction pour envoyer des datas attend :
//----------------------------------------------------------------------------
// FONCTION : EmissionCom
//----------------------------------------------------------------------------
// DESCRIPTION :
// Emission d'octets sur la liaison série
//
//----------------------------------------------------------------------------
// PARAMETRES :
// -lpBuf Pointeur sur les octets a emettre
// -nCount Nombre d'octet a emettre
//
//----------------------------------------------------------------------------
// RETOUR :Code d'erreur
//----------------------------------------------------------------------------
yann_lo_san
Messages postés1137Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention23 janvier 201626 25 oct. 2006 à 23:18
J'ai utilisé une fois la communication serie, en gros les étapes sont celles-ci :
(Je précise pour les "je-sais-tout" de ce site que ce n'est pas LA façon de faire...)
Voir ReadComm and WriteComm en Win16
et CreateEvent(), ReadFile() et WriteFile() en Win32
Voir l'exemple MTTTY dans MSDN
Il faut absolument utiliser les threads
DCB dcb;
HANDLE hComm;
char *pcCommPort = "COM2";
CreateFile(hComm, /*ect...*/);
// Ex : pour parametrer le port
BuildCommDCB("9600,n,8,1", &dcb))
J'arrive bien a envoyer des données via le port RS232 mais mon problème est le suivant. Le terminal attend des caractères de controle avant d'envoyer un ACK. Le caractère qu'il attend est SI : Shift In (dec) 015 (hex) 0F (bin) 00001111. Je ne sais pas trop comment envoyer ce caaractère. Si je fais
le compilateur (dev-C++) me met un warning : [Warning] passing arg 1 of `EmissionCom' makes pointer from integer without a cast
Je remets ici ce qu'attend la fonction.
//----------------------------------------------------------------------------
// DESCRIPTION :
// Emission d'octets sur la liaison série
//
//----------------------------------------------------------------------------
// PARAMETRES :
// -lpBuf Pointeur sur les octets a emettre
// -nCount Nombre d'octet a emettre
pour info
voici une capture d'échange entre le terminal et un autre prog ( celui fournit par le constructeur)
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 26 oct. 2006 à 12:26
Essaye ca :
char msgRead[2]; // déclare ton tableau
msgRead[0] = 15; // affecte la valeur souhaité
msgRead[2] = '\0'; // termine ta chaine pour éviter les plantage
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 26 oct. 2006 à 12:28
Oups petite erreur de ma part... comme quoi la relecture ca sert....
Je m'etais trompé dans les indices du tableau.
Voici le bon code a essayer :
char msgRead[2]; // déclare ton tableau
msgRead[0] = 15; // affecte la valeur souhaité
msgRead[1] = '\0'; // termine ta chaine pour éviter les plantage
msgCom = EmissionCom(msgRead, 1);
Shell
Vous n’avez pas trouvé la réponse que vous recherchez ?
yann_lo_san
Messages postés1137Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention23 janvier 201626 26 oct. 2006 à 13:28
L"erreur que tu as vient du fait que tu passe un char alors que le param attent un pointeur (lpBuf), du coup il essaye de caster la valeur de ton char en un int (adresse).
Par contre tout dépend de comment la fonction que tu utilise gère ce param, peut etre reformate elle le buffer avec les caracteres de controle, donc se fier au code de la fonction EmissionCom().