IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème rs 232


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4
    Par défaut Problème rs 232
    Bonjour,

    Le titre n'est pas très explicite, commençons par expliquer plus en détail le problème.
    Je cherche à envoyer une trame de 39 octets sur le port COM. Pour ça, j'utilise un tableau de caractères tout bête que j'envoie à l'aide de WriteFile. Maheureusement, les char se limitent à -128 -> 127 et j'ai besoin de valeur qui montent jusqu'à 255. J'ai donc tenté de transformer le tableau à envoyer en unsigned char (0 -> 255), ce qui n'a rien changé. (Les valeurs reçues sont négatives.)

    Si quelqu'un a une idée pour palier à ce problème, je vous remercie d'avance.

  2. #2
    Membre chevronné
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    Les valeurs recues sont négatives si tu les lis en signé! Lis les en unsigned char, ça devrait résoudre ton problème.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4
    Par défaut
    Merci pour la réponse.
    Je reçois le tout dans un tableau d'unsigned int, donc je pense pas que ça vienne de là.

  4. #4
    Membre chevronné
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    Une petite question: est-ce que tu configures ton port dans ton programme d'émission (vitesse, parité, nb. bits, ...)? Est-ce que cette configuration est conforme à celle de la réception?
    Sinon, montre le code d'émission et celui de réception.

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Kirikq
    Merci pour la réponse.
    Je reçois le tout dans un tableau d'unsigned int, donc je pense pas que ça vienne de là.
    Certes, mais qu'est-ce qui te fait dire que la valeur est négative. Si tu fais un printf() avec "%d", c'est sûr que ça va pas le faire.

    Essaye "%u" et (unsigned), sinon, le unsigned char sera promu en int et non en unsigned int.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4
    Par défaut
    Bonjour, et merci pour les réponses.

    Je vérifie effectivement avec un TextOut qui utilise %d pour la vérification du nombre. Je suis un fan d'aréonautique et j'essaie de me créer un outils pour récuperer les informations de la trame qu'un petit avion m'envoie et les traiter pour enregistrer les résultats donc je ne cherche pas vraiment à afficher ces nombres mais plus à m'en servir pour calcul. Pour le moment, j'émule mes trames avec un petit programme. Pour valider mes trames, j'utilise un checksum. Lorsque je ne mets pas de valeur supérieur à 127, cela fonctionne sans problème. Dés que je dépasse ce seuil, les deux checksum (celui que je calcule à partir du tableau qui reçoit, et celui que j'envoie avec la trame) sont différents et donc les trames sont considérées comme fausses.

    Voici les parties du codes qui peuvent vous aider à y voir plus clair, comme demandé plus haut.

    Reception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
     
    DWORD dwRead;
    unsigned char chRead;
    unsigned int msg_port[1024];
    unsigned int chShow[1024];
    int InitComPort()
    {	
    	// Ouverture du port
    		hComm = CreateFile("Com1", GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
    	if (hComm==INVALID_HANDLE_VALUE)
    	{
    		Msg(TEXT("Erreur lors de l'ouverture du port"));
    		return 0;
    	}
     
    	// Configuration du port en reception
    	DCB dcb;
    	FillMemory(&dcb,sizeof(dcb),0);
    	if (!GetCommState(hComm,&dcb))			// Lit le dcb
    	{
    		Msg(TEXT("Erreur lors de la configuration du port"));
    		return 0;
    	}
    	dcb.BaudRate = CBR_9600;				// Définit la vitesse
    	dcb.fBinary = TRUE;						// Mode binaire
    	dcb.fParity = FALSE;					// Pas de vérification de la parité
    	dcb.fOutxCtsFlow = FALSE;				// Désactive la vérification du CTS
    	dcb.fOutxDsrFlow = FALSE;				// Désactive la vérification du DSR
    	dcb.fDtrControl = DTR_CONTROL_DISABLE;	// Désactive la ligne d'entrée DTR (RESET OFF)
    	dcb.fDsrSensitivity = FALSE;			// Driver sensible au niveau du DSR
    	dcb.fTXContinueOnXoff = FALSE;
    	dcb.fOutX = FALSE;						// XON/XOFF control désactivé en émission
    	dcb.fInX = FALSE;						// XON/XOFF control désactivé en réception
    	dcb.fErrorChar = FALSE;
    	dcb.fNull = FALSE;
    	dcb.fRtsControl = RTS_CONTROL_DISABLE;	// Disable RTS control
    	dcb.fAbortOnError = FALSE;
    	dcb.Parity = NOPARITY;					// Pas de parité
    	dcb.StopBits = ONESTOPBIT;				// Un bit de stop
    	dcb.ByteSize = 8;						// 8 bits de données
     
    	if (!SetCommState(hComm,&dcb))
    	{
    		Msg(TEXT("Erreur lors de la configuration du port"));
    		return 0; 
    	}
    	SetCommMask(hComm,EV_RXCHAR);
     
    	// Configuration en mode Reception
    	if(!SetupComm(hComm,8,8))
    	{
    		Msg(TEXT("Erreur lors de la configuration du port"));
    		return 0;
    	}
     
    	return 1;
    }
     
     
    // reception des données du port
    void ReceptionData()
    {
    	do
    	{
    		int i=0;
     
    		while(i<tailletrame)
    		{
     
    			ReadFile(hComm,&chRead,1,&dwRead,NULL);
    			switch(i)
    			{
    				case 0 :
    				case 1 :
    					if(chRead==14)
    					{
    						chShow[i]=chRead;
    						i++;
    					}
    					else
    						i=0;
    					break;
    				default :
    					chShow[i]=chRead;
     
    					i++;
    					break;
    			}
    		}
    		temp17 = 0;
    		for( i = 0 ; i <= tailletrame -3 ; i++)
    		{
    			temp17 += chShow[i];
    		} 
    		temp17 = temp17 % 65536;
    		temp18 = chShow[tailletrame-1] + chShow[tailletrame-2] * 256;
     
    		if ((dwRead!=0)&& temp17 == temp18)
    		{
    			//Msg(TEXT("reçu"));
    			int j=0;
    			while(j<tailletrame)
    			{
    				msg_port[j]=chShow[j];
    				j++;
    			}
    		}
    	}while(dwRead!=0);
     
    	LanceThreadAttente();
    }
     
    // thread d'ecoute au port
    DWORD WINAPI ThreadAttente(LPVOID lpParam) 
    { 
    	DWORD event;
     
    	PurgeComm(hComm,PURGE_RXCLEAR);
    	PurgeComm(hComm,PURGE_RXABORT);
    	do
    	{
    		WaitCommEvent(hComm, &event, NULL);
    	}while(!(event&EV_RXCHAR));
     
    	PurgeComm(hComm,PURGE_RXCLEAR);
    	PurgeComm(hComm,PURGE_RXABORT);
    	do
    	{
    		WaitCommEvent(hComm, &event, NULL);
    	}while(!(event&EV_RXCHAR));
     
    	ReceptionData();
        return 0;
    } 
     
    // lancement d'un thread d'attente de changement au port com
    void LanceThreadAttente()
    {
    	CreateThread(NULL,NULL,ThreadAttente,NULL,NULL,NULL);
    }
    Emission
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    HANDLE hComm;
     
     int OuvreCom(char *strPort,long BaudRate,int BitsSize,int Parity,int StopBits)
     {
    	 DCB g_DCB;
         // On ouvre le port série
         hComm = CreateFile(strPort,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING,NULL);
     
         if(hComm == INVALID_HANDLE_VALUE)
         {
             // Echec
             Msg(TEXT("Echec"));
         }
         else
         {
             // On vide les buffers
             PurgeComm(hComm,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);        
     
             // On paramètre le port série
             g_DCB.DCBlength = sizeof(DCB);
             //Configuration actuelle
             GetCommState(hComm, &g_DCB);
             //Modification du DCB
    		 DCB g_DCB =
    		 {
    			 sizeof(DCB), /* DCBlength */
    				 9600, /* BaudRate */
    				 TRUE, /* fBinary */
    				 FALSE, /* fParity */
    				 FALSE, /* fOutxCtsFlow */
    				 FALSE, /* fOutxDsrFlow */
    				 DTR_CONTROL_ENABLE, /* fDtrControl */
    				 FALSE, /* fDsrSensitivity */
    				 FALSE, /* fTXContinueOnXoff */
    				 FALSE, /* fOutX */
    				 FALSE, /* fInX */
    				 FALSE, /* fErrorChar */
    				 FALSE, /* fNull */
    				 RTS_CONTROL_ENABLE, /* 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 */
    		 };
    		 SetCommState(hComm,&g_DCB);
    		 SetupComm(hComm, NULL, TX_SIZE);
    		 EscapeCommFunction(hComm, SETDTR);
         }
         return 1;
     }
    Ensuite je crée deux tableaux que je remplis pareil (C'est juste des tests, je le rappelle.), le premier est un unsigned char, l'autre un unsigned int.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    unsigned char msg_port[38];
    unsigned int msg[38];
    Puis je calcule le checksum avec le tableau d'int, et je le place dans le tableau de char que j'envoie toutes les 40ms:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    		for(i = 1; i <= 36 ; i++)
    		{
    			temp4 += msg[i];
    		}
     
    		temp5 = temp4 % 256;
    		temp6 = temp4 / 256;
    		msg_port[37] = temp6;
    		msg_port[38] = temp5;
    WriteFile(hComm,&msg_port,39,&NumBytes,NULL)==0
    Merci pour vos réponses futures.

Discussions similaires

  1. Problème de réception RS-232 avec Javacomm
    Par Xmen3 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 09/06/2011, 14h03
  2. Problèmes test trame rs 232
    Par Cohars dans le forum LabVIEW
    Réponses: 3
    Dernier message: 08/06/2010, 18h12
  3. Problème lors de l'envoi de données via laision RS 232
    Par Rastaforien dans le forum Langage
    Réponses: 9
    Dernier message: 26/06/2008, 11h54
  4. Problème lors de l'envoi de données via laison RS 232
    Par Rastaforien dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 23/06/2008, 16h36
  5. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo