Communication Série RS232 - Pb d'affichage de caractères

Signaler
Messages postés
5
Date d'inscription
mercredi 7 novembre 2007
Statut
Membre
Dernière intervention
31 janvier 2008
-
Messages postés
5
Date d'inscription
mercredi 7 novembre 2007
Statut
Membre
Dernière intervention
31 janvier 2008
-
Bonjour,

Je suis débutant en C. J'ai besoin de transmettre des données sur le port COM d'un PC, à destination d'un variateur. Le but est d'envoyer une chaîne de caractères.
Le programme (que j'ai récupéré et modifié) n'envoyait à l'origine qu'un seul caractère. Je l'ai modifié pour en envoyer plusieurs, mais je me retrouve avec un problème d'affichage.
Quelqu'un pourrait il m'aider ?

D'avance merci.

3 réponses

Messages postés
5
Date d'inscription
mercredi 7 novembre 2007
Statut
Membre
Dernière intervention
31 janvier 2008

Ci dessous le progarmme :

/*--------------------------------------------------------------------------*/
/* Travaux Pratiques  : Communication entre PC et un port série             */
/*--------------------------------------------------------------------------*/
/* Nom du programme : serie.cpp                                             */
/* Auteur :           D.PAYON                                               */
/* Date de création : 15/09/2005                                            */
/* Version :            2.1                                                 */
/* Modifications : -> La programmation du 8250 par les API de Windows       */
/*--------------------------------------------------------------------------*/
#include   // pour CIN & COUT
#include   // pour le format de ces flux
#include <windows.h>  // pour utiliser les API32
#include <stdio.h>   // pour exploiter les Entrées/Sorties standards
#include <conio.h>   // pour exploiter les Entrées/Sorties standards


#define aaxan 0x85 //Symbole du "à" en code page 437
#define aigu 0x82 //Symbole du "é" en code page 437
#define grave 0x8A //Symbole du "è" en code page 437
#define cdie 0x87 //Symbole du "ç" en code page 437


//********************************************************************
// INITIALISATION DU PORT
//********************************************************************
void Initialiser(HANDLE hCom,BYTE NbDonnees,BYTE NbStops,BYTE Parite, DWORD Vitesse)
{


 BOOL retour;
 DCB dcb; //Une structure "Device-Control Block" definit l'initialisation
    // d'un périphérique de communications.
 retour = GetCommState(hCom,&dcb);  // Lecture des paramétres physiques.
 if (retour == 0) return;    // Si rien, alors pas de  périphérique.
 else         // Si présence port, alors définir :
 {
  dcb.ByteSize=NbDonnees;    // -Nombre de bits de Données
  dcb.StopBits=NbStops;    // -Nombre de bit(s) de Stop
  dcb.Parity=Parite;     // -Type de parité
  dcb.BaudRate=Vitesse;    // -Vitesse de transfert des données
  retour = SetCommState(hCom,&dcb); // Ecriture de ces paramètres.
 }
}


//********************************************************************
// Test des API32 de gestion du port série
//********************************************************************
void main(void)
{
// int touche;
 int NbDonnees=8;
 int Vitesse=9600;
 unsigned char Parite;
 char NomPort[4+1];
 int NoPort  ;
 BOOL retour;
 COMSTAT EtatCom;
 DWORD CodeErreur , NbOctetsEcrits , NbOctetsALire, NbOctetsLus, i ;
 char octet;
 BYTE Nbstop=1;
 BYTE BufferOut[10]={1,5,9,11,18,14,55,127,19,24};
 BYTE *BufferIn;
 HANDLE hCom;  // le port est référencé avec un identifiant de type HANDLE


 printf("\nEntrer le numero du port serie (par exemple 1 pour COM1) ",aigu,aigu);
 scanf("%d",&NoPort);




 //----------- Ouverture du port ------------------


 sprintf(NomPort,"COM%d",NoPort);
 hCom=CreateFile(NomPort,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING ,0,NULL);
 if (hCom == INVALID_HANDLE_VALUE) return;




 //------------Config du port----------------------


 cout<<"\n\t\t\t\t CONFIG DU PORT "<<endl<<flush;




 //-------------- Initialisation -----------------------------


 Initialiser(hCom,NbDonnees,Nbstop,Parite,Vitesse);


 cout<<endl<<"La configuration du port est : ";
 cout<<"\t- "<<Vitesse<<" bauds"<<endl;
 cout<<"\t\t\t\t- "<<NbDonnees<<" bits de donnees"<<endl;
 printf("\t\t\t\t- %d",Nbstop);
 printf(" bit(s) de stop\n");




 // ------------ECRITURE D'UN CARACTÈRE SUR LE PORT------------
 
 fflush(stdin);
 cout<<endl<<"Entrer une chaine de caracteres a envoyer : "<<flush;
 scanf("%s",&octet);
 printf("\nAffichage de la valeur contenue dans octet : ");
 printf(&octet,"\n");
 printf("\nAppuyer sur une touche pour continuer\n");
 getch();


 
 //------- Lecture du nombre de caractères présents dans le buffer d'entrée -----
 
 retour=WriteFile(hCom,&octet,10,&NbOctetsEcrits,NULL);
 printf("\nValeur contenue dans NbOctetsEcrits :  ");
 printf("%i",NbOctetsEcrits);
 printf("\n");
 retour=ClearCommError(hCom,&CodeErreur,&EtatCom);
 printf("\nValeur de retour : si = 0, le prog fait un return -- Ici, retour = ");
 cout<<(retour)<<endl;
 printf("Appuyez sur une touche pour continuer");
 getch();
 if ( ! retour) return ;
  else NbOctetsALire = NbOctetsEcrits;
 
 printf("\n\nAffichage de la variable NbOctetsALire : ");
 cout<<(NbOctetsALire)<<endl;


 //--------- Lecture de tous les octets reçus et stockage dans le tableau BufferIn---
 
 BufferIn=new BYTE[NbOctetsALire];      // Allocation dynamique
 retour=ReadFile(hCom , BufferIn , NbOctetsALire , &NbOctetsLus , NULL);
    
 //--------- Affichage des octets reçus ---------
 
 printf("\nAffichage des octets recus : ");
 for (i=0;i<NbOctetsLus;i++)
  {
  printf("%c",BufferIn[i]);
  }
 printf("\n\n");
 delete [] BufferIn;     // libération mémoire
 CloseHandle(hCom);     // Fermeture du Handle hCom.
}
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
Salut
Regarde ta definition de octect  : char octet;
Tu ne peux mettre qu'UN seul caractere dans cette variable! Or tu essaies d'en mettre plusieurs...

Fait deja une declaration correcte: char octet[20];

Mon site internet : http://pistol.petesampras.free.fr
Messages postés
5
Date d'inscription
mercredi 7 novembre 2007
Statut
Membre
Dernière intervention
31 janvier 2008

Bonjour,

J'ai finalement réussi à commander le variateur avec une autre source.
Merci de votre aide.