Hola a todos
A ver si me podeis echar un cable, que llevo toda la mañana probadno y mirando cosas, y he llegado a la conclusion de que hago las cosas como la han hecho otros y a mi no me funciona del todo bien. Me explico:
Uso pic18f4550 y me comunico por usb con el pc. En el pc uso Linux, y la libreria libusb. La parte del pic la tengo lista, con el driver para transmision BULK, el pc me enumera correctamente el dispositivo y el main reducido del pic es:
char envia[3];
strcpy(envia,"con");
while(1)
{
usb_task();
usb_debug_task();
if(usb_enumerated()) //Devuelve 1 si el dispositivo fue enumerado correctamente
{
Apaga(LEDROJO);
Enciende(LEDVERDE);
if(usb_kbhit(1)) //Devuelve 1 se hay un nuevo dato en buffer de recepcion
{
printf("Tengo datos\n\r");
i=usb_get_packet(1, recibe, 3); //cojemos el paquete de tamaño 3bytes del EP1 y almacenamos en recibe
printf("%d\n\r",i);
usb_put_packet(1, envia, 3, USB_DTS_TOGGLE); //enviamos el paquete de tamaño 3byte del EP1 al PC
}
}
Los printf es para ver por el puerto serie por donde se va metiendo.
En el pc el programa quitando lo de conectarse y demas y restringiendonos al envio de datos el codigo es:
char envio[3];
char respuesta[3];
strcpy(envio,"con");
if (usb_bulk_write(usb_handle,1,envio,3,200)<0)
{
sprintf(errormsg,"Fallo al ejecutar usb_bulk_write. \n");
return -1;
}
if (usb_bulk_read(usb_handle,1,respuesta,3,100)<0)
{
sprintf(errormsg,"Fallo al ejecutar usb_bulk_read. \n");
return -2;
}
Como veis es la mayor tonteria del mundo, pero es para probar. Envio 3 bytes del PC ("con") y el pic los lee, y me envia 3 bytes tb (con lo mismo), el pc lee esos 3 bytes y luego los imprime.
Resultado, cuando ejecuto el programa, envio correctamente, ya que por el puerto serie recibo:
Tengo datos (esta bien, usb_kbhit me devuelve 1)
3 (bien ya que imprimo los bytes que el recibido y desde el pc he enviado 3)
Y luego el pic envia sus 3 bytes, y en el pc los recibo y hago printf de lo recibido y me escribe en pantalla:
con
Y direis, pues esta bien y no falla, y es verdad. Funciona perfecto, pero solo la PRIMERA vez. Si ha continuacion vuelvo a ejecutar el programa (sin resetear pic ni nada) ya no funciona!!!!. Y pasa que usb_bulk_write no da fallo (si no imprimiria su error) y el que da fallo es usb_bulk_read ya que me imprime : Fallo al ejecutar usb_bulk_read. En el pic resulta que no recibo nada (como? si usb_bulk_write no ha fallado....) porque por el peurto serie no recibo lo de Tengo datos. Es decir, se queda en el bucle while y entra en el if de usb_enumerated, pero nunca entra en el if de usb_kbhit.
Se que es un poco rollo lo que conte, no se si entendisteis algo, lo que sea preguntar y trato de explicarme mejor, pero el resumen es: funciona solo la primera vez, y ya nunca mas hasta que reseteo el pic, entonces vuelve a funcionar la primera vez y otra vez deja de ir hasta resetear.
Gracias de antemano y saludos