La parte donde pone if (GetAsyncKeyState('A') & 0x8000) , precisamente
0x8000 no lo entiendo y no lo pone
aquí.
No, no lo pone ahí. Lo pone aquí:
https://msdn.microsoft.com/es-es/library/windows/desktop/ms646293(v=vs.85).aspxIf the function succeeds, the return value specifies whether the key was pressed since the last call to GetAsyncKeyState, and whether the key is currently up or down. If the most significant bit is set, the key is down
El bit más significativo en un short es, digamos, ""el de la izquierda"". 0x8000 en binario es 0b1000_0000_0000_0000. Haciendo un and (&), sacamos si ese bit está activo o no. Si está activo, el resultado será diferente de 0, así que se ejecutará el contenido del if. Si no está pulsada, el bit estará a 0, y el AND retornará 0. El if, en ese caso, no se ejecutará.
Parece ser que ignora esta instrucción.
Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1);
Aquí una captura cuando pulsa solo la B o la A. Se repite muchas veces.
(Si es posible hacer el tamaño de la ventana en la programación de C++, mejor que mejor).Sobre el tema de que se repita muchas veces es porque el GetAsyncKeyState te dice que está pulsada, no si ha sido pulsada. Por tanto, si mantienes la tecla, entrará muchas veces. Tendrías que controlar si ha sido pulsada ahora o si ya estaba pulsada.
Lo de recibir comandos desde el peurto serie o Arduino es este el que me refería:
Puerto -> ReadData(lectura, 50);
cout << "Recibido: " << lectura << endl;
Que este programa al mismo tiempo que envía comandos, también los puede recibir. Si el programa C++ no le hago nada, solo lo dejo arrancado, desde el puerto serie puede venir cualquier dato y C++ debe leerlo sin problemas.
Como dice MAFUS, esto es un protocolo con 2 programas. Conocemos el de Windows, pero no conocemos el de Arduino. ¿No podría ser problema del programa del Arduino?