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