• Miércoles 11 de Septiembre de 2024, 18:22

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Temas - blasata

Páginas: [1]
1
C/C++ / hexadecimal en con 0x
« en: Martes 9 de Noviembre de 2010, 20:52 »
Hola, mirar no sé si se podrá hacer pero bueno, a ver si alguien me puede ayudar:

la cosa es que estoy recibiendo por serie datos como estos, por ejemplo ..DA 11 21 C3..en hexadecimal, y parte de ellos los uso para enviar yo una respuesta. El problema es que no sé crear un array de char con el 0x delante. Me explico, manualmente me puedo crear esto:

Código: C++
  1. unsigned char inventario[8] =  {0xD6,0x00,0x05,0xFE,0x00,0x05,0xFA,0x40};
  2. WriteFile(hLCD, inventario, 8, &m, NULL);
  3.  
(no sé si se puede hacer de alguna forma mejor...)

Lo envio y todo bien. Luego a la respuesta que me llega le extraigo la parte de la trama que me interesa y la guardo en:

Código: C
  1. unsigned char sn[8];
  2.  

Ahora con lo que hay dentro de sn debo formar una nueva trama que debo enviar. ¿Pero como? He probado haciendo:

Código: C++
  1. unsigned char b;
  2.    
  3.     sprintf(b,"%c",0x40);
  4.  

pero no va bien, como se puede poner el 0x delante a un hexadeciamal que yo quiera y guardarlo en un array?

Lo que no sé es cómo se puede crear la matriz de ejemplo de arriba pero con datos que el programa va recibiendo? :brickwall:

No tendré que crear un montón de
Código: C
  1. #define                A4     0xA4
  2.  
  3.  
para luego usarlos... :argh:

2
C/C++ / crc16 ccitt polinomio 1021
« en: Domingo 7 de Noviembre de 2010, 02:59 »
Hola a todos,
por favor alguien puede decirme que está mal en el siguiente código? me devuelve para la cadena "123456789" un valor de CRC de: E245. Sin embargo debería ser 29B1, según esta web: http://zorc.breitbandkatze.de/crc.html
Se trata de CRC16 CCITT, polinomio 0x1021, valor inicial 0xffff y final 0.
 :hitcomp:

Código: C
  1.  
  2. long CRC16(char value, long poly, long init_value, long exit_value)
  3. {
  4.     long re, i;
  5.     res=value;
  6.  
  7.     res^=init_value;
  8.  
  9.     for(i=0; i<8; i++)  // a cada byte hacer
  10.     {
  11.         if(res & 1)
  12.            {
  13.             res >>= 1;
  14.             res ^= poly;      // 1021
  15.            }
  16.         else
  17.            {
  18.             res >>= 1;
  19.            }
  20.     }
  21.    res ^= exit_value;
  22.    return res;
  23. }
  24. int _tmain(int argc, _TCHAR* argv[])
  25. {
  26.     char datos[]="123456789";
  27.     int i;
  28.     long inival;
  29.     inival=0xFFFF;
  30.  
  31.     for(i=0; i<strlen(datos); i++)
  32.       {
  33.          printf("INIVAL VALE: %Xn",inival);
  34.        inival = CRC16(datos[i],0x1021,inival,0x0000);
  35.       }
  36.     inival = inival ^ 0xFFFF;
  37.     printf("El CRC de la cadena: %s es: %4Xn", datos, inival);
  38.     getchar();
  39.     return 0;
  40. }
  41.  
  42.  

muchas gracias

3
Visual C++ / cerrar puertos COM antes de usarlos
« en: Lunes 19 de Abril de 2010, 22:30 »
Hola de nuevo,

tengo una duda, ¿se pueden cerrar los puertos COM que se habrieron en una ejecución anterior de un programa que finalizó incorrectamente (y que los dejó abiertos)?   :question:
esto me pasa al parar mi programa con Ctrl C, cuando vuelvo a cargar el programa no consigue arrancar los puertos. En concreto uso esto

Código: C
  1. DCB dcbLCD;  // estructura de configuracion
  2.     //HANDLE hLCD;
  3.     char dd[5];
  4.     //LPCSTR(COM_LCD) antes
  5.     sprintf(dd,"%s%c","COM",COM_LCD);
  6.     printf("LCD: accediendo a COM: %s n",dd);
  7. lab1:hLCD = CreateFile(dd, GENERIC_READ|GENERIC_WRITE, 0, NULL,OPEN_EXISTING, 0, NULL);// abrimos el puerto
  8.      if(hLCD == INVALID_HANDLE_VALUE) {
  9.              printf("Error al acceder al puerto serie LCDn");
  10.              escribelog("Error al acceder al Puerto COM LCD");  
  11.              Sleep(1000);
  12.              goto lab1;
  13.             }
  14.      else   { printf("Acceso correcto LCDn");
  15.               escribelog("Acceso correcto al Puerto COM LCD");  
  16.             }
  17.  
gracias de antemano :comp:
sí..uso goto :P

4
Visual C++ / guardar cadenas de fichero en array de cadenas
« en: Lunes 19 de Abril de 2010, 00:28 »
Hola a todos, quiero guardar las cadenas de lengua.txt en un array de cadenas *msj[62], pero este código no va bien:
 se van sobreescribiendo y me guarda en todas las posiciones de msj la última cadena leída del archivo: :ouch:

Código: C
  1.  
  2. *msj_LCD[62], tmp_l[200];  // estas variables las declaro como globales aunque se vean aquí
  3. if(archivo_lengua!=NULL) // Si lo abrimos correctamente.
  4.          for ( a=0; a<62; a++)
  5.              { fgets(tmp_l, 200, archivo_lengua);  
  6.                msj_LCD[a]= tmp_l;
  7.              }
  8.      fclose(archivo_lengua);
  9.  
 :brickwall:

5
Robótica / inversor de giro motor CC chasquea rele
« en: Viernes 2 de Abril de 2010, 08:16 »
hola compañeros, espero que alguno tenga más experiencia y me pueda ayudar:

tengo un motorcito que consume 2.5A, y debo controlar el sentido de giro con dos relés (12V 10A). El esquema que uso para el giro es:  

 El caso es que el circuito tanto para un giro como para el otro no funciona bien cuando conecto uno de los relés: chasquea la pata N.O. todo el rato. Vamos que la pata N.O. se conecta con la C. pero al momento se desconecta y así muchas veces y muy rápido... Lo raro es que si con la mano muevo el eje del motor, y, digamos, le ayudo a arrancarlo, si engancha la pata del rele bien, no chasquea.  :argh:

También he probado con un motor más pequeño, y con este los relés se enganchan bien sin ayuda. Sólo chasquea con el motor grande.
Me estoy equivocando en algo?  :blink:

6
Visual C++ / Cómo establecer Juego de Caracteres VC?
« en: Jueves 25 de Marzo de 2010, 18:09 »
Hola a todos,

el usuario de mi programa debe tener la opción de elegir el juego de caracteres que quiera ( Latin 1250, 1252, 850, etc). Pero..

Cómo se hace esto en VC?

He encontrado esta web: http://www.zator.com/Cpp/E2_2_1a2.htm
Pero no sé si van por ahí los tiros.. :huh:

Gracias

7
Visual C++ / debug y release y SYSTEMTIME
« en: Miércoles 17 de Marzo de 2010, 11:52 »
Hola a todos,
 tengo un problemón con esta función para conectarme por sockets a un servidor

Código: C++
  1. int conectar(char IP[], int Puerto)    
  2. {
  3.         WSADATA wsa;
  4.        SOCKET buzonete;  
  5.        // Struct hostent *host;
  6.        struct sockaddr_in direc;
  7.        int conex;    
  8.        //Inicializamos
  9.        WSAStartup(MAKEWORD(2,2),&wsa);
  10.        escribelog("Intentando crear Socket...");
  11.        do
  12.         {  buzonete = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //creamos el socket  
  13.            printf("Intentando crear el Socket...n");
  14.            Sleep(1000);
  15.         }
  16.        while (buzonete == -1);
  17.         escribelog("Socket creado...");
  18.        // Definimos la dirección a conectar
  19.        direc.sin_family = AF_INET;
  20.        direc.sin_port = htons(Puerto);                
  21.        direc.sin_addr.s_addr = inet_addr( &IP[0] );  
  22.        memset(direc.sin_zero,0,8);        
  23.  
  24.        escribelog("Conectando ...");
  25.        printf("Intentando conexion ...n"); 
  26.        do
  27.         {   conex = connect( buzonete, (sockaddr *)&direc, sizeof(sockaddr) );
  28.             Sleep(1000);  
  29.         }
  30.        while (conex==-1);
  31.        printf("Conectado  n");
  32.        
  33.        return buzonete;
  34. }
  35.  
Cuando llamo a la función, en modo debug voy paso a paso, y veo como pasa por cada sentencia y se conecta. Así funciona bien......pero en release, se salta directamente a
Código: C++
  1.  printf("Conectado  n");
  2.  
Y no sé por qué. Ya me ha pasado más veces esto de que se "salte" código.  :argh:
También estoy intentando esto
Código: C++
  1.  char sip[6];
  2.      SYSTEMTIME ahora;
  3.      sprintf(sip,"%s", ahora.wYear);
  4.  

 pero tampoco, me dice
     en DEBUG: que la variable está siendo usada sin estar definida en debug
     y en RELEASE: Unhandled exception at 0x10227c2f (msvcr80d.dll)  

Si hago paso a paso veo como se salta la linea SYSTEMTIME ! :brickwall:
 :hitcomp:

Ah y como podría hacer que los campos de ahora.wDay etc... si son menores de 10, aparezcan con dos cifras, es decir, si son 5 seg. por ejemplo que aparezca como 05

Gracias!

8
Visual C++ / el segundo send no llega
« en: Lunes 11 de Enero de 2010, 19:07 »
Hola de nuevo,
tratando de hacer la aplicación cliente me encuentro con que el primer send que envío al servidor llega correctamente, pero los que mando después no: o llega algo pero no contiene nada. Y si al servidor le pongo control de errores ni eso.
El valor que devuelve send es correcto, no hay errores yo creo.

No sé si poner código, es simplemente
send(cliente_m, sip, strlen(sip)+1, 0); //ok
send(cliente_m, sip, strlen(sip)+1, 0); // falla, aunque cambien el mensaje

El programa servidor viene con un su cliente (que tengo que emular), y he comprobado que con él todos los send llegan.
¿Antes de hacer hacer otro envío hay que hacer algo pero qué?
¿¿se me escapa algo??

9
Visual C++ / crear funcion conectar
« en: Viernes 8 de Enero de 2010, 10:09 »
Hola, seguramente será una chorrada pero al crear una función como esta (a la que he dejado en los huesos para que se vea mejor):

int conectar()
{
      WSADATA wsa;
      int cliente;  
      struct sockaddr_in direc;
      WSAStartup(MAKEWORD(2,2),&wsa);
      direc.sin_family=AF_INET;
      direc.sin_port=htons(6001);
      direc.sin_addr.s_addr = inet_addr("127.0.0.1");
      memset(direc.sin_zero,0,8);  
      cliente = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
           connect(cliente, (sockaddr *)&direc, sizeof(sockaddr));
return cliente;          
}


Si hago en main
conectar();
send(cliente...

me dice que cliente está sin declarar.

He intentado a cambiar void por SOCKET. Y static int cliente también.  :argh:
qué estará mal?

10
Hardware / puerto paralelo.entradas digitales
« en: Martes 8 de Diciembre de 2009, 21:18 »
Hola a todos
una vez configurado el puerto paralelo como bidireccional, me gustaría que me confirmara alguien (antes de nada) si esta conexión para usar el puerto paralelo como entrada es la correcta:  

Código: C
  1.  
  2.                               switch
  3. uno de los pin de datos ______  ______tierra
  4.                            |
  5.                          10k
  6.                            |
  7.                          +5V  
  8.  

Poner la fuente de 5V en serie con una resistencia y conectarlo al pin de datos, y del mismo pin de datos el microinterruptor que al cerrar lleva a tierra.

11
Visual C++ / VC2005
« en: Viernes 4 de Diciembre de 2009, 11:02 »
Hola, mirar tengo una dll que contiene

public: virtual int __thiscall FEDM_DataBase::GetData(int,class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > > &,int,int)   0x1005d500   0x0005d500   462 (0x1ce)   FedmIscCoreVC90.dll   C:xertiumAutopréstamo PortátilesBUZÓNCD Lector RFIDCopia de ID ISC.SDK.Win V3.00.07 SOFTWAREfedm-classlibFedmIscCoreVC90.dll   Exported Function   

Pero al compilar me dice el Visual que:
public: virtual int __thiscall FEDM_DataBase::GetData(int,class ATL::CStringT<wchar_t,class StrTraitMFC_DLL<wchar_t,class ATL::ChTraitsCRT<wchar_t> > > &,int,int)" (?GetData@FEDM_DataBase@@UAEHHAAV?$CStringT@_WV?$StrTraitMFC_DLL@_WV?$ChTraitsCRT@_W@ATL@@@@@ATL@@HH@Z)

Parece que busca una función diferente de la que hay en la dll, cómo cambio esa w para que vaya bien??
gracias :hitcomp:

12
Visual C++ / ón
« en: Sábado 28 de Noviembre de 2009, 13:13 »
Hola a todos, espero por favor puedan ayudar, estoy recién llegado a VC++ y estoy un poco perdido:
tengo una aplicación de consola, la estoy haciendo con VC++ 2008 Express(aunque es un poco matar moscas a cañonazos) y trucada para que pueda compilar los proyectos con MFC. El problema es que no sé acceder al puerto serie y he usado el siguiente código para acceder al él:

#include <conio.h>
#include <stdio.h>
#include <dos.h>
#include <math.h>
#include <bios.h>

int puerto,k,j,dato,config;
char lectura[1],dato1[2];

char leer()
  {
  do{
    dato=bioscom(2,0x83,puerto);
    } while (!kbhit());
  return(dato);
  }

void main(void)
  {
  clrscr();
  printf("Ingrese puerto COM a usar: ");
  scanf("%d", &puerto);
  while(puerto<1 || puerto>4)
    {
    clrscr();
    printf("ERROR... Debe ingresar 1, 2, 3 o 4 !!!nn");
    printf("Ingrese puerto COM a usar: ");
    scanf("%d", &puerto);
    }

  puerto--;
  config=0x83;
  bioscom(0,config,puerto);

  clrscr();
  gotoxy(14,4);
  printf("RECEPCION DE DATOS VIA SERIE");
  gotoxy(8,6);
  printf("Config --> COM %d \ 1200 bps \ 8N1", puerto+1);
  gotoxy(29,8);
  printf("Escape --> Salir");
  gotoxy(23,10);
  printf("MONITOR DE RECEPCION: ");

  do{
    if(!kbhit()) dato1[0]=leer();
    if(!kbhit())
      {
      gotoxy(40,12);
      printf("%1s ",dato1);
      }

    }while(!kbhit());

  }


Pero no lo puedo compilar en mi proyecto main.cpp, por eso lo he compilado con TurboC y lo que quiero es llamarlo desde mi aplicación de VC++ que es también de consola. He probado con system, pero se queda sin hacer nada.
¿cómo podría acceder al puerto serie desde esta aplicación de consola de VC++2008 sin usar programas externos?
¿Sería mejor hacer una aplicación de Forms y llamar desde esta a un programa de consola.?

gracias de antemano
saludos

Páginas: [1]