<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 12pt;
font-family:Calibri
}
--></style></head>
<body class='hmmessage'><div dir='ltr'>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.<div>Muchas gracias por todo.</div><div><br></div><div><div>#include <stdio.h></div><div>#include <windows.h></div><div>#include <stdlib.h></div><div>typedef struct</div><div>{</div><div> char Puerto[5];</div><div> int Baudios;</div><div> int BitsDatos;</div><div> int BitsStop;</div><div> char Paridad[25];</div><div>} tipoOpciones;</div><div><br></div><div>tipoOpciones Ops; </div><div>HGLOBAL hCadena, hSalida; </div><div>char *dato_r, *dato_t;</div><div>DCB dcb; </div><div>HANDLE idComDev,hHilo;</div><div>HANDLE hReadPipe,hWritePipe;</div><div>BOOL Comunicacion;</div><div>DWORD dwEvtMask;</div><div>DWORD numero_byte,caracteres;</div><div>int coordenada_x[1024],coordenada_y[1024],m;</div><div><br></div><div>// Prototipos:</div><div>void IniciarBuffers();</div><div>void LiberarBuffers();</div><div>BOOL InicioComunicacion(void);</div><div>BOOL FinComunicacion(void);</div><div>BOOL LeeSerie();</div><div>void EscribirSerie(char *buf);</div><div>DWORD Hilo(LPDWORD lpdwParam);</div><div><br></div><div>int main()</div><div>{ DWORD n, param, id;</div><div> int accion=0,m;</div><div> char abre[]="open";</div><div> char cierra[]="close";</div><div> BOOL fSuccess;</div><div> // Inicializar opciones del puerto serie:</div><div> strcpy(Ops.Puerto, "COM1");</div><div> Ops.Baudios = 4800;</div><div> Ops.BitsDatos = 8;</div><div> Ops.BitsStop = 1;</div><div> strcpy(Ops.Paridad, "Sin paridad");</div><div><br></div><div> IniciarBuffers();</div><div> // No se ha establecido comunicación:</div><div> </div><div> if(!InicioComunicacion()) {</div><div><br></div><div> printf ( "ERROR: no inicializacion puerto serie\n");</div><div> printf ("Configure el puerto COM1 de su PC con los siguientes parametros:\n");</div><div> printf ("\tBaudios:4800\n");</div><div> printf ("\tbits de datos:8\n");</div><div> printf ("\tbit de stop:1\n");</div><div> printf ("\tSin paridad\n");</div><div> </div><div> </div><div> return (EXIT_SUCCESS);</div><div> }</div><div> hHilo = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE) Hilo, ¶m, 0, &id);</div><div><br></div><div> do { /*desde aqui*/</div><div> printf ("1.Cargar archivo Excellon\n");</div><div> printf ("2.Posicionar herramienta en origen\n");</div><div> printf ("3.Inicio perforado\n");</div><div> printf ("4.Abrir/cerrar\n");</div><div> printf ("5.Salir\n");</div><div> printf("Introduzca su opcion:");</div><div> </div><div><br></div><div> while (accion==0){</div><div> scanf ("%d",&accion);}</div><div><br></div><div> switch (accion){</div><div> case 1: /*llama a un afuncion que leer un archivo*/</div><div> accion=0; </div><div> system ("cls");</div><div> caracteres=4;</div><div> for (m=0;m<=caracteres;m++)</div><div> {</div><div> *dato_t=abre[m];</div><div> dato_t++;</div><div> }for (m=0;m<=caracteres;m++)</div><div> {</div><div> dato_t--;</div><div> }</div><div> </div><div> EscribirSerie(dato_t);</div><div> </div><div> case 2: </div><div> accion=0;</div><div> system ("cls");</div><div> case 3:</div><div> accion=0; </div><div> system ("cls");</div><div> case 4:</div><div> accion=0; </div><div> system ("cls");</div><div> case 5:</div><div> system ("cls");</div><div> accion=6;</div><div> </div><div> }</div><div> }while(accion==0);/*hasta aquí, si sequita entra en la función*/</div><div> caracteres=4;</div><div> for (m=0;m<=caracteres;m++)</div><div> {</div><div> *dato_t=abre[m];</div><div> dato_t++;</div><div> }for (m=0;m<=caracteres;m++)</div><div> {</div><div> dato_t--;</div><div> }</div><div> </div><div> EscribirSerie(dato_t);</div><div> </div><div> CloseHandle(hHilo);</div><div> FinComunicacion();</div><div> LiberarBuffers(); </div><div> return (EXIT_SUCCESS);</div><div> </div><div> </div><div> }</div><div>void IniciarBuffers()</div><div>{</div><div> hCadena = GlobalAlloc(GMEM_MOVEABLE, 4096);</div><div> hSalida = GlobalAlloc(GMEM_MOVEABLE, 4096);</div><div> dato_r = (char *)GlobalLock(hCadena);</div><div> dato_t = (char *)GlobalLock(hSalida);</div><div>}</div><div>void LiberarBuffers()</div><div>{</div><div> GlobalUnlock(hCadena);</div><div> GlobalUnlock(hSalida);</div><div> GlobalFree(hCadena);</div><div> GlobalFree(hSalida);</div><div>}</div><div>BOOL InicioComunicacion(void)</div><div>{</div><div> BOOL fSuccess;</div><div><br></div><div> // Abrir el fichero asociado al puerto:</div><div> idComDev = CreateFile(Ops.Puerto, GENERIC_READ | GENERIC_WRITE,</div><div> <span class="Apple-tab-span" style="white-space:pre"> </span>0, NULL, OPEN_EXISTING, 0, NULL);</div><div> if(idComDev ==INVALID_HANDLE_VALUE) {</div><div> printf ( "ERROR: CreateFile. Inicialización puerto serie");</div><div> </div><div> return 0;</div><div> }</div><div> // Leer estructura de control del puerto serie, cdb:</div><div> fSuccess = GetCommState(idComDev, &dcb);</div><div> if(!fSuccess) {</div><div> printf ( "ERROR: CreateFile. Inicialización puerto serie"); </div><div> return 0;</div><div> }</div><div><br></div><div> // Modificar el dcb según las opciones definidas:</div><div> dcb.BaudRate = Ops.Baudios;</div><div> dcb.ByteSize = Ops.BitsDatos;</div><div><br></div><div> if(!strcmp(Ops.Paridad, "Sin paridad")) dcb.Parity = NOPARITY;</div><div> if(!strcmp(Ops.Paridad, "Paridad par")) dcb.Parity = EVENPARITY;</div><div> if(!strcmp(Ops.Paridad, "Paridad impar")) dcb.Parity = ODDPARITY;</div><div><br></div><div> switch(Ops.BitsStop) {</div><div> case 1:</div><div> dcb.StopBits = ONESTOPBIT;</div><div> break;</div><div> case 2:</div><div> dcb.StopBits = TWOSTOPBITS;</div><div> break;</div><div> }</div><div><br></div><div> // Modificar la estructura de control del puerto serie:</div><div> fSuccess = SetCommState(idComDev, &dcb);</div><div> if(!fSuccess) {</div><div> printf ( "ERROR: CreateFile. Inicialización puerto serie"); </div><div> </div><div> return 0;</div><div> }</div><div> // Especifica que queremos monitorizar la recepción de datos:</div><div> if(!SetCommMask(idComDev, EV_RXCHAR)) {</div><div> printf ( "No se pudo activar la el evento de lectura.");</div><div> </div><div> </div><div> }</div><div><br></div><div> // Comunicación establecida:</div><div> </div><div> return 1;</div><div>}</div><div>BOOL FinComunicacion(void)</div><div>{</div><div> // Liberar máscara de eventos del puerto serie:</div><div> SetCommMask(idComDev, 0);</div><div> // Cerrar el puerto serie:</div><div> CloseHandle(idComDev);</div><div> // Comunicación interrumpida:</div><div> Comunicacion = 0;</div><div> return 1;</div><div>}</div><div>BOOL LeeSerie()</div><div>{</div><div> char i;</div><div> DWORD x;</div><div> COMSTAT cs;</div><div><br></div><div> // Actualizar COMSTAT, sirve para</div><div> // averiguar el número de bytes en el buffer de entrada:</div><div> ClearCommError(idComDev, &x, &cs);</div><div> // Leer cs.cbInQue caracteres:</div><div> ReadFile(idComDev, dato_r, cs.cbInQue, &x, NULL);</div><div> </div><div> /* for (i=0;i<=x-1;i++)</div><div> {</div><div><br></div><div> datos_recepcion[i]=*dato_r;</div><div> dato_r++;</div><div> printf ("datos son=%x\n",datos_recepcion[i]);</div><div>*/</div><div> }</div><div> </div><div> </div><div>void EscribirSerie(char *buf )</div><div>{</div><div> char Buffer[1024];</div><div> DWORD n, l,p, err;</div><div> </div><div> for(n=0;n<=caracteres;n++)</div><div> {</div><div> Buffer [n]=*buf;</div><div> buf++;</div><div> }</div><div>l = strlen(Buffer);</div><div> p=0; </div><div> </div><div> while(l) {</div><div> </div><div> if(!WriteFile(idComDev, &Buffer[p], l, &n, NULL)) {</div><div> <span class="Apple-tab-span" style="white-space:pre"> </span> err = GetLastError();</div><div> <span class="Apple-tab-span" style="white-space:pre"> </span> if(err != ERROR_IO_PENDING) {</div><div> <span class="Apple-tab-span" style="white-space:pre"> </span> Comunicacion = 0;</div><div> return;</div><div> <span class="Apple-tab-span" style="white-space:pre"> </span> }</div><div> }</div><div> l--;</div><div> p++;</div><div> }</div><div>}</div><div>DWORD Hilo(LPDWORD lpdwParam)</div><div>{</div><div> DWORD dwEvtMask;</div><div><br></div><div> do {</div><div> if(WaitCommEvent(idComDev, &dwEvtMask, NULL))</div><div> if(dwEvtMask & EV_RXCHAR) LeeSerie();</div><div> } while(1);</div><div> return 0;</div><div>}</div></div> </div></body>
</html>