Rechercher : dans
Par :

THREAD DE SOCKET EN C++ - RTOS - dk51 -

Dernière réponse le 18 mar 2009 à 11:10:54 siskozed, le 23 avr 2008 à 14:53:51 
 Signaler ce message aux modérateurs

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

Configuration: Windows XP
Borland
carte SC12 - 13

Meilleures réponses pour « THREAD DE SOCKET EN C++ RTOS dk51 » dans :
La compilation et les modules en C et en C++ VoirCet article a pour vocation d'introduire les notions de bases de la compilation en C et en C++ et de la programmation modulaire. Il permet de mieux comprendre les messages d'erreur du compilateur. Les notions abordées ici sont indépendantes du...
[Langage C] C/C++ Erreur de segmentation VoirQu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux...
Compiler du C sous Linux/UNIX VoirSous Linux, le compilateur de C est gcc. Il est installé de base sur plusieurs distributions, mais sur Debian (et celles qui en découlent) il faudra l'installer (aptitude install gcc). gcc Syntaxe de GCC gcc Tout d'abord, il faut savoir...
Télécharger Visual C++ Express VoirVisual C++ Express est une version "gratuite" et allégée de Visual Studio ; l'utilisation requiert l'inscription sur le site de Microsoft. Cet environnement de développement permet de créer des application Win32 ou du .NET C.
Les fonctions de l'API Socket VoirLes fonctions des sockets en détail La fonction socket() La création d'un socket se fait grâce à la fonction socket() : int socket(famille,type,protocole) famille représente la famille de protocole utilisé (AF_INET pour TCP/IP utilisant une...
Langage C++ - Les types de données VoirLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...
Les chaînes de caractères en C++ VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C++, une...

2

siskozed, le 27 avr 2008 à 16:21:47

Personne ne s'y connait en socket ?
s'il vous plait ?! HELP

Répondre à siskozed

3

siskozed, le 28 avr 2008 à 10:06:07

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) ;
}

Répondre à siskozed

4

siskozed, le 5 mai 2008 à 10:58:57

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 ;)

Répondre à siskozed

5

Elaraby, le 21 mai 2008 à 15:43:02

Je suis très intéressé par ton code
Tu peux stp me l'envoyer sur mon adresse elarabyh@menara.ma
D'avance merci

Répondre à Elaraby

6

siskozed, le 21 mai 2008 à 20:15:15

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.

Répondre à siskozed

7

zdoucha, le 11 fév 2009 à 17:22:27

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

Répondre à zdoucha

8

eby, le 16 fév 2009 à 20:39:51

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

Répondre à eby

9

 216970, le 18 mar 2009 à 11:10:54

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é...

Répondre à 216970
Collection CommentÇaMarche.net