Envoyer un caractère de controle en C vers un port série

Kurpeus1 Messages postés 42 Date d'inscription lundi 16 octobre 2006 Statut Membre Dernière intervention 21 mars 2007 - 25 oct. 2006 à 18:45
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 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
 //----------------------------------------------------------------------------

merci d'avance

5 réponses

yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
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))
 
// crée l'event d'écriture
OVERLAPPED osWrite = {0};
osWrite.hEvent = CreateEvent(/*voir params*/);
// Ecrit
WriteFile(hComm, /*voir params*/)
// Attend
dwRes = WaitForSingleObject(osWrite.hEvent, INFINITE);
if( dwRes == WAIT_OBJECT_0 )
 // succes
// Libere event
CloseHandle(osWrite.hEvent);
0
Kurpeus1 Messages postés 42 Date d'inscription lundi 16 octobre 2006 Statut Membre Dernière intervention 21 mars 2007
26 oct. 2006 à 10:09
merci d'avoir répondu yann.

Je ne connais pas spécialement le principe d'une communication série sur l'aspect programmation. J'utilise un code source que j'ai trouvé sur ce site. Il s'agit de  celui de gplog  http://www.cppfrance.com/codes/FONCTION-GESTION-PORT-SERIE-OUVERTURE-EMISSION-RECEPTION_11115.aspx

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

 char msgRead = 15;
 msgCom = EmissionCom(msgRead, sizeof(msgRead));

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)

[00:460] - Written data

0f .

[00:981] - Written data

0f .

[01:301] - Written data

0f .

[01:412] - Read data

0f .

[01:632] - Written data

07 36 51 52 45 41 44 0d .6QREAD.

[02:283] - Read data

4e 41 4b 0d NAK.

[02:283] - Written data

52 45 41 44 0d READ.

[02:293] - Read data

41 43 4b 0d 00 38 37 31 35 39 34 36 32 39 36 39 ACK..87159462969
31 33 2c 31 13 03 0d 13,1...

[02:293] - Written data

41 43 4b 0d ACK.

[02:303] - Read data

01 38 37 31 35 39 34 36 32 39 36 39 31 33 2c 32 .8715946296913,2
15 03 0d ...

[02:303] - Written data

41 43 4b 0d ACK.

[02:303] - Read data

4f 56 45 52 0d 4f 56 45 52 0d OVER.OVER.

[02:413] - Close port
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Derniè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

msgCom = EmissionCom(msgRead, 1);

Shell
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Derniè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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
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().
0
Rejoignez-nous