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; }Actuellement, côté PIC :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'); }
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. }
Cordialement.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; }
-----