THREAD DE SOCKET EN C++ - RTOS - dk51 - [Résolu/Fermé]

Signaler
Messages postés
69
Date d'inscription
mercredi 16 janvier 2008
Statut
Membre
Dernière intervention
2 septembre 2009
-
 216970 -
Bonjour la communauté informatique,

Je suis étudiant en BTS informatique industrielle et je suis en projet de fin de 2ème année. Je dois récupérer les données d'une station météo et envoyer ces données au programme principal, sous visual C++.

J'ai réussi à établir la liaison RS232 entre ma carte sc13 + dk51 et ma station météo. J'ai fait un programme sous borland pour le développer en 16bits pour un processeur 80186 du fait de la carte de destination...

Je dois maintenant renvoyer les mesures que j'ai enregistré dans une structure :

Je veux :
sur la carte sc13
- créer un thread d'écoute de socket

Mais la question est comment faire ?????????????????????????????????????

Quelqu'un sait comment gerer les thread sous RTOS ???? Je veux bien de l'aide, je nage .. Merci

4 réponses

Messages postés
69
Date d'inscription
mercredi 16 janvier 2008
Statut
Membre
Dernière intervention
2 septembre 2009
85
Alors voilà la solution :

// Meteo.h ( THREAD DE COMMUNICATION SOCKET)

#if !defined(AFX_METEO_H__4BB4970B_F2ED_4E97_9C58_24835AA71B7C__INCLUDED_)
#define AFX_METEO_H__4BB4970B_F2ED_4E97_9C58_24835AA71B7C__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// Meteo.h : header file
//
#include "PrimsolClimatDoc.h"
#include "CommSocket.h"



/////////////////////////////////////////////////////////////////////////////
// CMeteo thread

class CMeteo : public CWinThread
{
	DECLARE_DYNCREATE(CMeteo)
protected:
	CMeteo();           // protected constructor used by dynamic creation

// Attributes
public:

// Operations
public:
	int Run();
	void setDoc(CPrimsolClimatDoc * doc) { m_pDonnees = doc;}


// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CMeteo)
	public:
	virtual BOOL InitInstance();
	virtual int ExitInstance();
	//}}AFX_VIRTUAL

// Implementation
protected:
	
	virtual ~CMeteo();

	// Generated message map functions
	//{{AFX_MSG(CMeteo)
		// NOTE - the ClassWizard will add and remove member functions here.
	//}}AFX_MSG

	DECLARE_MESSAGE_MAP()
private:
	int m_Port;
	CString m_IPSrv;
	CPrimsolClimatDoc * m_pDonnees;
	CCommSocket m_pCommSocket;
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_METEO_H__4BB4970B_F2ED_4E97_9C58_24835AA71B7C__INCLUDED_)



// Meteo .cpp (la fonction RUN est la fonction lancée par le thread )

// Meteo.cpp : implementation file
//

#include "stdafx.h"
#include "PrimsolClimat.h"
#include "Meteo.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMeteo

IMPLEMENT_DYNCREATE(CMeteo, CWinThread)

CMeteo::CMeteo()
{
}

CMeteo::~CMeteo()
{
}

BOOL CMeteo::InitInstance()
{
	// TODO:  perform and per-thread initialization here
	//M__sock = new CCommSocket();	//CCommSocket dérivé de CAsyncSocket
	return TRUE;
}

int CMeteo::ExitInstance()
{
	// TODO:  perform any per-thread cleanup here
	return CWinThread::ExitInstance();
}

BEGIN_MESSAGE_MAP(CMeteo, CWinThread)
	//{{AFX_MSG_MAP(CMeteo)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMeteo message handlers

int CMeteo::Run()
{
		m_IPSrv = "192.168.1.56";
		m_Port = 4000;

		float vrafvent1=0;
		float vrafvent2=0;
		
		float vrafvent=0;

		int dvent=0;
		float temp1=0;
		float temp2=0;

		float temp=0;

		int signe=0;
		int hygr=0;
		int pluv=0;

	while(1)
	{
		int BufSize = 256;
		char *pBuf=new char[BufSize];

		//m_pCommSocket->setDoc(m_pDonnees); // transfert de l'adresse du pointeur m_pDonnees à la classe CCommSocket
		// client,cree un socket par default
		m_pCommSocket.Create();
		// ouvre la connexion sur le serveur
		m_pCommSocket.Connect(m_IPSrv,m_Port);
		// reçoit la trame du serveur
		m_pCommSocket.Receive(pBuf,BufSize);
		// ferme le socket connecte
		Sleep(1);
		m_pCommSocket.Close();
		
		Sleep(1);
		vrafvent1 = pBuf[0];
		vrafvent2 = pBuf[1];
		
		vrafvent = vrafvent1 + vrafvent2/10;
		
		dvent	 = pBuf[2];
		temp1	 = pBuf[3];
		temp2	 = pBuf[4];

		temp     = temp1+temp2/10;
		
		hygr	 = pBuf[5];
		pluv	 = pBuf[6];
		Sleep(1);
		m_pDonnees->m_pVerrouMeteo.Lock();
		m_pDonnees->acquisitionReelleMeteo[0]= temp;
		m_pDonnees->acquisitionReelleMeteo[1]= (float)hygr;
		m_pDonnees->acquisitionReelleMeteo[2]= (float)pluv;
		m_pDonnees->acquisitionReelleMeteo[3]= vrafvent;
		m_pDonnees->acquisitionReelleMeteo[4]= (float)dvent;
		m_pDonnees->m_pVerrouMeteo.Unlock();
		
		delete[]pBuf;
		Sleep(5000);
	}
	return (0);
}


Création du thread et passage du pointeur sur doc
	m_pMeteo = (CMeteo*) AfxBeginThread(RUNTIME_CLASS(CMeteo),THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);
	m_pMeteo->setDoc(m_pDoc);
	m_pMeteo->ResumeThread();


ne pas oublier de déclarer comme ceci dans meteo.h :
void setDoc(CPrimsolClimatDoc * doc) { m_pDonnees = doc;}


voili voilou, je t'envoie le projet complet (ou presque) sur ton adresse mail.
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 63631 internautes nous ont dit merci ce mois-ci

Salut siskozed,
Je suis etudiant moi aussi et je suis sur un projet similaire en partie au tien,c'est vraiment tres sympas de ta part de publier le code du thread ça ma beaucoup aidé .
Mon projet consiste en 1éré partie à envoyer des données depuis des capteurs thermiques vers une plaque à base de MCS1210 ensuite ce µc envoie ces données par des sockets vers une @ip à travers le gprs enfin le stockage dans une base de données .
la seconde partie du projet consiste à faire le parametrage du msc1210 (exp:desactiver certain capteurs)
donc on va faire chemin inverse de la 1ere partie mais soit par sms soit par gprs.
Je te serai tres reconnaissant si tu m'envoie ton projet et contre partie si ça t'interesse je pourrais t'envoyer la partie 2 (parametrage) une fois terminé .
voici mon mail :ziedbh2003@yahoo.fr
Messages postés
69
Date d'inscription
mercredi 16 janvier 2008
Statut
Membre
Dernière intervention
2 septembre 2009
85
personne ne s'y connait en socket ?
s'il vous plait ?! HELP
Messages postés
69
Date d'inscription
mercredi 16 janvier 2008
Statut
Membre
Dernière intervention
2 septembre 2009
85
J'ai commencé à faire ca :

Mais je ne sais toujours pas comment m'y prendre pour la création du thread sous rtos

// Include files
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "clib.h"
#include <iostream>

//_________________________________________________________________ Constructeur
   SocketClient::SocketClient()
{
		int valeurDeRetour = 0;
}

//____________________ initialisation des parametres de la socketServeurDistante
void SocketClient::initialiserParamSocketServeurDistant()
{
  	parametreSocketServeurDistant.sin_family	= AF_INET ;
	parametreSocketServeurDistant.sin_port	= 7 ;
	parametreSocketServeurDistant.sin_addr.s_addr = 192.168.1.56 ;
}


//_______________________ initialisation des parametres de la socketClientLocale
void SocketClient::initialiserParamSocketClientLocale()
{
	parametreSocketClientLocale.sin_family	= AF_INET ;
	parametreSocketClientLocale.sin_port	= 0; // pour laisser le système fournir un numéro de port à la socket                                                                             //client locale
	parametreSocketClientLocale.sin_addr.s_addr	= INADDR_ANY ; // pour laisser le système déterminer 
																								// l'adresse IP de la machine

}

//__________________________________________________ créer la socketClientLocale
void SocketClient::creerSocketClientLocale()
{
	descripteurSocketClientLocale =  socket(AF_INET,SOCK_STREAM,0) ;

	if (descripteurSocketClientLocale < 0)
	{
   	cout << "Erreur dans la creation de la socketClientLocale !";
   }
}

//_____________________________ attacher les parametres de la socketClientLocale
void SocketClient::attacherParamEtSocketClientLocale()
{
	valeurDeRetour = bind (descripteurSocketClientLocale,
    							 (struct sockaddr *) &parametreSocketClientLocale,
                          sizeof (struct sockaddr_in) ) ;

   if (valeurDeRetour < 0)
	{
   	cout << "Erreur dans l'attachement des parametres de la socketClientLocale !";
   }
}

//_________________________________________________________________ se connecter
void SocketClient::seConnecter()
{
   valeurDeRetour = connect (descripteurSocketClientLocale,
   								 (struct sockaddr *) &parametreSocketServeurDistant,
                             sizeof (struct sockaddr_in) ) ;
   if (valeurDeRetour < 0)
	{
   	cout << "Impossible d'établir une connexion entre les sockets !";
      close (descripteurSocketClientLocale) ;
   }
}

//______________________________________________________________ envoyer requete
void SocketClient::envoyerRequete()
{
	valeurDeRetour = send (descripteurSocketClientLocale,
							  Requete,
                       sizeof (Requete),
                       0);

   if (valeurDeRetour < 0)
	{
   	cout << "Impossible d'envoyer la requete !";
      close (descripteurSocketClientLocale) ;
   }
}

//____________________________________________________________ recevoir la trame
void SocketClient::recevoirTrame()
{
   valeurDeRetour = recv (descripteurSocketClientLocale,
								  TrameServeur,
         					  sizeof (TrameServeur),
								  0);

	if (valeurDeRetour < 0)

}

//__________________________________________________________ fermer la connexion
void SocketClient::fermerConnexion()
{
   close (descripteurSocketClientLocale) ;
}
Messages postés
69
Date d'inscription
mercredi 16 janvier 2008
Statut
Membre
Dernière intervention
2 septembre 2009
85
j'ai résolu le probleme, j'essayerai de mettre la solution dans les jours à venir mais je n'ai pas le temps pour l'instant, si vous etes interessés, envoyez moi un mail, je vous enverrai ca ;)
Je suis très intéressé par ton code
Tu peux stp me l'envoyer sur mon adresse elarabyh@menara.ma
D'avance merci
salut tou le monde
j'ai une certe DK51 avec sc13 lorsque je la connecte a mon pc portable tou se passe bien mais losque je la connecte a mon pc de la maison je recois aucunne reponse qlq'un peut m'aider
Bonjour,
Je pense pas que le problème est du à la carte donc il faut verifier les paramètre de votre PC de bureau. parmi les choses que tu dois verifier:
- tu utilise le bon port COM et que ton port n'est pas abimé, pou cela essaie de connecter ton pc de maison à un autre périférique
- vérifier les paramètres de connexions; debit, controle de parité...