Autor Tema: Recibir String por USB y convertirlo a entero  (Leído 3031 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado poi5on

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 127
Recibir String por USB y convertirlo a entero
« en: 11 de Marzo de 2011, 13:01:48 »
Hola amigos, actualmente me encuentro desarrollando un proyecto de un CNC con visión de maquina apoyado en MatLab usando redes neuronales y ahora estoy atorado en la recepción de los datos de las coordenadas.
Estoy usando el 18F4550 con conexión USB en modo CDC para crear un puerto serial que vea el Matlab y envíe los datos por allí, para eso hice un programa de prueba que recibe el dato, lo convierte a entero y envía de vuelta la variable entera recibida, el problema es que cuando recibo un numero por ejemplo "134" correspondiente a una coordenada el PIC guarda los números por separado en la variable y me envía "1" "3" "4", no logro hacer que el numero completo se guarde en la variable en cuestión. Espero la ayuda que me puedan prestar para terminar mi proyecto
Código: [Seleccionar]
signed long coordx[100],coordy[100],valor;
char dato[10],letra;
void main()
{
   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   setup_oscillator(False);
   
   usb_cdc_init(); // Configuramos al puerto virtual.
   usb_init(); // Inicializamos el stack USB.
   while(!usb_cdc_connected()) {}
   // espera a detectar una transmisión de la PC (Set_Line_Coding).
   do{
      usb_task();
      if (usb_enumerated()){
      output_high(pin_b0);
      // Espera a que el dispositivo sea enumerado por el host.
         if(usb_cdc_kbhit()){ // En espera de nuevos caracteres en el buffer de recepción.
            printf(usb_cdc_putc, "Recibido: ");
            dato=usb_cdc_getc();
            valor=strtol(dato,&letra,10);
            printf(usb_cdc_putc,"%Ld\n",valor);
            }
         }
       output_low(pin_b0);
       }while (TRUE); // bucle infinito.
}

Saludos

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Recibir String por USB y convertirlo a entero
« Respuesta #1 en: 11 de Marzo de 2011, 13:10:37 »
Hola, si usas la función usb_cdc_getc recibis de a un caracter, deberá existir una función para recibir un string.

Saludos !


Desconectado Maxtronic

  • PIC10
  • *
  • Mensajes: 27
Re: Recibir String por USB y convertirlo a entero
« Respuesta #2 en: 11 de Marzo de 2011, 13:32:10 »
Leyendo el tema me dije que avanzado esta ese proyecto es de peso, domina los micros pero con ese problema que tiene me da entender no.
primero se toma la ultima letra se le resta 0x30 y va a una variable y la segunda letra tarmbien lo mismo pero se multiplica por 10 y la tercera por 100.
Algo asi
valor[3]
variable=(valor[0]-0x30)*100+(valor[1]-0x30)*10+(valor[2]-0x30)

Desconectado poi5on

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 127
Re: Recibir String por USB y convertirlo a entero
« Respuesta #3 en: 11 de Marzo de 2011, 13:57:38 »
Hola, gracias por sus respuestas. tengo tiempo trabajando con micro pero nunca me habia metido con el USB de los PICs! si yo tomo esta solución:
Citar
valor[3]
variable=(valor[0]-0x30)*100+(valor[1]-0x30)*10+(valor[2]-0x30)

Que pasa si el número que viene es negativo?, ademas si el valor solo tiene dos digitos voy a tener problemas cuando se le reste el -0x30. El matlab me va a enviar coordenas xy que el pic no conoce, solo las lee y mueve el cnc para que haga la figura.

Alguien conoce alguna función que lea el bufer completo?

Saludos

Desconectado Maxtronic

  • PIC10
  • *
  • Mensajes: 27
Re: Recibir String por USB y convertirlo a entero
« Respuesta #4 en: 11 de Marzo de 2011, 19:28:27 »
Ese ejemplo lo basico para que hagas un funcion.
si llega menos o mas digitos bueno hay un contador de llegada de datos.
Si es negativo los numeros estas entre 0x30-0x39 y el signo menos es 0x2D con eso al final lo multiplicas por -1.
Supogamos que envias I-96F o I120F la "I" indica el inicio de llegada y el "F" el fin de la trama.
El contador de solo cuenta los numeros que estan entre 0x30-0x39 al inicio hay un identificador de signo.
supestamente la recepcion por uart sea por interrupcion.

Cuando ejecutar es uno hay una funcion que lo transforma a decimal y despues pone a ceros a negativo, ejecutar, contador y rx.
Esto no es un ejemplo de referencia no significa que funcione es para que te guies como lo puedes hacer.
Yo hice uno en basic asi que funciona solo falta darle un acabado final.

char rx[5], cont=0, carga=0,ejecutar=0,negatico

int_uart()
valor=RX_REGISTRO
if(carga){
  if(valor==0x2D)
     negativo=1
  if((valor>=0x30)&&(valor<=0x39)
     rx[cont++]=valor
  }
if(valor=='I')
  carga=1
if(valor='F'){
  carga=0
  ejecutar=1
}
}
 
 

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Recibir String por USB y convertirlo a entero
« Respuesta #5 en: 12 de Marzo de 2011, 11:17:01 »
Hola.

Ya probaste con la función atol()? Y cuando sea un numero negativo, pues testeas la posicion en el bufer y si es '-', la descartas y corres una posición el bufer para que te quede el número en cuestión ...

Saludos
El papel lo aguanta todo


 

anything