Hola a todos, antes de nada una presentación, me llamo Alberto y soy de Jaen-España aunque vivo en Sevilla, estoy haciendo un proyecto con pic 18F2550. He seguido los magnificos ejemplos y tutoriales tanto de Redpic como de JM1, he cogido la dll de ejemplo que da microchip y es hay donde me he encontrado con el problema. Dentro de la propia dll he introducido funciones y procedimientos para que desde cualquier programa sea mas facil el uso de esta dll, por ejemplo yo uso solo estas funciones:
DWORD PICCount(void);
DWORD PICInstance(DWORD instance);
PCHAR PICSerialN(DWORD instance);
PCHAR PICFirmware(DWORD instance);
DWORD PICWrite(DWORD instance, PVOID pData);
DWORD PICRead( DWORD instance, BYTE COMMAND, PVOID pDataRead);
PCHAR DLLVersion(void);
Luego desde Delphi es mas facil su uso:
//Listar Tarjetas
l1.Clear;
ndevices:=PICCount;
for x:=0 to ndevices-1 do begin
ListItem := l1.Items.Add;
ListItem.Caption := inttostr(PICInstance(x));
ListItem.SubItems.Add(PICSerialN(x));
ListItem.SubItems.Add(PICFirmware(x));
end;
l_total.Caption:='DEVICE LIST TOTAL BOARDS: '+inttostr(ndevices);
l_version.Caption:=DLLVersion();
//escritura
if PICWrite(id_sel,@buf)<>1 then memo2.Lines.Add('USB ERROR WRITING');
//id_sel es la tarjeta seleccionada de la lista
//leer por ejemplo Conversores analogico digital
if PICRead(id_sel,LEER_ADC,@adcs)<>1 then memo2.Lines.Add('USB ERROR READING');
//LEER_ADC es un comando
Para hacer esto he tenido que modificar la dll para que haga todo los proceso de lectura y escritura, asi como la enumeracion y captura de los SerialNumbers y Firmwares Versions.
**************************************************************
*
* Devuelve el valor de la instancia
*
**************************************************************
DWORD PICInstance(DWORD instance)
{
HANDLE tempPipe;
for(DWORD i = 0; i < MAX_NUM_MPUSB_DEV; i++)
{
for (int y=0;y<10;y++)
{
tempPipe=MPUSBOpen(i,Vs[y],"",MP_READ,0);
if(tempPipe != INVALID_HANDLE_VALUE)
{
if (i==instance)
{
MPUSBClose(tempPipe);
vid_array[i]=Vs[y];
seriales[i]=(PCHAR)PICSerialN(i);
return i;
}
}
}
MPUSBClose(tempPipe);
}//end for
return 999;
}//end
**************************************************************
*
* Devuelve el SerialNumber por instancia
*
**************************************************************
PCHAR PICSerialN(DWORD instance)
{
HANDLE myOutPipe, myInPipe;
PDWORD SentDataLength;
DWORD RecvDataLenght;
PDWORD pLength1;
BYTE send[64];
BYTE recv[64];
PCHAR cadena;
PCHAR vid_f;
vid_f=vid_array[instance];
SentDataLength=0;
RecvDataLenght=13;
pLength1=0;
myOutPipe = MPUSBOpen(instance,vid_f, "\\MCHP_EP1", MP_WRITE, 0);
myInPipe = MPUSBOpen(instance,vid_f, "\\MCHP_EP1", MP_READ, 0);
if (myOutPipe == INVALID_HANDLE_VALUE || myInPipe == INVALID_HANDLE_VALUE)
{
MPUSBClose(myOutPipe);
MPUSBClose(myInPipe);
return "Fail GetSN";
}else{
send[0]=4; //GET SERIALn
if (MPUSBWrite(myOutPipe,&send,1,SentDataLength,1000) != 0)
{
if(MPUSBRead(myInPipe,&recv,RecvDataLenght,pLength1,1000) != 0)
{
cadena=&(char)recv[0];
}else{
MPUSBClose(myOutPipe);
MPUSBClose(myInPipe);
return "Fail GetSN_READ";
}
}else{
MPUSBClose(myOutPipe);
MPUSBClose(myInPipe);
return "Fail GetSN_Write";
}
MPUSBClose(myOutPipe);
MPUSBClose(myInPipe);
return cadena;
}
}//end
**************************************************************
*
* Devuelve el Firrmware Version por instancia
*
**************************************************************
PCHAR PICFirmware(DWORD instance)
{
HANDLE myOutPipe, myInPipe;
PDWORD SentDataLength;
DWORD RecvDataLenght;
PDWORD pLength1;
BYTE send[64];
BYTE recv[64];
PCHAR cadena;
PCHAR vid_f;
vid_f=vid_array[instance];
SentDataLength=0;
RecvDataLenght=7;
pLength1=0;
myOutPipe = MPUSBOpen(instance,vid_f, "\\MCHP_EP1", MP_WRITE, 0);
myInPipe = MPUSBOpen(instance,vid_f, "\\MCHP_EP1", MP_READ, 0);
if (myOutPipe == INVALID_HANDLE_VALUE || myInPipe == INVALID_HANDLE_VALUE)
{
MPUSBClose(myOutPipe);
MPUSBClose(myInPipe);
return "Fail GetFirmware";
}else{
send[0]=2; //GET FIRMWARE
if (MPUSBWrite(myOutPipe,&send,1,SentDataLength,1000) != 0)
{
if(MPUSBRead(myInPipe,&recv,RecvDataLenght,pLength1,1000) != 0)
{
cadena=&(char)recv[0];
}else{
MPUSBClose(myOutPipe);
MPUSBClose(myInPipe);
return "Fail GetFirmware";
}
}else{
MPUSBClose(myOutPipe);
MPUSBClose(myInPipe);
return "Fail GetFirmware";
}
MPUSBClose(myOutPipe);
MPUSBClose(myInPipe);
return cadena;
}
}//end
**************************************************************
*
* Graba un Buffer(pData) en un tarjeta por instancia
*
**************************************************************
DWORD PICWrite(DWORD instance,
PVOID pData)
{
HANDLE myOutPipe, myInPipe;
PDWORD SentDataLength;
PCHAR vid_f;
vid_f=vid_array[instance];
SentDataLength=0;
myOutPipe = MPUSBOpen(instance,vid_f, "\\MCHP_EP1", MP_WRITE, 0);
myInPipe = MPUSBOpen(instance,vid_f, "\\MCHP_EP1", MP_READ, 0);
if (myOutPipe == INVALID_HANDLE_VALUE || myInPipe == INVALID_HANDLE_VALUE)
{
MPUSBClose(myOutPipe);
MPUSBClose(myInPipe);
return 2;
}else{
if (MPUSBWrite(myOutPipe,pData,33,SentDataLength,1000) != 0)
{
MPUSBClose(myOutPipe);
MPUSBClose(myInPipe);
return 1;
}else{
MPUSBClose(myOutPipe);
MPUSBClose(myInPipe);
return 0;
}
}
}//end
**************************************************************
*
* Lee un buffer(pDataRad) de una instancia, antes le encia
* el comando.
*
**************************************************************
DWORD PICRead( DWORD instance,
BYTE COMMAND,
PVOID pDataRead)
{
HANDLE myOutPipe, myInPipe;
PDWORD SentDataLength;
DWORD RecvDataLenght;
PDWORD pLength1;
BYTE send[64];
PCHAR cadena;
PCHAR vid_f;
vid_f=vid_array[instance];
SentDataLength=0;
RecvDataLenght=32;
pLength1=0;
myOutPipe = MPUSBOpen(instance,vid_f, "\\MCHP_EP1", MP_WRITE, 0);
myInPipe = MPUSBOpen(instance,vid_f, "\\MCHP_EP1", MP_READ, 0);
if (myOutPipe == INVALID_HANDLE_VALUE || myInPipe == INVALID_HANDLE_VALUE)
{
MPUSBClose(myOutPipe);
MPUSBClose(myInPipe);
return 2;
}else{
send[0]=COMMAND;
if (MPUSBWrite(myOutPipe,&send,1,SentDataLength,10) != 0)
{
if(MPUSBRead(myInPipe,pDataRead,RecvDataLenght,pLength1,10) != 0)
{
MPUSBClose(myOutPipe);
MPUSBClose(myInPipe);
return 1;
}else{
MPUSBClose(myOutPipe);
MPUSBClose(myInPipe);
return 3;
}
}else{
MPUSBClose(myOutPipe);
MPUSBClose(myInPipe);
return 0;
}
}
}//end
Bueno por ahora todo funciona pero mi duda es que no quiero tener que estar preguntando a la tarjeta su serialnumber ni su firmware, yo tengo esa informacion en el descriptor y me gustaria saber como funciona la funcion MPUSBGetDeviceDescriptor, he intentado varias opciones y nada, ademas no he encontrada ninguna información por la red. Muchas gracias de antemano.
Un saludo. Alberto.