[C con Clase] problemas con scanf

raul castelar raulcastelar en hotmail.com
Mar Abr 30 12:02:45 CEST 2013


Hola que tal.He estado mirando, y me he dado cuenta que no es de la función scanf por que las he quitado y me seguía dando fallo, lo raro es que el compilador no me da error ni avisos, simplemente se queda en la funcion writefile, cuando le quito el menú que veréis ahora en el código,funciona estupendamente, la tubería antes del menú funcionaba estupendamente, la verdad no entiendo por que se queda "pillado con el menú".Estoy seguro que tien que ser una tonteria que no veo o no sé.

Este código me compila bien:#include <stdio.h>#include <windows.h>#include <stdlib.h>typedef struct{   char Puerto[5];   int Baudios;   int BitsDatos;   int BitsStop;   char Paridad[25];} tipoOpciones;
tipoOpciones Ops;         HGLOBAL hCadena, hSalida; char *dato_r, *dato_t;DCB dcb;                  HANDLE idComDev,hHilo;HANDLE hReadPipe,hWritePipe;BOOL Comunicacion;DWORD dwEvtMask;DWORD numero_byte,caracteres;int coordenada_x[1024],coordenada_y[1024],m;
// Prototipos:void IniciarBuffers();void LiberarBuffers();BOOL InicioComunicacion(void);BOOL FinComunicacion(void);BOOL LeeSerie();void EscribirSerie(char *buf);DWORD Hilo(LPDWORD lpdwParam);
int main(){    DWORD n, param, id;   int accion=4,m;   char abre[]="open";   char cierra[]="close";   BOOL fSuccess;   // Inicializar opciones del puerto serie:   strcpy(Ops.Puerto, "COM1");   Ops.Baudios = 4800;   Ops.BitsDatos = 8;   Ops.BitsStop = 1;   strcpy(Ops.Paridad, "Sin paridad");
   IniciarBuffers();   // No se ha establecido comunicación:      if(!InicioComunicacion()) {
       printf ( "ERROR: no inicializacion puerto serie\n");       printf ("Configure el puerto COM1 de su PC con los siguientes parametros:\n");       printf ("\tBaudios:4800\n");       printf ("\tbits de datos:8\n");       printf ("\tbit de stop:1\n");       printf ("\tSin paridad\n");                       return (EXIT_SUCCESS);     }   hHilo = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE) Hilo, &param, 0, &id);  do {       printf ("1.Cargar archivo Excellon\n");       printf ("2.Posicionar herramienta en origen\n");       printf ("3.Inicio perforado\n");       printf ("4.Abrir/cerrar\n");       printf ("5.Salir\n");       printf("Introduzca su opcion:");       
       while (accion==0){               scanf ("%d",&accion);}
    switch (accion){            case  1:       /*case 1 llama a un afuncion que leer un archivo*/                   system("cls");                   for (m=0;m<=1024;m++)                   {coordenada_x[m];                   coordenada_y[m];                   }/*                   if(!anota_numero (PCB))                     {printf ("\n\n");                      accion=0;}*/                
            case 2: /*case2 lee el dato recibido lo compara y posiciona la herramienta , aun no terminado*/
               fSuccess = ReadFile ( hReadPipe,dato_r,numero_byte,&n,NULL);                  if(!fSuccess) {printf ( "ERROR: al leer la pipe"); }               if (*dato_r==0x06)               {printf ("conexion extablecida\n");               }
                       printf("\nOpción no valida");        case 3:        {/*empieza a enviar coordenadas por el puerto serie para posicionar la herramienta, aun no hecho*/}                               case 4:            system("cls");            printf ("\npulsa 'a' para abrir o 'c' para cerrar, s para salir\n");            accion='a';            while(accion!='s'){                
                  scanf ("%c",&accion);
                                  if (accion=='a')                                           {printf ("\nabriendo\n");                                      caracteres=4;                                             for (m=0;m<=caracteres;m++)                                                  {                                                   *dato_t=abre[m];                                                    dato_t++;                                                   }for (m=0;m<=caracteres;m++)                                                  {                                                    dato_t--;                                                   }                                                                                         EscribirSerie(dato_t);                                              }                                 else if (accion=='c')                                           {printf ("\ncerrando\n");                                        caracteres=5;                                             for (m=0;m<=caracteres;m++)                                                  {                                                   *dato_t=cierra[m];                                                    dato_t++;                                                   }                                                   EscribirSerie(dato_t);                                              }                  else if (accion=='s')                      {             system ("cls");                  }              }                                       accion=0;                                                                            break;              case 5:              system ("cls");              accion=6;                      }  }while(accion==0);    CloseHandle(hHilo);    FinComunicacion();   LiberarBuffers();    return (EXIT_SUCCESS);           }void IniciarBuffers(){   hCadena = GlobalAlloc(GMEM_MOVEABLE, 4096);   hSalida = GlobalAlloc(GMEM_MOVEABLE, 4096);   dato_r = (char *)GlobalLock(hCadena);   dato_t = (char *)GlobalLock(hSalida);}void LiberarBuffers(){   GlobalUnlock(hCadena);   GlobalUnlock(hSalida);   GlobalFree(hCadena);   GlobalFree(hSalida);}BOOL InicioComunicacion(void){   BOOL fSuccess;
   // Abrir el fichero asociado al puerto:   idComDev = CreateFile(Ops.Puerto, GENERIC_READ | GENERIC_WRITE,   		0, NULL, OPEN_EXISTING, 0, NULL);   if(idComDev ==INVALID_HANDLE_VALUE) {       printf ( "ERROR: CreateFile. Inicialización puerto serie");            return 0;   }   // Leer estructura de control del puerto serie, cdb:   fSuccess = GetCommState(idComDev, &dcb);   if(!fSuccess) { printf ( "ERROR: CreateFile. Inicialización puerto serie");        return 0;   }
   // Modificar el dcb según las opciones definidas:   dcb.BaudRate = Ops.Baudios;   dcb.ByteSize = Ops.BitsDatos;
   if(!strcmp(Ops.Paridad, "Sin paridad")) dcb.Parity = NOPARITY;   if(!strcmp(Ops.Paridad, "Paridad par")) dcb.Parity = EVENPARITY;   if(!strcmp(Ops.Paridad, "Paridad impar")) dcb.Parity = ODDPARITY;
   switch(Ops.BitsStop) {         case 1:         dcb.StopBits = ONESTOPBIT;         break;      case 2:         dcb.StopBits = TWOSTOPBITS;         break;   }
   // Modificar la estructura de control del puerto serie:   fSuccess = SetCommState(idComDev, &dcb);   if(!fSuccess) {       printf ( "ERROR: CreateFile. Inicialización puerto serie");             return 0;   }   // Especifica que queremos monitorizar la recepción de datos:   if(!SetCommMask(idComDev, EV_RXCHAR)) {       printf ( "No se pudo activar la el evento de lectura.");              }
   // Comunicación establecida:      return 1;}BOOL FinComunicacion(void){   // Liberar máscara de eventos del puerto serie:   SetCommMask(idComDev, 0);   // Cerrar el puerto serie:   CloseHandle(idComDev);   // Comunicación interrumpida:   Comunicacion = 0;   return 1;}BOOL LeeSerie(){   char i;   DWORD x;   COMSTAT cs;
   // Actualizar COMSTAT, sirve para   // averiguar el número de bytes en el buffer de entrada:   ClearCommError(idComDev, &x, &cs);   // Leer cs.cbInQue caracteres:   ReadFile(idComDev, dato_r, cs.cbInQue, &x, NULL);    /*  for (i=0;i<=x-1;i++)   {
    datos_recepcion[i]=*dato_r;    dato_r++;    printf ("datos son=%x\n",datos_recepcion[i]);*/   }     void EscribirSerie(char *buf ){   char Buffer[1024];   DWORD n, l,p, err;      for(n=0;n<=caracteres;n++)   {   Buffer [n]=*buf;   buf++;   }l = strlen(Buffer); p=0;  l=l*1000;   while(l) {           if(!WriteFile(idComDev, &Buffer[p], l, &n, NULL)) {  /*POR QUÉ NO HACE ESTA FUNCION???*/      	 err = GetLastError();      	 if(err != ERROR_IO_PENDING) {      	    Comunicacion = 0;            return;      	 }      }      l--;      p++;   }}DWORD Hilo(LPDWORD lpdwParam){   DWORD dwEvtMask;
   do {      if(WaitCommEvent(idComDev, &dwEvtMask, NULL))         if(dwEvtMask & EV_RXCHAR) LeeSerie();   } while(1);   return 0;}Saludos!!!! 		 	   		  
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130430/8158a509/attachment.html>


Más información sobre la lista de distribución Cconclase