Programmation sur PIC en C (MikroC) et liaison USB via HID (mcHID.dll) en C++
Répondre à la discussion
Affichage des résultats 1 à 3 sur 3

Programmation sur PIC en C (MikroC) et liaison USB via HID (mcHID.dll) en C++



  1. #1
    invitec58808fd

    Programmation sur PIC en C (MikroC) et liaison USB via HID (mcHID.dll) en C++


    ------

    Bonsoir,

    Le contexte est le suivant :
    Je programme un PIC qui devra gérer un scanner. Ce PIC est connecté en USB au PC.
    Je programme le PIC avec le compilateur MikroC et envoie le .hex avec PicFlash.
    Je programme l'application PC avec Microsoft Visual Studio C++ et la fameuse mcHID.dll (j'ai jamais trouvé son site officiel ou une documentation officiel) qui permet de communiquer avec les périphériques HID.

    Mon problème est que j'arrive à envoyer 1 caractère du PC vers le PIC mais quand il s'agit d'envoyer un nombre qui ne soit pas entre 1 et 9, mais supérieur à 9, style 6421 par exemple bah je n'y arrive pas.

    La fonction Write de la mcHID.dll j'ai l'impression qu'elle n'envoie que le case 1 du buffer, à savoir bufferOut[1]. J'ai donc essayé de faire une boucle qui envoie chiffre après chiffres le nombre dans bufferOut[1] mais c'est devenue la catastrophe et je pense que je me dirige vers l'impasse...

    Actuellement, côté PC :

    Code:
    int main()
    {
    	cout << "*** Test avec mcHID.dll  ***" << endl << endl;
    
    	CScanner monScanner;
    	
    	unsigned int choix;
    	
    	do
    	{
    		cout << "1. Test" << endl;
    		cout << "2. Initialisation du Moteur" << endl;
    		cout << "3. Bouge le moteur en avant" << endl;
    		cout << "4. Bouge le moteur en arriere" << endl;
    		cout << "5. Acquisition" << endl;
    		cout << "6. Reception d'une ligne" << endl;
    		cout << "Votre choix : "; cin >> choix; cout << endl;
    
    		switch(choix)
    		{
    			case 1:	cout << "monScanner.leTest() : " << monScanner.leTest() << endl;
    			break;
    
    			case 2: cout << "monScanner.initMoteur() : " << monScanner.initMoteur() << endl;
    			break;
    
    			case 3: cout << "monScanner.bougeMoteur(AVANCE, 5) : " << monScanner.bougeMoteur(AVANCE, 5) << endl;
    			break;
    
    			case 4: cout << "monScanner.bougeMoteur(ARRIERE, 4) : " << monScanner.bougeMoteur(ARRIERE, 6421) << endl;
    			break;
    
    			case 5: cout << "monScanner.acquisition() : " << monScanner.acquisition() << endl;
    			break;
    
    			case 6: cout << "monScanner.receptionLigne() : " << monScanner.receptionLigne() << endl;
    			break;
    		}
    
    		cout << endl;
    	}while(choix != 123);
    
    	return 0;
    }
    Code:
    bool CScanner::bougeMoteur(int sens, int position)
    {
    	char code;
    	if(sens == ARRIERE) code = '4';
    	else code = '5';
    
    	// mise de la position dans le bufferOut V1
    	//memcpy(&bufferOut[2], &position, 2);
    
    	// On evoie le code 4 ou 5
    	bufferOut[1] = code; // code 4 ou 5
    	bool statusW = Write(handle, bufferOut);
    
    	// On lit le code renvoyer par le PIC (ça doit être 2 (occupé))
    	bool statusR = Read (handle, bufferIn);
    
    	// mise de la position dans le bufferOut V2
    	/*char ordre [20];
    	strcpy (ordre, position);
    	for (int i=0; i < strlen(ordre); i++)
    	{
    		bufferOut [1] = ordre [i];
    		Write (handle, bufferOut );
    	}*/
    	
    	//char *buffer = new char[];
    	itoa(position,&bufferOut[1],10);
    	statusW = Write(handle, bufferOut);
    	//for(int i = 2; bufferOut[1] != 0; i++)
    	//{
    	//	bufferOut[1] = bufferOut[i];
    		//bufferOut = bufferOut >> 8;
    		//itoa(position,&bufferOut[1],10);
    	//	statusW = Write(handle, bufferOut);
    	//}
    
    	return (bufferIn[1] == '2');
    }
    Actuellement, côté PIC :

    Code:
    void main()
    {
      Config_ports();
      Hid_Enable(&userRD_buffer, &userWR_buffer); // Enables USB HID communication
      initMoteur();
      do {
          if(HID_Read()) //Receives message from host and stores it in the Read Buffer.
          {
                if (userRD_buffer[0] == '0') leTest();
                else if (userRD_buffer[0] == '7') initMoteur();
                else if (userRD_buffer[0] == '4') bougeMoteur(ARRIERE);
                else if (userRD_buffer[0] == '5') bougeMoteur(AVANCE);
                else if (userRD_buffer[0] == '1') acquisition();
                else if (userRD_buffer[0] == '6') receptionLigne();
                else leDefault();
          }
      } while(1);
    
      Hid_Disable(); //Disables USB HID communication.
    }

    Code:
    void bougeMoteur(unsigned short int sens)
    {
         char buffer[40];
         int continuation = 1;
         int nbRecus = 0;
         int i;
         
         userWR_buffer[0] = '2'; // Prepare buffer avec code 2 (occupé)
         Hid_Write(&userWR_buffer, 1); //Function sends data from Write Buffer writebuff to host.
    
         // la position désirée... V1
         do{
           nbRecus = HID_Read();
           for(i = 0; i < nbRecus; i++)
           {
                         buffer[i] = userRD_buffer[i];
                         continuation = 0;
           }
         buffer[i] = 0;
         userRD_buffer[0] = 0;
         }while(continuation);
         //buffer[0] = '1';
         //buffer[1] = '1';
         //buffer[2] = 0;
         positionDemandee = atoi(buffer);
         PORTD = buffer[0];
         //if(positionDemandee != 0) PORTD.F1 = 1;
         //else  PORTD.F1 = 0;
         //PORTD.F1 = 1;
         Enabled = 0; // vers RA3 sur carte moteur
         //while(positionDemandee != maPosition && Opto != 1 && maPosition != POSMAX) avancePas(sens);
         Enabled = 1;
    }
    Cordialement.

    -----

  2. #2
    invitea5e3e6e1

    Re : Programmation sur PIC en C (MikroC) et liaison USB via HID (mcHID.dll) en C++

    Bonjour
    pas évident, mais je me pose la question, pour utiliser la dll il faut l'initialiser et valider l'ouverture d'un port USB , handleur spécifique ,je suppose????
    J'ai la même application qui est sur RS232 (dialogue PC <--> PIC pour une machine à découper) et je vais sans doute l'upgrader en USB, mais je ne pense pas utiliser cette dll, sauf si on ne peut pas faire autrement...
    J'utilise le C++ de code::blok pour mes apply sur PC.
    Bon courage....

  3. #3
    invitec58808fd

    Re : Programmation sur PIC en C (MikroC) et liaison USB via HID (mcHID.dll) en C++

    Merci
    Finalement j'ai fait la méthode d'envoyer caractère par caractère via le bufferOut[1].

Discussions similaires

  1. PIC-USB mchid.dll en Basic
    Par invite03717d3c dans le forum Électronique
    Réponses: 1
    Dernier message: 10/12/2009, 13h53
  2. Probleme Bootloader HID et USB
    Par invite7b360637 dans le forum Électronique
    Réponses: 6
    Dernier message: 21/08/2009, 22h45
  3. Joystick HID 16bits et pic18F4550
    Par modelvincent dans le forum Électronique
    Réponses: 4
    Dernier message: 26/03/2009, 20h09
  4. hid.dll
    Par invite1208e497 dans le forum Électronique
    Réponses: 11
    Dernier message: 21/11/2008, 12h49
  5. USB hid prob main()
    Par invite1feace2e dans le forum Électronique
    Réponses: 2
    Dernier message: 15/03/2007, 13h38
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...