<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, &param, 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>