leer y escribir datos en puertos seriales
DESCRIPTION
datos por puertoTRANSCRIPT
Leer y escribir datos en puertos seriales
Una pregunta recurrente que me suelen preguntar es la relacionada a cómo hacer X o Y a
través de los puertos seriales. Es decir, cómo lograr interactuar con algún hardware conectado
al puerto serial.
La respuesta a esto es sencilla. Un puerto serial no "controla" a un dispositivo. Simplemente
sirve de comunicación entre la PC y el hardware. En otras palabras, tienes que enviarle bytes
de información a través del puerto serial, o bien, leer esos bytes del propio puerto e
interpretarlos. Pero siempre debes saber, de antemano, qué bytes está esperando, cómo se
contruye el búfer y cómo interpretar los bytes que te sean enviados.
Bueno, aclarado lo anterior, prosigamos. En escencia, entonces, lo que tenemos que hacer es
leer y escribir bytes al puerto, ¿correcto? Pues bien, Windows trata a los puertos de la misma
forma que a los archivos, aunque con un nombre establecido. El puerto "COM1" se llama
"COM1:", el puerto "LPT2" se llama "LPT2:", etc. Nota que todos terminan con dos puntos (:).
Así, lo único que hay que hacer para escribir información en el puerto serial es hacer una
llamada a las funciones del API Win32 CreateFile, ReadFile y WriteFile. Un ejemplo: vamos a
enviar al puerto serial los caracteres "Hola Mundo!". Y después vamos a leer el puerto serial
para sacar a la consola lo que sea que nos haya contestado nuestro hardware.
#include <windows.h>
#include <iostream>
#define STRING_SIZE 100
using std::cout;
using std::cin;
int main()
{
HANDLE hComPort;
DWORD dwBytesWritten;
DWORD dwBytesRead;
DWORD dwBufferSize;
TCHAR szBuffer[STRING_SIZE];
dwBufferSize = sizeof(TCHAR) * STRING_SIZE;
hComPort = CreateFile(_T("COM1:"),
GENERIC_READ | GENERIC_WRITE, // solo pueden ser estos valores
0,
0,
OPEN_EXISTING, // solo puede ser OPEN_EXISTING
FILE_FLAG_OVERLAPPED,
0);
if (hComPort == INVALID_HANDLE_VALUE)
{ // no se pudo abrir el puerto COM1:
cout << "No se pudo abrir el puerto COM1." << endl;
}
else
{
// leer datos desde el puerto serial
ReadFile(hComPort, szBuffer, dwBufferSize, &dwBufferRead, NULL);
cout << "Se leyeron " << dwBufferRead << " bytes. " <<
"Buffer: " << szBuffer << endl;
// etcétera: podemos emplear WriteFile para escribir bytes.
}
// finalmente, cerramos el manejador
CloseHandle(hComPort);
return EXIT_SUCCESS;
}
Y listo. En esencia, lo importante aquí es que el puerto se abre directamente con CreateFile,
como si se tratara de otro archivo normal, con el nombre de archivo igual al del puerto que
queremos abrir, seguido de dos puntos.
Espero lo anterior sea de utilidad. Como ves, no es muy complicado. Lo complicado es que el
hardware te responda a lo que quieres y que sepas interpretar lo que éste te está diciendo.