cs_arb
Messages postés40Date d'inscriptionlundi 18 février 2002StatutMembreDernière intervention 5 novembre 2012
-
27 sept. 2006 à 11:16
cs_arb
Messages postés40Date d'inscriptionlundi 18 février 2002StatutMembreDernière intervention 5 novembre 2012
-
29 sept. 2006 à 09:52
Bonjour
Je me suis insipiré du code de ymca2003 (Code source N°22441) pour faire un petit programme qui envoie le contenu d'un fichier via une liaison RS232 à une carte externe. J'ai la même appli qui tourne bien en Visual Basic, et j'ai un souci de vitesse maintenant. Avec le code de YMCA2003, tout va bien pour des vitesses allant jusqu'à 57600 par contre à 115200 ça ne marche plus. Quelqu'un aurait il une idée ou des pistes? j'utilise devcpp, je joins mon code. D'avance merci.
La lecture de mon fichier et l'envoi des trames est correct jusqu'à 57600. Un problème avec les constantes de timeout pour lecture ou ecriture?
merci de votre aide
#define RX_SIZE 4096 /* taille tampon d'entrée */
#define TX_SIZE 4096 /* taille tampon de sortie */
#define MAX_WAIT_READ 5000 /* temps max d'attente pour lecture (en ms) */
printf("\n");
// demande du numéro du port COM
printf("Entrez le numero du port COM : ");
scanf("%d", &nId);
// choix de la vitesse
printf("\n");
printf("Choisissez la vitesse 19200, 38400, 57600 en tapant 1, 2 ou 3 : "); scanf("%d", &vitesse);
//Gestion vitesse
switch (vitesse)
{
case 1:
g_dcb.BaudRate= 19200;
break;
case 2:
g_dcb.BaudRate= 38400;
break;
case 3:
g_dcb.BaudRate= 57600;
break;
default:
printf("\n");
printf("Choix de la vitesse impossible - Fin du programme\r\n");
printf("Taper sur n'importe quelle touche pour sortir.\r\n");
getch();
return -1;
}
// fichier à telecharger
printf("\n");
printf("Entrez le nom du fichier telecharger : ");
scanf("%s", &name);
//SendFile();
// OUverture du fichier pour être sûr de sa validité dès maintenant
fichier_ldr = fopen(name, "rb");
if (fichier_ldr == NULL)
{
printf("\n");
printf("Impossible d'ouvrir le fichier %s - Fin du programme.\r\n",name);
printf("Taper sur n'importe quelle touche pour sortir.\r\n");
getch();
return -1;
}
else
printf("Fichier %s ouvert avec succes.\r\n\n", name);
// tentative d'ouverture du port COM
printf("\n");
printf("Ouverture et configuration du port COM%d en cours ......\r\n", nId);
if(!OpenCOM(nId))
{
printf("Taper sur n'importe quelle touche pour sortir.\r\n");
getch();
return -1;
}
printf("...OK\r\n\n");
SendFile();
// fermeture du port COM et retour
CloseCOM();
// attendre l'appui d'une touche pour fermer l'appli
getch();
return 0;
}
/******************************************************************************
OpenCOM : ouverture et configuration du port COM.
entrée : nId : Id du port COM à ouvrir.
retour : vrai si l'opération a réussi, faux sinon.
******************************************************************************/
BOOL OpenCOM(int nId)
{
// variables locales
char szCOM[16];
// construction du nom du port, tentative d'ouverture
sprintf(szCOM, "COM%d", nId);
g_hCOM = CreateFile(szCOM, GENERIC_READ|GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, NULL);
if(g_hCOM == INVALID_HANDLE_VALUE)
{
printf("Erreur lors de l'ouverture du port COM%d - Fin du programme.\r\n", nId);
return FALSE;
}
// affectation taille des tampons d'émission et de réception
SetupComm(g_hCOM, RX_SIZE, TX_SIZE);
// configuration du port COM
if(!SetCommTimeouts(g_hCOM, &g_cto) || !SetCommState(g_hCOM, &g_dcb))
{
printf("Erreur lors de la configuration du port COM%d - Fin du programme.\r\n", nId);
CloseHandle(g_hCOM);
return FALSE;
}
// on vide les tampons d'émission et de réception, mise à 1 DTR
PurgeComm(g_hCOM, PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_RXABORT);
EscapeCommFunction(g_hCOM, SETDTR);
return TRUE;
}
/******************************************************************************
CloseCOM : fermeture du port COM.
retour : vrai si l'opération a réussi, faux sinon.
******************************************************************************/
BOOL CloseCOM()
{
// fermeture du port COM
CloseHandle(g_hCOM);
return TRUE;
}
/******************************************************************************
ReadCOM : lecture de données sur le port COM.
entrée : buffer : buffer où mettre les données lues.
: nBytesToRead : nombre max d'octets à lire.
: pBytesRead : variable qui va recevoir le nombre d'octets lus.
retour : vrai si l'opération a réussi, faux sinon.
-------------------------------------------------------------------------------
Remarques : - la constante MAX_WAIT_READ utilisée dans la structure
COMMTIMEOUTS permet de limiter le temps d'attente si aucun
caractères n'est présent dans le tampon d'entrée.
- la fonction peut donc retourner vrai sans avoir lu de données.
******************************************************************************/
BOOL ReadCOM(void* buffer, int nBytesToRead, int* pBytesRead)
{
return ReadFile(g_hCOM, buffer, nBytesToRead, (DWORD*)pBytesRead, NULL);
}
/******************************************************************************
WriteCOM : envoi de données sur le port COM.
entrée : buffer : buffer avec les données à envoyer.
: nBytesToWrite : nombre d'octets à envoyer.
: pBytesWritten : variable qui va recevoir le nombre d'octets
envoyés.
retour : vrai si l'opération a réussi, faux sinon.
******************************************************************************/
BOOL WriteCOM(void* buffer, int nBytesToWrite, int* pBytesWritten)
{
// écriture sur le port
return WriteFile(g_hCOM, buffer, nBytesToWrite, (DWORD*)pBytesWritten, NULL);
}
cs_arb
Messages postés40Date d'inscriptionlundi 18 février 2002StatutMembreDernière intervention 5 novembre 20124 29 sept. 2006 à 09:52
tu penses bien que j'ai déjà fais le tour et essayé un paquet de chose avant de poser la question, car je n'ai rien vu de problématique dans ma source !!!!