Buenos días javicho,
A mi en el trabajo me toco hacer lo mismo, por medio de un puerto COM en una bascula.
Por lo que veo, o no lo has pasado, no inicias o le pones un valor al Handle.
En mi caso yo lo hago asi, es como si abrieras un archivo:
Código:
hComm := CreateFile(PChar('\\.\COM3'), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
Cambiando el puerto por el tuyo, obviamente,

.
Esto iria antes del IF(INVALID_HANDLE_VALUE).
El otro problema que me encontré es que leer y escribir són asincronos, es decir, el hace la escritura y no se espera, inmediatamente hace la lectura y nunca me devolvía nada, tuve que hacer un sleep(300) para poder darle tiempo a enviar algo.
También debo decirte que yo el búfer lo tengo con ANSIChar, con Char no me iba.
En el momento de de leer los datos de vuelta, no los leas todos. En mi caso solo me eran utiles los primeros 7 (000.000) el resto era basura.
Por cierto la variable sTmp(donde guardas el resultado de la comunicación en ningún momento la inicializas (el típico [varible] := ''), si no lo haces puede que te mantenga los datos que tenia anteriormente en esa dirección de memoria y lo que tu quieras te lo ponga al final de esa línea de caracteres residuales.
Con todo esto, te debería de funcionar, si no lo hace me comentas y lo miramos.