Tengo un dispositivo que está conectado en el puerto COM4, ​​(115200 baudios, 8-N-1). Según los ejemplos que encontré aquí , estoy abriendo el puerto con:

                    Keyboard_Handle=CreateFile("\\\\.\\COM4",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL); 
                    if(GetLastError() !=0 || Keyboard_Handle == INVALID_HANDLE_VALUE)
                    {
                        AfxMessageBox("Error opening connection to Keyboard");
                        exit(1);
                    }


                    char buffer[100];
     strcpy(buffer,"baud=115200 parity=N data=8 stop=1");
     BuildCommDCB((char*)&buffer,&dcb)) 

     if(GetCommState(Keyboard_Handle, &dcb))
     {
      dcb.BaudRate = CBR_115200;
      dcb.ByteSize = 8;
      dcb.Parity = 0;
      dcb.StopBits = 1;
      SetCommState(Keyboard_Handle, &dcb);
     } 


Más adelante en mi código llamo WriteFile en el puerto con:

    LPDWORD bytes_written;
    LPDWORD bytes_read;
    LPOVERLAPPED OVERLAP;
    char write_buf[10];

    write_buf[0] = 's';
    write_buf[1] = '\0';

    if(Keyboard_Handle != NULL) {
    WriteFile(Keyboard_Handle, (LPCVOID)write_buf , strlen(write_buf), bytes_written, OVERLAP); 
    }

Y cada vez que ejecuto el código, el depurador JIT se queja de una excepción no controlada (aunque WriteFile está dentro de un bloque Try / catch).

¿Hay algún problema con la forma en que estoy haciendo esto?

ตอบ

bytes_writtendebe ser una dirección de una variable; el compilador no compilaría la declaración que publicó.

Del mismo modo, " OVERLAP" no tiene sentido.

¿Verificó si CreateFiletuvo éxito?

¿Qué hay write_bufcuando lo llamas strlen?

Intente copiar y pegar el código real que está utilizando.

Además, eso no parece una muestra muy buena / informativa que estás usando. Pruebe la programación del puerto serie de Windows y http://msdn.microsoft.com/en-us/library/ms810467.aspx

También comience con el programa de muestra del sitio de Microsoft, pruébelo antes de modificarlo (para verificar que esté funcionando en su máquina) y luego modifíquelo.

Cuando llamas, SetCommState¿el valor de retorno es 0? Podría ser un error que podría estar causando más problemas.

Además, ¿ha recorrido línea por línea para asegurarse de que es la llamada WriteFile la que lo bloquea?

Por último, podría tener algún antivirus u otro software conectado a su aplicación que cause estos problemas (busque archivos DLL desconocidos cargados en su lista de módulos).