lambrosx
Messages postés21Date d'inscriptionjeudi 17 juin 2004StatutMembreDernière intervention 9 février 2006
-
20 juil. 2004 à 12:35
loudesbois
Messages postés1Date d'inscriptionjeudi 25 septembre 2003StatutMembreDernière intervention 9 juin 2005
-
9 juin 2005 à 15:29
Bonjour, j'ai un soucis plutot embetant. J'ai un programme de communication série, dont j'ai trouvé des codes sources sur ce site. Je l'ai modifié, et il me permet de communiquer avec une petite balance. Celle ci m'envoie une trame de donnée contenant l'information du poids qu elle a pesé.
Je découpe cette trame et je vais ecrire le poids recu dans un fichier texte. Donc mon programme fonctionne à merveille, sauf que quand je redémarre mon pc, et que je lance mon programme je n'arrive plus a communiquer avec ma balance comme si la trame ne passait pas ou mal. Il faut d'abord que je lance l hyperterminal pour que mon programme refonctionne normalement.
Alors il faut bien comprendre que c'est pas génial, si à chaque fois que mon pc redémarre je suis obligé de relancer l hyperterminal pour pouvoir me servir de mon programme.
Donc je ne sais, quesque fais de plus l'hyperterminal par rapport a mon programme? Est ce que l'hyperterminal débloque qqqchose, ou reset une mémoire . Je ne sais pas.
Je vous joins mon code.
Merci
// FICHIERS D'INCLUSION
//------------------------------------------------------------------------------
#include <windows.h>
#include <winbase.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <fstream>
#include
using namespace std;//permet d'utiliser cin et cout avec iostream.(Remplace iostream.h sous C++ 6.0)
// CONSTANTES
//-------------------------------------------------------------------------------
// Définition du code d'erreurs
typedef enum
{
e_ErrCom_None, // Pas d'erreur
e_ErrCom_Creation, // Erreur lors de la création du flux
e_ErrCom_Utilise, // Le port com est déjà utilisé
e_ErrCom_Inexistant, // Le port com n'existe pas
e_ErrCom_Timeout, // Timeout lors d'une émission-réception
e_ErrCom_Emission, // Erreur lors de l'émission
e_ErrCom_Reception, // Erreur lors de la réception
e_ErrCom_Definition_Trame, // Erreur de définition de la trame
e_ErrCom_Nack, // Demande non prise en coompte #include ""
e_ErrCom_Checksum // Erreur de checksum
} e_ErrCom;
// Nom du port série
#define PORT1 "COM1"
#define PORT2 "COM2"
// Définition des vitesses de communication
#define V1200 1200
#define V2400 2400
#define V4800 4800
#define V9600 9600
// Définition du nombre de bits
#define BITS_7 7
#define BITS_8 8
// Définition du nombre de bits de stop
#define BIT_DE_STOP_1 1
#define BIT_DE_STOP_2 2
// Définition de la parité
#define PAS_DE_PARITE 'N'
#define PARITE_IMPAIRE 'O'
#define PARITE_PAIRE 'E'
// Codes de retour génériques
#define OK 1
#define KO 0
// Longueur max réservée pour une trame
#define LG_TRAME 100
// PROTOTYPES
//----------------------------------------------------------------------------
e_ErrCom OuvreCom(char *strPort,long BaudRate,int BitsSize,int Parity,int StopBits);
e_ErrCom EmissionCom(const void *lpBuf, unsigned int nCount);
e_ErrCom ReceptionCom(void *lpBuf, unsigned int nCountMax, unsigned int *pCountRead);
void FermeCom();
// VARIABLES GLOBALES
//-----------------------------------------------------------------------------
DCB g_DCB; // structure dcb du port
e_ErrCom g_ErrCom= e_ErrCom_None; // Variable des erreurs de com
HANDLE g_hCom = 0; // handle de la com
HWND hyper_term; // handle de la com
char *trameRecue [10];
char trame_essai[50];
//Nombre de caracteres maxi a lire
unsigned int NbMaxCar=100;
//pointeur sur le nombre de caractère recu
unsigned int NbCarRecus;
void main (void)
{
cout<<"Programme qui travaille avec le port COM1"<<endl<<endl;
int key=0,i=0, t=0;
char a;
bool trame_erreur=false;
ofstream fs; //Déclaration de la variable qui permet l'écriture dans un fichier
ifstream fs_config;
fs_config.open(chaine_fichier_config);
if(!fs_config.is_open())
{
cout << chaine_fichier_config << endl << "Le fichier de config n'a pas pu etre ouvert." << endl;
}
else
{
cout << "Fichier de config ouvert." << endl<<endl;
}
fs_config.getline(chaine, 40);
fs_config.close();
cout << chaine << endl;
//Test d'ouverture du fichier qui contient l'information du poids
fs.open(chaine);
if(!fs.is_open())
{
cout << "Le fichier n'a pas pu etre ouvert." << endl;
}
else
{
cout <<"Fichier ouvert, vous pouvez utiliser le systeme de pesee." << endl<<endl;
fs.close();
}
/* Nous sommes maintenant dans la boucle principale
qui permet de recevoir des événements */
do
{
i=0;
trame_erreur=false;
/*Configuration du port serie :
PORT2,V9600,BITS_8,PARITE_PAIRE,BIT_DE_STOP_1*/
FreeYo
Messages postés31Date d'inscriptionjeudi 31 juillet 2003StatutMembreDernière intervention 7 octobre 2004 20 juil. 2004 à 18:17
8-) FreeYo
Et oui, le port série n'est pas très robuste !
Je pense connaitre l'origine de ton problème. En fait c'est une histoire de configuration.
HyperTerminal doit te la remettre d'équerre ! C'est pourquoi ton prog fonctionne après.
J'ai pas vu dans ton source :
SetupComm
SetCommTimeouts
FillMemory( &dcb, sizeof(dcb),0);
Tu peux essayer celle-ci aussi
BuildCommDCB( TEXT("9600,8,n,1"), &dcb);
Attention aussi au système. J'ai souvenir d'énormes soucis en Win98 !!!
lambrosx
Messages postés21Date d'inscriptionjeudi 17 juin 2004StatutMembreDernière intervention 9 février 2006 21 juil. 2004 à 17:13
Bon, aux dernieres nouvelles, je viens de me rendre compte qu avant de lancer l hyperterminal, si je lance mon programme, le nombre retourné de caractere a lire soit nCarAlire est de 1 ce qui n est pas correct. Ce nombre est definit par stat.cbInQue qui est lui meme issu de la fonction clearCommError.
Apres lancement du terminal le nombre normal de caractere que je recois pr ma trame n est plus 1 mais 23. On pourrait donc supposer qu il y a un pb a ce niveau. Or les seuls parametres que prend clearcommerror sont 2 sorties et une entree qui est le HANDLE de la communication elle meme issu de la fonction createfile.
Dc il se pourrait que mon createfile ne soit pas correcte, ce qui n est pas si evident puisque avant d utiliser l hyperterminal et apres, il est le meme.
Dou vient cette variable cbInQue? A quoi correspond elle vraiment?
lambrosx
Messages postés21Date d'inscriptionjeudi 17 juin 2004StatutMembreDernière intervention 9 février 2006 22 juil. 2004 à 12:07
Voici mes dernieres modifications et ca marche enfin! Si ca pe servir a certain, vu que l erreur a été rencontrée plusieurs fois, il est important de tout bien initialiser et dans l ordre.
createfile
getcommstat
modification du DCB
setcommstat.
// On ouvre le port série
g_hCom = CreateFile(strPort,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING,NULL);
ClearCommBreak(g_hCom);