begin process at 2012 05 30 10:23:15
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Général

 > 

USB - HID


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

USB - HID

vendredi 5 novembre 2010 à 15:04:59 | USB - HID

acarapataf

Bonjour à tou(te)s,

Dans le cadre d'un projet de régulation, je dois faire communiquer (envoie + réception) un mini-pc avec un microcontroleur de type PIC18F4550 (de Microchip).

Cela fonctionnait avec de l'usb 2.0 fullspeed, mais un problème majeur est apparu : le temps d'établissement du canal lors de chaque communication était trop lente pour notre processus de régulation.

Nous avons donc changé notre fusil d'épaule et avons abandonné le 2.0 pour passer au HID (human interface device), qui offre un débit nettement moins rapide mais qui a néanmoins l'avantage de ne pas devoir ouvrir et fermer sans cesse le canal d'où un gain de temps recherché dans notre application.

L'envoie d'informations PC -> PIC se déroule correctement, mais nous avons des difficultés à recevoir des données depuis le PIC vers le PC.

Voici notre façon de procéder : pour recevoir des données, le PC envoie au PIC un paquet où un en-tête contient un ID qui va indiquer au PIC quelle fonction il doit effectuer. A la fin de la fonction (au niveau du PIC), ce dernier rapatrie les informations voulues (en fonction de la fonction dans laquelle il se trouve, selon l'ID) vers le PC. C'est ici qu'apparaît notre problème : si je ne fais rien au niveau du PC après l'envoie du paquet, la routine "OnHIDEvent()" va repérer que le PIC nous a envoyé des données et va les lire. C'est donc parfait ! Mais dans notre cas, on est en plein milieu d'une routine et donc je pense que tant qu'on n'a pas fini notre routine, la fonction "OnHIDEvent()" n'est pas appelée et on ne lit donc pas les infos reçues. J'ai essayé de lire manuellement avec la fonction "Read(DevHandle, BufferIn)", mais les valeurs lues sont flottantes apparemment...

Quelqu'un pourrait-il m'aider en m'indiquant comment faire pour lire des données dans une routine, s'il y a un délai spécifique à attendre, s'il faut tester quelque chose, ... ?!

Je programme en C++ (MFC) du PC, et j'utilise la librairie fournie par EasyHid (très peu documentée!!!), que je vous joint ici, ainsi

qu'une partie de mon programme.

Merci beaucoup d'avance à tous pour votre aide précieuse car là nous sommes vraiment à court d'idée !


-----------------------------------------------------------------------

"Prototypes" de la libraire EasyHID :
Code C/C++ :
typedef BOOL (WINAPI *CONNECT) (HWND pHostWin);
typedef BOOL (WINAPI *DISCONNECT) ();
typedef UINT (WINAPI *GET_ITEM) (UINT);
typedef UINT (WINAPI *GET_ITEM_COUNT) ();
typedef BOOL (WINAPI *READ) (UINT, LPVOID);
typedef BOOL (WINAPI *WRITE) (UINT, LPVOID);
typedef BOOL (WINAPI *READ_EX) (UINT, UINT, LPVOID);
typedef BOOL (WINAPI *WRITE_EX) (UINT, UINT, LPVOID);
typedef UINT (WINAPI *GET_HANDLE) (UINT, UINT);
typedef UINT (WINAPI *GET_VENDOR_ID) (UINT pHandle);
typedef UINT (WINAPI *GET_PRODUCT_ID) (UINT pHandle);
typedef UINT (WINAPI *GET_VERSION_ID) (UINT);
typedef UINT (WINAPI *GET_VENDOR_NAME) (UINT, LPSTR, UINT);
typedef UINT (WINAPI *GET_PRODUCT_NAME) (UINT, LPSTR, UINT);
typedef UINT (WINAPI *GET_SERIAL_NUMBER) (UINT, LPSTR, UINT);
typedef UINT (WINAPI *GET_INPUT_REPORT_LENGTH) (UINT);
typedef UINT (WINAPI *GET_OUTPUT_REPORT_LENGTH) (UINT);
typedef void (WINAPI *SET_READ_NOTIFY) (UINT, BOOL);
typedef BOOL (WINAPI *IS_READ_NOTIFY_ENABLED) ();
typedef BOOL (WINAPI *IS_AVAILABLE) ();



Partie de mon programme :
Code C/C++ :
LRESULT CGTX_PCDlg::OnHIDEvent(WPARAM wParam, LPARAM lParam)
{
   CStatic* Label = (CStatic*) GetDlgItem(IDC_STATIC); // get dialog label
   char Text[0xFF];                                    // text buffer
   UINT DevHandle;                                     // HID device handle
   HIDBufferIn BufferIn;                               // HID read buffer
   double temp;
       
   DevHandle = lParam;
   switch(wParam)
   {
	    // a HID device has been plugged in...
		case NOTIFY_PLUGGED:
		{
			// is it our HID device...
			if (GetVendorID(DevHandle) == VENDOR_ID && GetProductID(DevHandle) == PRODUCT_ID)
			{
				   GetProductName(DevHandle,Text,0xFF);
				   Label->SetWindowText(CString("USB Device '") + 
					                    CString(Text) + 
										CString("' is PLUGGED IN"));
			}
			return 1;
		}

		// a HID device has been removed...
		case NOTIFY_UNPLUGGED:
		{
			// is it our HID device...
			if (GetVendorID(DevHandle) == VENDOR_ID && GetProductID(DevHandle) == PRODUCT_ID)
 		       Label->SetWindowText("USB Device has been UNPLUGGED");
			return 1;
		}

		// a HID device has been pluggined in or removed - this event
		// is fired after all PLUGGED and UNPLUGGED messages have
		// been dispatched...
		case NOTIFY_CHANGED:
		{
			// we want our device to send read notification messages...
			DevHandle = GetHandle(VENDOR_ID, PRODUCT_ID);
			SetReadNotify(DevHandle, TRUE);
			return 1;
		}

		// a HID device has sent some data...
		case NOTIFY_READ:
		{
			// read the data...
			Read(DevHandle, BufferIn);
			return 1;
		}
	}
	return 0;
}


void CGTX_PCDlg::OnBnClickedButton()       //fonction qui envoie un BufferOut et va recevoir un BufferLecture... du moins qui devrait !
{
  // output buffer...
  HIDBufferOut BufferOut;
   
  // first element is the report ID
  BufferOut[0] = 0;

  // rest of the buffer is for data...
  BufferOut[1] = ID7;                 //Flag
  BufferOut[2] = 3;                   //Contient les deux bits de direction
  BufferOut[3] = 40;		      // VG
  BufferOut[4] = 40;                  // VD

  // now send the data...
  WriteEx(VENDOR_ID, PRODUCT_ID, BufferOut);
  ReadEx(VENDOR_ID, PRODUCT_ID, BufferLecture);        //J'aimerais lire ici les données renvoyées par le PIC, mais cela ne fonctionne pas :(

  return;
}




Cette discussion est classée dans : id, get, uint, typedef, winapi


Répondre à ce message

Sujets en rapport avec ce message

Get Process Name From ID [ par zod331 ] Bonjour, Je cherche une fonction pour obtenir le nom d'un processus (sous cette forme name.exe) à partir de son ID Merci CWnd* SendMessage [ par thejrem ] bonjour j'ai mon SendMessage(id,WM_KEYDOWN,'N',0); qui fonctionne avec un HWND id maintenant j'aimerai passer mon SendMessage en CWnd* car mon id et pointer sur unsigned char [ par avg ] Bonjour à tous je veut appeler une méthode qui n'est pas la mienne mais j'ai sa documentation qui contient titre de méthode et ses paramètres. Mon pro Question sur le handle de WIN32 [ par BencoAndCo ] Bonjour, Je débute en prog. win32 en C++ et j'ai un gros logicielle à analyser dans ce code j'ai trouvé la ligne suivante : " typedef HANDLE (WINA j'arrive pas à compiler ce code !! [ par achourmeddeb ] bonsoir tout le monde , j'ai un projet à rendre mais je n'arrive pas à compiler ce code et je pense que le problème réside dans l'une des trois foncti aide [ par ghostmiki ] voila je demande votre aide pour m'explique comment faire une analyse lexical de sa: [code=cpp]R = { P ®Program id S_DCL Début S_INST Fin grammaire non contextuelle [ par nissaf ] svp vs pouvez m'aider à cômprendre cette grammaire: demandé: analyse lexical/syntaxique/sémantique G=(V,T,P,R) V= {P.S DCL. DCL.S INST.INST.Expb.Expr. QxOrm : Persistance (ORM), Serialization, Reflection [ par QxOrm ] Bonjour, [b]QxOrm[/b] est une nouvelle librairie C++ open source de gestion de données : [url=http://www.qxorm.com]http://www.qxorm.com[/url] A part Problème d'affichage d'image svp besoin d'aide [ par nico2910 ] Salut à tous,j'ai un petit problème avec mon programme en C(que je compile sous Visual C++Express 2008 sans erreur),je n'arrive pas à [b]charger et sa Récupérer un entier avec GTK_ENTRY_GET_TEXT [ par amdsources ] Récupérer un entier avec GTK_ENTRY_GET_TEXT -------------------------------------------------------------------------------- Bonjour, Je suis entra


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
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,281 sec (3)

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