[C con Clase] problemas con scanf
raul castelar
raulcastelar en hotmail.com
Mar Abr 30 12:30:46 CEST 2013
Perdón: el código de antes no lo había corregido con las lineas de prueba que estab haciendo este está mas claro, os daréis cuenta que si quito el menú , hasta while==0 ,funciona. Incluso he quitado la tubería.Muchas gracias por todo.
#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=0,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, ¶m, 0, &id);
do { /*desde aqui*/ 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: /*llama a un afuncion que leer un archivo*/ accion=0; system ("cls"); 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); case 2: accion=0; system ("cls"); case 3: accion=0; system ("cls"); case 4: accion=0; system ("cls"); case 5: system ("cls"); accion=6; } }while(accion==0);/*hasta aquí, si sequita entra en la funció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); 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; while(l) { if(!WriteFile(idComDev, &Buffer[p], l, &n, NULL)) { 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;}
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130430/400bef5b/attachment.html>
Más información sobre la lista de distribución Cconclase