begin process at 2012 02 11 22:35:00
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Général

 > 

Communication RS232 : Pb de vitesse


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Communication RS232 : Pb de vitesse

mercredi 27 septembre 2006 à 11:16:46 | Communication RS232 : Pb de vitesse

arb

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) */

// ---------------- INCLUDE SECTION -----------------------------
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>

// ----------------- VISIBILITY SECTION -------------------------
BOOL OpenCOM    (int nId);
BOOL CloseCOM   ();
BOOL ReadCOM    (void* buffer, int nBytesToRead, int* pBytesRead);
BOOL WriteCOM   (void* buffer, int nBytesToWrite, int* pBytesWritten);
void SendFile   (void);

// ----------------- DATA SECTION -------------------------------
// Handle du port COM ouvert
HANDLE g_hCOM = NULL;

//Délais d'attente sur le port COM
COMMTIMEOUTS g_cto =
{
    MAX_WAIT_READ,  // ReadIntervalTimeOut        
    0,              // ReadTotalTimeOutMultiplier  
    MAX_WAIT_READ,  // ReadTotalTimeOutConstant    
    0,              // WriteTotalTimeOutMultiplier 
    0               // WriteTotalTimeOutConstant   
};

// Configuration du port COM
DCB g_dcb =
{
    sizeof(DCB),        // DCBlength
    0,                  // BaudRate
    TRUE,               // fBinary
    FALSE,              // fParity
    FALSE,              // fOutxCtsFlow
    FALSE,              // fOutxDsrFlow
    DTR_CONTROL_DISABLE, // fDtrControl
    FALSE,              // fDsrSensitivity
    FALSE,              // fTXContinueOnXoff
    FALSE,              // fOutX
    FALSE,              // fInX
    FALSE,              // fErrorChar
    FALSE,              // fNull
    RTS_CONTROL_DISABLE, // fRtsControl
    FALSE,              // fAbortOnError
    0,                  // fDummy2
    0,                  // wReserved
    0x100,              // XonLim
    0x100,              // XoffLim
    8,                  // ByteSize
    NOPARITY,           // Parity
    ONESTOPBIT,         // StopBits
    0x11,               // XonChar
    0x13,               // XoffChar
    '?',                // ErrorChar
    0x1A,               // EofChar
    0x10                // EvtChar
};

int main()
{
    // variables locales
    unsigned char buf_rx[8];
    unsigned char buf_tx[8];
    int nId, nBytesWritten, nBytesRead;
    unsigned char vitesse;     // Choix vitesse
   
    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);
}

jeudi 28 septembre 2006 à 20:21:52 | Re : Communication RS232 : Pb de vitesse

deck_bsd

Membre Club
Il y à de nombreuse source sur ce site ou tu peux p-e comparer et voir ce qui ne va pas

++
deck_bsd

[ [ Lien ]]
vendredi 29 septembre 2006 à 09:52:43 | Re : Communication RS232 : Pb de vitesse

arb

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 !!!!


Cette discussion est classée dans : port, int, printf, false, hcom


Répondre à ce message

Sujets en rapport avec ce message

Communication RS232 : Pb de vitesse [ par arb ] 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 liais besoin d'aide sur communication [ par keast ] salut tout le monde, Voila je suis vraiment nul en info et j'ai un problème en ce moment sur un projet. Je dois piloté un appareil qui celui-ci fonct Aide pour un programme,création variable [ par pirana ] bonjour à vous tous ... Voila je suis un débutant en C... j'ai récupéré ce code sur le site et j'aimerai me simplifié la vie...mais je n'y arrive pas Com RS232 [ par Dohko10270 ] Bonjour, Actuellement je cherche à récupérer une trame via la liaison RS232, je réussi très bien à faire ce que je veux à l'aide d'hyperterminal, c'e probleme rs232 [ par rhumone ] j'arrive pas a récupérer la totalitée des données sur ma liaison rs232 je dois recevoir environ 7000 octet j'en recois que 4000 octet.voila mon source aide pour une liaison serie [ par punch95 ] J'ai trouvé un source c pour une liaison serie d'un beck sc12 et j'aimerai que l'on me commente le source si c possible merci./*********************** Gestion de plusieurs ports RS232 [ par dissezfr ] Bonjour à tous d'abordJ'ai récupéré un code sur le site permettant de géré un port série, j'aimerai piloter 8 (voir +) ports série avec un seul ordina Erreur d'execution d'uns dll [ par fabrice91 ] Bonjour tout le monde, voici mon problème : J'ai récupéré un code sur ce fabuleux site qu'est cppfrance;) (http://www.cppfrance.com/codes/BASE-COMMUNI SOS reception et affichage sur port serie [ par dgac ] J'ai dévellopé le programme suivant pour recevoir et afficher une chaine de carractére pour un port serie . J'aimerai de l'aide pour recevoir un carra Problème pour générer des nombres aléatoires [ par Etoiline ] Hello !Voilou je suis débutante en c++. Je dois faire un jeu de yams mais j'ai un problème : pour le premier lancer de dé tout va bien mais pour le se


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,546 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales