Enviar respuesta 
 
Calificación:
  • 0 votos - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Buscar en el tema
como programar puerto USB en c
Autor Mensaje
RACEDO Sin conexión
Empleado de Fotocopiadora
al fin encontre mi veta en la utn
**

Ing. Electrónica
Facultad Regional Córdoba

Mensajes: 42
Agradecimientos dados: 23
Agradecimientos: 3 en 3 posts
Registro en: May 2012
Mensaje: #1
como programar puerto USB en c Dudas y recomendaciones Informática I (Electrónica)
estoy tratando de fabricar un dispositivo para ingresar señales por el puerto usb y como nos enseñaron a programar en c en info 1 quiero ver que sale.

la idea seria esta:
tomar una señal convertirla a digital y con el pic 18F4550 ingresarla por el usb mi probrema seria el mostrar la señal en la pantalla y la creacion de el programa.
:
PD: aceptan todo tipo de comentarios tanto pera el software como para el harware.
gracias thumbup3

28-02-2013 23:55
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] RACEDO recibio 1 Gracias por este post
nicotombino (01-03-2013)
Feer Sin conexión
Presidente del CEIT
win-win
**********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 4.426
Agradecimientos dados: 521
Agradecimientos: 1.675 en 351 posts
Registro en: Apr 2010
Mensaje: #2
RE: como programar puerto USB en c
Te paso unas que iba a usar en mi proyecto de info II
La verdad como después cambie linux por windows no las use y no se si funcionan del todo, abría que probarlas, de todas formas yo esperaría a info II a que te enseñen a programar el puerto...

Saludos!


/**
\file PuertoSerie.c
\brief Programa que controla el puerto serie en linux.
\author
\date
\version 1.0.1
*/

/***************
Includes
***************/

#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>

/***************
Defines
***************/

#define ERROR_OPEN_PORT -1

/**
\fn int serial_open(char *serial_name, speed_t baud)
\brief Abre el puerto serie para lectura/escritura.
\author
\param *serial_name Descriptor del puerto serie.
\param baud Velocidad de trabajo. (constante)
\return fd Devuelve el descriptor del puerto serie (o -1 si ha ocurrido un error).
*/

int serial_open(char *serial_name, speed_t baud)
{
struct termios newtermios; //Estructura donde se setean los parametros del puerto.
int fd; //Descriptor del puerto serie.

//Abro el puerto serie.

fd = open(serial_name,O_RDWR | O_NOCTTY);

//Seteo (configuro) el puerto serie.

newtermios.c_cflag = CBAUD | CS8 | CLOCAL | CREAD;
newtermios.c_iflag = IGNPAR;
newtermios.c_oflag = 0;
newtermios.c_lflag = 0;
newtermios.c_cc[VMIN] = 1;
newtermios.c_cc[VTIME] = 0;

//Seteo la velocidad de trabajo del puerto serie.

cfsetospeed(&newtermios,baud);
cfsetispeed(&newtermios,baud);

//Vacío el buffer de entrada.
if(tcflush(fd,TCIFLUSH) == -1){
return(ERROR_OPEN_PORT);
}
//Vacío el buffer de salida.
if(tcflush(fd,TCOFLUSH) == -1){
return(ERROR_OPEN_PORT);
}
//Configuraciíon del puerto serie.
if(tcsetattr(fd,TCSANOW,&newtermios) == -1){
return(ERROR_OPEN_PORT);
}
//Retorno el descriptor de puerto serie.
return(fd);
}


/**
\fn int serial_read(int serial_fd, char *data, int size, int timeout_usec)
\brief Lee datos del puerto serie
\author
\param serial_fd Descriptor del puerto serie.
\param *data Buffer contenedor de datos recibidos.
\param size Tamaño maximo de datos a recibir.
\param timeout_usec Tiempo maximo para recibir datos.
\return count Devuelve el número de bytes leídos (o 0 si ha ocurrido un timeout).
*/

int serial_read(int serial_fd, char *data, int size, int timeout_usec)
{
fd_set fds;
struct timeval timeout; //Estructura que contiene el tiempo de espera datos.
int count=0; //Controla los datos que ingresan en data.
int ret; //Indico si hay datos a leer.
int n; //Bytes leidos en read()

/*Espera a que llegue un bloque de bytes de tamaño size en el plazo
establecido por timeout_usec. El bloque puede ser recibido en partes.*/

do {

//Set de descriptores del puerto serie.

FD_ZERO(&fds);
FD_SET (serial_fd, &fds);

timeout.tv_sec = 0;
timeout.tv_usec = timeout_usec;

/*Para realizar las lecturas no bloqueantes, En este caso devuelve 1 si hay
datos esperando a ser leídos y 0 si ha ocurrido un timeout. Sin el select()
Quedaría bloqueado esprando a que termine el tiempo o se envie todo el paquete*/

ret = select(FD_SETSIZE, &fds, NULL, NULL, &timeout);

//Si hay datos los lee hasta que acabe el tiempo o lea todos los datos.

if(ret == 1){
n = read(serial_fd, &data[count], size - count);
count = count + n;
data[count] = 0;
}
} while((count < size) && (ret == 1));

//Retorno los bytes leidos.

return(count);
}


/**
\fn void serial_send(int serial_fd, char *data, int size)
\brief Envía una cadena de bytes por el puerto serie
\author
\param serial_fd Descriptor del puerto serie.
\param *data Buffer contenedor de datos a enviar.
\param size Tamaño del array de datos.
*/

void serial_send(int serial_fd, char *data, int size){

write(serial_fd, data, size);
}


/**
\fn void serial_close(int fd)
\brief Cierrar el puerto serie.
\author
\param fd Descriptor de puerto serie.
*/

void serial_close(int fd){

close(fd);
}



[Imagen: digitalizartransparent.png]
01-03-2013 00:04
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] Feer recibio 1 Gracias por este post
nicotombino (01-03-2013)
RACEDO Sin conexión
Empleado de Fotocopiadora
al fin encontre mi veta en la utn
**

Ing. Electrónica
Facultad Regional Córdoba

Mensajes: 42
Agradecimientos dados: 23
Agradecimientos: 3 en 3 posts
Registro en: May 2012
Mensaje: #3
RE: como programar puerto USB en c
gracias feer por el aporte thumbup3


feer leí por ay que hiciste un proyecto para info 1 se puede saver que era!!!

01-03-2013 00:23
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] RACEDO recibio 1 Gracias por este post
nicotombino (01-03-2013)
Feer Sin conexión
Presidente del CEIT
win-win
**********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 4.426
Agradecimientos dados: 521
Agradecimientos: 1.675 en 351 posts
Registro en: Apr 2010
Mensaje: #4
RE: como programar puerto USB en c
Era un soft para la biblioteca de la facu pero con los libros compartidos vos podías reservar tanto desde medrano como de campus todo iba a parar a un servidor (todo por internet y múltiple clientes)
Tenias que ingresar al sistema como usuario o como root y según como accedias tenías distintas opciones, tenia un archivo de configuración, uno de usuarios, uno de libros y las claves las encriptaba con rot13.
Estaba bueno como llevar info un poco mas a "la realidad"

Mira si tenes tiempo de armar algo te lo recomiendo es hermoso ver algo "grande" andando desde el primer año que entras a la facu =)

[Imagen: digitalizartransparent.png]
01-03-2013 02:33
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] Feer recibio 2 Gracias por este post
nicotombino (01-03-2013), RACEDO (01-03-2013)
RACEDO Sin conexión
Empleado de Fotocopiadora
al fin encontre mi veta en la utn
**

Ing. Electrónica
Facultad Regional Córdoba

Mensajes: 42
Agradecimientos dados: 23
Agradecimientos: 3 en 3 posts
Registro en: May 2012
Mensaje: #5
RE: como programar puerto USB en c
acá en la FRC en info 2 podes hacer un proyecto pero no debe ser enteramente software o enteramente de harware deve ser mitad y mitad.

por ejemplo vi maquinas cnc programadas en c++ y brazos roboticos y boludeces como esas pero no te aprueban si lo haces enteramente de harware o software.


de por casualidad tendrias informacion de como se programa la placa de sonido de la pc en c


gracias buena onda thumbup3

a muy bueno tu proyecto de info 1 de seguro te costo mucho hacerlo andar y debes aver aprendido muchísimo en el intento te felicito. ;) =)


cual fue la nota que te pusieron un diez me imagino =)

(Este mensaje fue modificado por última vez en: 01-03-2013 15:57 por RACEDO.)
01-03-2013 15:44
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Feer Sin conexión
Presidente del CEIT
win-win
**********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 4.426
Agradecimientos dados: 521
Agradecimientos: 1.675 en 351 posts
Registro en: Apr 2010
Mensaje: #6
RE: como programar puerto USB en c
(01-03-2013 15:44)RACEDO escribió:  acá en la FRC en info 2 podes hacer un proyecto pero no debe ser enteramente software o enteramente de harware deve ser mitad y mitad.

por ejemplo vi maquinas cnc programadas en c++ y brazos roboticos y boludeces como esas pero no te aprueban si lo haces enteramente de harware o software.


de por casualidad tendrias informacion de como se programa la placa de sonido de la pc en c


gracias buena onda thumbup3

a muy bueno tu proyecto de info 1 de seguro te costo mucho hacerlo andar y debes aver aprendido muchísimo en el intento te felicito. ;) =)


cual fue la nota que te pusieron un diez me imagino =)

Me puso un 9, me faltaba hacer el makefile para no tener que poner nombre por nombre las funciones para compilar y eran como 50 archivos XD

Si te adjunto el .c de la placa (NO HECHO POR MI) pero funciona.
En info II el proyecto tiene hw y soft =)



/**
***************************************************************
\details
* "Departamento de Electrónica, FRBA, UTN"
* Programa ejemplo de manejo de audio en la PC sobre Linux (obvio).
* Objetivo: Aprender a programar el dispositivo de audio de la PC sobre Linux. Acceder a su configuración.
* Adicional: ver /usr/src/linux/include/linux/soundcard.h
\author Alejandro Furfaro
\date 2011.08.08
\version 1.0.0
***************************************************************
*/

#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <linux/soundcard.h>

/* segundos de audio a grabar */
#define LENGTH 1
/* sampling rate = velocidad de muestreo del audio a la entrada*/
#define RATE 8000
/* sample size = Tamaño de muestra. Típicamente 8 o 16 bits */
#define SIZE 8
/* 1 = mono 2 = stereo */
#define CHANNELS 1

/**
*******************************************************************************
\fn void set_audio_params (int fd)
\details Se encarga de establecer los valores de velocidad de muestreo (Sampling Rate) Sample Size (tamaño de la muestra), y número de canales, en la placa de audio del sistema.
Utilza la syscall ioctl (), (input output control), para acceder al dispositivo mediante el formato establecido por la interfaz de sonido de LNUX, y el formato genérico de ioctl (file_descriptor, nombre del parámetro, puntero al valor a escribir);
\author Alejandro Furfaro
\date 2011.05.08
*/

void set_audio_params (int fd)
{
int arg; /* argumento para ioctl */
int status; /* salida de ioctl */

/* seteamos los parametros de muestreo */
arg = SIZE; /* arg = Tamaño de muestra */
status = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
/* SOUND_PCM_WRITE_BITS es la macro que escribe en la placa de sonido (a través del driver por supuesto), el valor del tamaño de muestra en bits que seteamos en la variable arg, cuyo puntero se provee como tercer argumento a ioctl().
La interfaz genérica de audio manejada por streams traduce comandos generales a los comandos particulares para el hardware de modo transparente al programador */
if (status == -1)
perror("Error con comando SOUND_PCM_WRITE_BITS");
/* El hecho que ioctl devuelva error no quiere decir que no se haya configurado el parámetro que se quiso programar.*/
if (arg != SIZE)
/* Por lo general la variable pasada por referencia vuelve con el valor programado si el original no estaba entre los posibles valores del parámetro que se quiso configurar. Por ejemplo, Tamaño de muestra: si arg hubiese ido en un valor por ejemplo 13, o 15, seguramente no coicidiría con los valores posibles para configurar el conversor A/D de la placa de sonido.
En tal caso el driver programa al valor mas cercano al argumento recibido,modifica la variable recibda como referencia al valor, para que el programa que lo envió pueda saber el valor con el que se configuró, y hace que la función devuelva -1, para que se pueda analizar el error y tomar nota del valor configurado finalmente. */
fprintf (stderr,"Tamaño de muestras no soportado. Se programó %d\n",arg);

arg = CHANNELS; /* mono o stereo */
status = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &arg);
if (status == -1)
perror("Error en comando SOUND_PCM_WRITE_CHANNELS");
if (arg != CHANNELS)
fprintf (stderr,"Cantidad de canales no soportado. Se programó %d\n",arg);

arg = RATE; /* Velocidad de Muestreo */
status = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);
if (status == -1)
perror("Error en comando SOUND_PCM_WRITE_RATE");
if (arg != RATE)
fprintf (stderr,"Velocidad de muestreo no soportada. Se programó %d\n",arg);

return;
}

int main()
{
int fd; /* sound device file descriptor */
int status; /* return status de system calls */

/* bufer para el audio */
unsigned char buf[LENGTH*RATE*SIZE*CHANNELS/8];
// unsigned char buf[16];
/* abrimos el dispositivo de audio*/
if ((fd = open("/dev/dsp", O_RDWR))<0)
{
fprintf(stderr,"Error en función open, Código de error: %s\n",strerror (fd));
exit(1);
}
/*Seteamos parámetros de audio*/
set_audio_params (fd);

while (1)
{ /* termina con Control-C */
printf("Hablale al microfono ;):\n");

/*La siguiente función bloquea al proceso hasta que se llene el buffer. Esto con archivos comunes no se nota, pero con un dispositivo de audio en donde se leen 8000 muestras por segundo.....*/
status = read(fd, buf, sizeof(buf)); /* lee */

if (status != sizeof(buf))
{
fprintf(stderr,"Error en función read, Código de error: %s\n",strerror (status));
exit (1);
}
printf("Dijiste :\n");

/* Write generalmente no bloquea hasta wue termina. Sino que envía la información presente en el buffer al kernel. Por eso luego de enviar, vamos a sincronizar con ioctl ()*/
status = write(fd, buf, sizeof(buf)); /* reproduce */
if (status != sizeof(buf))
{
fprintf(stderr,"Error en función write, Código de error: %s\n",strerror (status));
}

/* Espera a que termine de hacer el playback antes de volver a grabar */
status = ioctl(fd, SOUND_PCM_SYNC, 0);
if (status == -1)
perror("Error en comando SOUND_PCM_SYNC");
}
}



Este me lo paso el profesor para leer por si me lo tomaban en el final xd

[Imagen: digitalizartransparent.png]
01-03-2013 16:04
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] Feer recibio 1 Gracias por este post
RACEDO (01-03-2013)
RACEDO Sin conexión
Empleado de Fotocopiadora
al fin encontre mi veta en la utn
**

Ing. Electrónica
Facultad Regional Córdoba

Mensajes: 42
Agradecimientos dados: 23
Agradecimientos: 3 en 3 posts
Registro en: May 2012
Mensaje: #7
RE: como programar puerto USB en c
te agradezco el aporte me sirve de mucho y de socket tenes algo de informacion , por el foro encontre la guia beej que esta muy buena pero parece que no alcanza gracias =)


PD: perdon por las preguntas.


PD2: es que aca en la FRC no hay mucha gente que estudie electronica y creo que soy el unico de esta regional que jode en este foro lol

01-03-2013 18:03
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Feer Sin conexión
Presidente del CEIT
win-win
**********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 4.426
Agradecimientos dados: 521
Agradecimientos: 1.675 en 351 posts
Registro en: Apr 2010
Mensaje: #8
RE: como programar puerto USB en c
En realidad socket es la guía beej nomas xddd, de eso te debo ejercicios, tenía por algún lado pero ahora no lo encuentro...
Pero fijate que en una de las páginas hay un cliente servidor que funciona, yo aprendí con ese ejemplo y preguntando a amigos de la facu de sistemas jaja.

[Imagen: digitalizartransparent.png]
01-03-2013 19:09
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
pablo.m Sin conexión
Campeon del cubo Rubik
Sin estado :(
****

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 140
Agradecimientos dados: 13
Agradecimientos: 40 en 22 posts
Registro en: Apr 2011
Mensaje: #9
RE: como programar puerto USB en c
No quiero ser ortiba pero ese código no es para USB, es para puerto serie. Si lo necesitás para el proyecto de Info 2 el serie te va a servir. La contra es que es difícil encontrar ese puerto en máquinas medianamente nuevas. Una opción es comprar un cable USB-serie, pero tiene que ser uno de marca, por experiencia propia no te recomiendo que te compres los genéricos chinos porque son una mierda. El que compré (y después devolví) no era compatible con el propio driver que venía incluido!!!
02-03-2013 00:08
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Marianotronico Sin conexión
Militante
Siniestrado :(
***

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 92
Agradecimientos dados: 0
Agradecimientos: 1 en 1 posts
Registro en: Apr 2011
Mensaje: #10
RE: como programar puerto USB en c
Que loco que les tomen hard.... aca se supone que uno todavia "no sabe" hard... asi que eso no te lo pueden calificar
02-03-2013 00:21
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
John_Doe* Sin conexión
Campeon del cubo Rubik
Steampowered
****

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 167
Agradecimientos dados: 8
Agradecimientos: 24 en 17 posts
Registro en: Dec 2012
Mensaje: #11
RE: como programar puerto USB en c
Si necesitas un cable USB a serial port te comento (si vivis por capital federal) por los boliches de parana hay varias casas de electronica que te pueden vender.

Uno que se recomienda mucho es el manhattan pero si mal no recuerdo andaba por los 90 pesos (y te hablo de un precio antiguo, hara 2 años atras).
Yo use un generico USB a RS-232 que me anduvo barbaro, lo use con un microcontrolador. Lo que te importa realmente es que te vengan los drivers, lo que te tengo que advertir es que seguramente estan orientados a entorno windows. Pero si buscas en internet calculo que algun driver para linux debe haber.
Lo que te tenes que asegurar es que este apto para recibir y enviar, porque andan vendiendo algunos orientados a impresoras que solo reciben. Es un fiasco que me paso por inexperto.

Me paso una unica vez que tuve que seleccionar la IRQ a la cual debia referirse, pero debio de haber sido un caso muy particular. En cualquier caso tomalo como una sugerencia lo que te dijeron arriba, en todo caso lo tendras que utilizar en windows por si no hay nada orientado a linux.

Con respecto a codigo USB, en estos dias me fijo si encuentro algo porque si no me falla la memoria algo habia encontrado para usar. E incluso tenia el diseño de una plaquita bastante sencilla.

OFF: Lo que si tengo a mano es codigo en assembly sobre manejo de puertos USB, serial y paralelo como asi sugerencias y algunas FAQs de una pagina que use durante un tiempo cuando tuve que aprender ASM. NO es lo mismo que C, pero creo que podria servirte como mucho la idea o el contexto.
02-03-2013 01:31
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Feer Sin conexión
Presidente del CEIT
win-win
**********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 4.426
Agradecimientos dados: 521
Agradecimientos: 1.675 en 351 posts
Registro en: Apr 2010
Mensaje: #12
RE: como programar puerto USB en c
(02-03-2013 00:08)pablo.m escribió:  No quiero ser ortiba pero ese código no es para USB, es para puerto serie. Si lo necesitás para el proyecto de Info 2 el serie te va a servir. La contra es que es difícil encontrar ese puerto en máquinas medianamente nuevas. Una opción es comprar un cable USB-serie, pero tiene que ser uno de marca, por experiencia propia no te recomiendo que te compres los genéricos chinos porque son una mierda. El que compré (y después devolví) no era compatible con el propio driver que venía incluido!!!


Si me colgue mal jajaja, pero como vi que le servía la deje pasar jajajajajajaja.
Fue sin querer thumbup3

[Imagen: digitalizartransparent.png]
02-03-2013 01:53
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
RACEDO Sin conexión
Empleado de Fotocopiadora
al fin encontre mi veta en la utn
**

Ing. Electrónica
Facultad Regional Córdoba

Mensajes: 42
Agradecimientos dados: 23
Agradecimientos: 3 en 3 posts
Registro en: May 2012
Mensaje: #13
RE: como programar puerto USB en c
gracias por las recomendaciones
Cita:Si me colgue mal jajaja, pero como vi que le servía la deje pasar jajajajajajaja.
Fue sin querer

no te colgaste todo sirve
Cita: La contra es que es difícil encontrar ese puerto en máquinas medianamente nuevas. Una opción es comprar un cable USB-serie, pero tiene que ser uno de marca, por experiencia propia no te recomiendo que te compres los genéricos chinos porque son una mierda. El que compré (y después devolví) no era compatible con el propio driver que venía incluido!!!

si tengo una netbook y solo tiene puerto usb

Cita:Con respecto a codigo USB, en estos dias me fijo si encuentro algo porque si no me falla la memoria algo habia encontrado para usar. E incluso tenia el diseño de una plaquita bastante sencilla.
si me re sirve al menos para probar con un prototipo

02-03-2013 21:00
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
John_Doe* Sin conexión
Campeon del cubo Rubik
Steampowered
****

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 167
Agradecimientos dados: 8
Agradecimientos: 24 en 17 posts
Registro en: Dec 2012
Mensaje: #14
RE: como programar puerto USB en c
Disculpa por la demora, una vez mas estoy sin PC de escritorio.

La pagina que te decia no la encuentro, (hace dos años que la use asi que te la debo). Encontre un par de paginas con un par de PCBs pero te suman integrados y un par de micros. Personalmente no tiene sentido armar una placa con tantas vueltas si con un cable lo podes hacer tranquilamente.
Pense que me habia sobrevivido la pagina guardada en favoritos, aunque veo que algo paso porque no la tengo.

Por otra parte con PICs no tengo nada de practica, calculo que es lo mismo que programar con cualquier otro programador pero solamente tengo ejemplos con la serie de atmel.

Si queres podes buscar proyectos en paginas como 8052.com o en 8051projects.com pero estan orientados a atmel. Hay programadores con USB pero no creo que te pueda ayudar mucho.
04-03-2013 22:14
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Buscar en el tema
Enviar respuesta 




Usuario(s) navegando en este tema: 1 invitado(s)



    This forum uses Lukasz Tkacz MyBB addons.