TODOPIC
Lenguajes de programación para PC => C, C#, C++ => Mensaje iniciado por: micro_pepe en 07 de Enero de 2015, 16:28:46
-
A ver si me esplico bien, encontré un ejemplo de control del puerto usb con un pic y c# que funciona, tengo la dll que agrego a referencias, pero en el ejemplo en c# el puerto viene como un componente en el formulario, es como el clasico timer que lo arrastras al formulario desde el cuadro de herramientas. La pregunta es ¿puedo generar el elemento en el cuadro de herramientas a partir de la dll? o ¿es posible definirlo "a pelo" de alguna forma?
A la hora de hacer proyectos nuevos me obligaria a partir siempre del mismo ejemplo, e ir modificando siempre sobre el.
Dejo adjunto el susodicho programa en c# para vs2010.
Saludos!!!
Edito: Dejo tambien el codigo del pic (bajado del subforo RTOS).
-
Pues... era tan facil como arrastrar la dll de una carpeta a la barra de herramientas del IDE :mrgreen: :mrgreen:
Saludos!!!
-
Pues... era tan facil como arrastrar la dll de una carpeta a la barra de herramientas del IDE :mrgreen: :mrgreen:
Saludos!!!
Todo mi gozo en un pozo, esta dll tiene licencia, segun estaba desarrollando el código en C# me aparece de vez en cuando una ventanita indicando que hay que comprar licencia :( imagino que en un tiempo dejará de funcionar.
Conoceis alguna otra dll gratuita para USB que funcione en VS 2010 con c# ???
Saludos!!!
-
Ando un poco lejos de este tema del USB, en su momento lo tenia mas fresco :oops:
Estas usando la dll que provee microchip en su framework?
Aunque la de microchip creo que es para VC++ y trae un ejemplo en Visual C++ 2008
-
A ver si me esplico bien, encontré un ejemplo de control del puerto usb con un pic y c# que funciona, tengo la dll que agrego a referencias, pero en el ejemplo en c# el puerto viene como un componente en el formulario, es como el clasico timer que lo arrastras al formulario desde el cuadro de herramientas. La pregunta es ¿puedo generar el elemento en el cuadro de herramientas a partir de la dll? o ¿es posible definirlo "a pelo" de alguna forma?
A la hora de hacer proyectos nuevos me obligaria a partir siempre del mismo ejemplo, e ir modificando siempre sobre el.
Dejo adjunto el susodicho programa en c# para vs2010.
Saludos!!!
Edito: Dejo tambien el codigo del pic (bajado del subforo RTOS).
Hola.
¿Cual es la DLL a que te referis ?
Dll con cartel ---> debug ----> ver si es posible jmp ---> chau cartel !!!! :-)
...o algo parecido .. :-)
Saludos.
-
Hola Pepe
Si necesitas usar USB en un PIC en modo CDC (puerto serial virtual - COM), ya no necesitas la DLL.
http://migsantiago.com/index.php?option=com_content&view=article&id=29:pic-puerto-serial-por-usb-cdc&catid=1:tutorial&Itemid=23
Si aún necesitas la DLL, Microchip provee una DLL para USB HID y otra para USB en modo Bulk.
Ambas vienen en el Microchip Application Libraries y sin gratis, incluyendo su código fuente. Saludos.
-
Quiero hacerlo con HID, me he descargado el "Microchip Application Libraries" pero el ejemplo que viene para c# es para VS2005, y yo uso el 2010. Lo he abierto pero no funciona bien, reconoce el pic18f4550 que estoy usando pero no envia datos del pc al pic.
-
Una cosa, con CDC la forma de funcionar es como si usase un FT232 o similar no?
Al conectar el pic al puerto usb me crea un com virtual, tendria que conectarme a ese puerto com virtual, y la programación en c# sería como si fuese un puerto serie RS232, es correcto??
Saludos!!!
-
Si, es correcto. Igual deberías poder utilizar la librería de Microchip para HID, Bulk e Isócrono.
Saludos.
-
Quiero hacerlo con HID, me he descargado el "Microchip Application Libraries" pero el ejemplo que viene para c# es para VS2005, y yo uso el 2010. Lo he abierto pero no funciona bien, reconoce el pic18f4550 que estoy usando pero no envia datos del pc al pic.
Así es, hay un issue con VC# y un SO de 64 bits. Si tienes un Windows de 64 bits, debes corregir la forma de compilar del HID a 32 bits para que funcione. Yo usé las MAL y funciona de 10. Si es el caso, avísame y te explico cómo repararlo.
A mí me encantan los dispositivos HID por su constancia, repetitividad y velocidad constante.
Una cosa, con CDC la forma de funcionar es como si usase un FT232 o similar no?
Al conectar el pic al puerto usb me crea un com virtual, tendria que conectarme a ese puerto com virtual, y la programación en c# sería como si fuese un puerto serie RS232, es correcto??
Saludos!!!
Sí, te olvidas de toda DLL y cosas del otro mundo. Tú usa el COM como mejor te convenga con el lenguaje que prefieras. Es la clase USB más fácil de usar a nivel PC, pero la menos confiable en cuanto a velocidad y ancho de banda.
-
Quiero hacerlo con HID, me he descargado el "Microchip Application Libraries" pero el ejemplo que viene para c# es para VS2005, y yo uso el 2010. Lo he abierto pero no funciona bien, reconoce el pic18f4550 que estoy usando pero no envia datos del pc al pic.
Así es, hay un issue con VC# y un SO de 64 bits. Si tienes un Windows de 64 bits, debes corregir la forma de compilar del HID a 32 bits para que funcione. Yo usé las MAL y funciona de 10. Si es el caso, avísame y te explico cómo repararlo.
Eso es justo lo que me ocurre, uso Win7 de 64bits, y si no me equivoco es el mismo error que me dió otro ejemplo que encontré por la red con otra dll.
El HID es lo mejor, con CDC es un poco latoso el tener que seleccionar el puerto COM, más lento y menos fiable.
Saludos!!!
-
OK. Debes configurar tu C# para compilar en modo x86 (32 bits) ya que las DLL encargadas de HID en Windows siguen siendo de 32 bits.
Ve a Tools, Options y activa la opción de Show advanced build configurations.
Te aparecerá la barrita que adjunto. Juega con la configuración para activar el modo x86. Eso debe ser todo.
-
Muchas gracias migsantiago!!!
lamentablemente no es ese el error... tengo un .hex de un proyecto que encontré con el que el ejemplo de microchip para C# envia datos PC-->PIC, he visto al depurar que las funciones que envian datos devuelven verdadero, estas:
WriteFile(WriteHandleToUSBDevice, OUTBuffer, 65, ref BytesWritten, IntPtr.Zero)
Sin embargo cuando conecto mi firmware en CCS, retornan false. En ambos casos el PIC lo reconoce como conectado al puerto USB.
Dejo adjunto el firmware en CCS, no veo que puede estar mal... con el ejemplo en c# de pago funciona, será que no hace buenas migas con microchip.
Saludos!!!
-
Seguro es algo por aquí...
- el tamaño de los endpoints (64)
- PID y VID que espera la librería de Microchip 0x04d8 y 0x0033 según recuerdo
No hay mucha diferencia entre la Express Edition y la completa en C# en cuanto a la compilación de la DLL de HID. Checa los descriptores HID de tu PIC, algo anda chueco.
-
Seguro es algo por aquí...
- el tamaño de los endpoints (64)
- PID y VID que espera la librería de Microchip 0x04d8 y 0x0033 según recuerdo
No hay mucha diferencia entre la Express Edition y la completa en C# en cuanto a la compilación de la DLL de HID. Checa los descriptores HID de tu PIC, algo anda chueco.
Es correcto el valor de 65, siempre y cuando en el descriptor HID se esté utilizando Report IDs.
Puede que el motivo por el cual falla el envío sea la primera ley del USB:
"TODAS las transacciones son iniciadas por el Host"
En tu caso el Host es la PC. Si la PC no abre y espera datos, el device no puede enviarlos sin su permiso. El device siempre trabaja por polling. Necesitas asegurarte que el software de PC esté conectándose al endpoint y enviando los request de lectura para que el dispositivo pueda enviar info a la PC.
Saludos.
-
Hola Bruno
Es que tiene una configuración diferente...
#define USB_CONFIG_HID_TX_SIZE 32
#define USB_CONFIG_HID_RX_SIZE 32
Y la HID de Microchip espera 64. Sí, los 65 están bien, el primero siempre debe ser el report ID.
-
Muchas gracias chicos!!!
os comento los cambios que hice para que funcione:
- Poner en el firmware CCS todo en 64 bit.
- Poner el VID y el PID del firmware con los valores que trae el ejemplo c# de micrchip "Vid_04d8&Pid_003f", anteriormente lo que hice fué la inversa, cambié en c# lo que tenia en el PIC.
Lo dejo adjunto por si le sirve a alguien.
Ahora que sé por donde van los tiros intentaré cambiar otro ejemplo que encontré por tener el código más claro, el de Microchip es un poco "sucio", es más facil de desarrollar el otro.
Saludos!!!
-
Muy bien Pepe. :mrgreen:
Un detalle, no son 64 bits, son 64 bytes. Cada reporte HID en USB2.0 puede cargar hasta 64 bytes (más el report ID que en custom no se usa).
-
Muy bien Pepe. :mrgreen:
Un detalle, no son 64 bits, son 64 bytes. Cada reporte HID en USB2.0 puede cargar hasta 64 bytes (más el report ID que en custom no se usa).
OK.
Un par de cosas más, a la hora de instalar el driver, en win7 se hace de forma automática normalmente, salvo que falle, en caso de fallar o en otro sistema operativo como XP ¿que driver instalo? El de microchip del "Microchip Application Libraries" de la ruta: "C:\Microchip Solutions v2012-08-22\USB\Tools\MCHPUSB Custom Driver" ?
Y, el identificador que se pone intercalando ceros y comas ¿Es solo un letrero en la ventana de instalación del driver?
Por ultimo decir que lo que comentó migsantiago de compilar con la versión de 32bit (x86) es necesario a demás de los otros cambios que comenté.
Saludos!!!
-
Pepe, la magia de HID es que todo sistema operativo completo está obligado a enumerarlo con los drivers estándar (Windows, Linux, Mac). Es como la clase MSD... nunca debes necesitar un driver ajeno a los del SO para echarlas a andar. El custom driver que mencionas debe ser para el modo Bulk. HID es plug-and-play real.
¿Cuál identificador? :o
-
Pepe, la magia de HID es que todo sistema operativo completo está obligado a enumerarlo con los drivers estándar (Windows, Linux, Mac). Es como la clase MSD... nunca debes necesitar un driver ajeno a los del SO para echarlas a andar. El custom driver que mencionas debe ser para el modo Bulk. HID es plug-and-play real.
OK ;-)
¿Cuál identificador? :o
Me refiero a esta parte del fichero de cabecera "usb_desc_hid.h":
char const USB_STRING_DESC[]={
//string 0
4, //length of string index
USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
0x09,0x04, //Microsoft Defined for US-English
//string 1
8, //length of string index
USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
'C',0,
'C',0,
'S',0,
//string 2
26, //length of string index
USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
'C',0,
'C',0,
'S',0,
' ',0,
'H',0,
'I',0,
'D',0,
' ',0,
'D',0,
'e',0,
'm',0,
'o',0
};
Saludos!!!
-
Ah ya!
Ese texto sale en tu Device Manager de Windows y así es como el PIC se presenta a sí mismo ante el mundo. Es su nombre de pila jeje
Lleva los ceros porque es texto Unicode o UTF, no recuerdo, y los chars pesan 2 bytes en esa codificación. Es así para soportar caracteres internacionales.
Puedes cambiarlo, pero deberás recalcular el tamaño del string y modificar los descriptores para que Windows lo recupere correctamente.
-
si aun necesitas me avisas tengo un documento de moyano, comunicacion usb hid, yo lo use en C# 2010 y me funciona bien, pero al parecer solo funciona con sistemas de 32 bytes.
-
si aun necesitas me avisas tengo un documento de moyano, comunicacion usb hid, yo lo use en C# 2010 y me funciona bien, pero al parecer solo funciona con sistemas de 32 bytes.
Gracias, ya tengo un ejemplo funcionando, pero si no ocupa mucho cuelgalo por aquí.
Saludos!!!
-
Caramba! Ustedes son unos cracks! Tuve que leer el hilo dos veces... detenidamente.
Gracias chicos por compartir.
-
Hola micro_Pepe, se que el hilo es viejo y ya no te servira, pero creo que te interesara saberlo.
es un poco latoso el tener que seleccionar el puerto COM, más lento y menos fiable
Yo he hecho muchos programas en C# y cdc, pero me molestaba al igual que a ti tener que seleccionar el puerto com.
Así que desarrolle un programa, con ayuda de captura de excepciones que secuencialmente en el evento de abrir el programa, en el de abrir el formulario hijo, o al darle a un boton conectar, pregunta a todos los puertos com disponibles en el ordenador, el puerto que no responde nada es capturado por la excepción y pasa al siguiente, así hasta que pregunta al que tiene tu maquina y este le responde el mensaje esperado.
De esta manera tu maquina se conecta automáticamente y totalmente transparente al puerto COM correcto nada mas enchufar el USB.
Así tienes la ventaja de la facilidad del USB cdc y lo rápido y sencillo de conectar del hid.
Un saludo.
-
Hola micro_Pepe, se que el hilo es viejo y ya no te servira, pero creo que te interesara saberlo.
es un poco latoso el tener que seleccionar el puerto COM, más lento y menos fiable
Yo he hecho muchos programas en C# y cdc, pero me molestaba al igual que a ti tener que seleccionar el puerto com.
Así que desarrolle un programa, con ayuda de captura de excepciones que secuencialmente en el evento de abrir el programa, en el de abrir el formulario hijo, o al darle a un boton conectar, pregunta a todos los puertos com disponibles en el ordenador, el puerto que no responde nada es capturado por la excepción y pasa al siguiente, así hasta que pregunta al que tiene tu maquina y este le responde el mensaje esperado.
De esta manera tu maquina se conecta automáticamente y totalmente transparente al puerto COM correcto nada mas enchufar el USB.
Así tienes la ventaja de la facilidad del USB cdc y lo rápido y sencillo de conectar del hid.
Un saludo.
OK, lo tendré en cuenta para un proximo invento :) la verdad es que esta forma es mucho más facil de programar.
Saludos!!!