Puerto Serie
Pagina Oficial – AQUI
descarga directa – Aquí
LnxComm
Linux Communication
LnxComm : Linux Communication
por Fernando Pujaico Rivera
<fernando.pujaico.rivera a-r-r-o-b-a gmail.com>
Tabla de contenidos
Capítulo 1. Introduccion
La librería “Linux Communication” (LnxComm) esta diseñada para brindar un apoyo a los programadores que estén relacionados con el diseño y construcción de hardware. LnxComm nos permite crear una conexion con el puerto serie mediante unas pocas lineas de código.
Otra de las ventajas de esta librería es que nos permite crear programas que podrán ser compilados en sistemas operativos LINUX y WINDOWS brindando así mayor portabilidad a nuestros programas.
La librería esta completamente desarrollada en Lenguaje C.
Capítulo 2. Descripción de funciones
2.1. Previamente
las funciones cumplen las mismas características tanto como para sistemas operativos LINUX y WINDOWS.
2.2. Open_Port
Función de lectura del puerto.
HANDLE Open_Port(char COMx[]);
Abre el puerto de comunicaciones, recibe como parametro una cadena con el nombre del puerto y devuelve una variable de tipo HANDLE que es el manejador del puerto.
COMx[] : Es una cadena que contiene el nombre del puerto a abrir, ejemplo.
“COM1″ , “COM2″ , “COM3″ , “COM4″ , …
“/dev/ttyS0″ , “/dev/ttyS1″ , “/dev/ttyS2″ , “/dev/ttyS3″ , …
“/dev/ttyUSB0″, “/dev/ttyUSB1″, “/dev/ttyUSB2″, “/dev/ttyUSB3″, …
“/dev/ttyACM0″, “/dev/ttyACM1″, “/dev/ttyACM2″, “/dev/ttyACM3″, …
Retorna: El manejador de Puerto Abierto
2.3. Get_Configure_Port
Devuelve configuración actual del puerto serie.
DCB Get_Configure_Port(HANDLE fd);
Esta función devuelve un variable de tipo DCB con la configuración actual del puerto serie ,la función recibe un parametro de tipo HANDLE que es el manejador devuelto por la función Open_port.
fd : Es el manejador del puerto.
Retorna: Una estructuracon DCB con la configuración actual del puerto.
2.4. Configure_Port
Establece la configuración del Puerto.
DCB Configure_Port( HANDLE fd,
unsigned int BaudRate,
char CharParity[]);
Esta función configura el puerto serie con los parametros fd,BaudRate y CharParity.
fd : Es el manejador del puerto devuelto por Open_port.
BaudRate : Es la velocidad del puerto. (B115200, B19200, B9600, …)
CharParity: indica el numero de bits de la transmisión. (“8N1″,”7E1″,”7O1″,”7S1″)
Retorna : Una estructuracon DCB con la configuración del puerto
2.5. Set_Configure_Port
Establece la configuración del Puerto.
int Set_Configure_Port( HANDLE fd,
DCB PortDCB);
Restituye la configuración del puerto serie, los parametros serán pasados mediante una variable tipo DCB.
fd : Es el manejador del puerto devuelto por Open_port.
newtio : Es una variable DCB con la configuración del puerto, generalmente se usa la devuelta
por la funcion Get_Configure_Port
Retorna: TRUE si todo fue bien o FALSE si hubo algun error.
2.6. Write_Port
Escribe un bloque de Datos en el puerto serie.
long Write_Port( HANDLE fd,
char Data[],
int SizeData);
Escribe los SizeData primeros caracteres de Data.
fd : Es el manejador del puerto devuelto por Open_port.
Data : Es el dato a mandar.
SizeData: es el numero de bytes que se quieren escribir.
Retorna : En caso de éxito, se devuelve el número de bytes escritos
(cero indica que no se ha escrito nada). En caso de error,
se devuelve -1.
2.7. Read_Port
Recibe un bloque de datos en el puerto.
long Read_Port( HANDLE fd,
char *Data,
int SizeData);
Lee los SizeData primeros caracteres del Puerto y lo carga en Data.
fd : Es el manejador del puerto devuelto por Open_port.
Data : Es la variable en donde se reciben los datos.
SizeData: es el numero de bytes que se quieren recibir.
Retorna : En caso de éxito, se devuelve el número de bytes leídos
(cero indica que no se ha leído nada). En caso de error,
se devuelve -1.
2.8. Gets_Port
Recibe una cadena de tipo texto.
long Gets_Port( HANDLE fd,
char *Data,
int SizeData);
Recibe datos por el puerto, lee hasta encontrar un 0×0A,0×0D o hasta completar SizeData caracteres. Los datos son guardados en la variable Data
fd : Es el manejador del puerto devuelto por Open_port.
Data : Es la variable en donde se reciben los datos.
SizeData: es el maximo numero de bytes que se quieren recibir.
Retorna : El numero de caracteres recibidos
2.9. Getc_Port
Recibe un caracter por el puerto.
long Getc_Port( HANDLE fd,
char *Data);
Recibe un unico carácter por el puerto y es cargado en la variable Data de tamaño 1 byte.
fd : Es el manejador del puerto devuelto por Open_port.
Data : Es la variable en donde se reciben los datos(1 Byte).
Retorna: El numero de caracteres recibidos.
2.10. Kbhit_Port
Indica el estado del buffer de entrada.
int Kbhit_Port( HANDLE fd);
recibe como parametro el manejador del puerto.
fd : Es el manejador del puerto devuelto por Open_port.
Retorna: El numero de caracteres en el buffer de recepción
2.11. Close_Port
Cierra el puerto serie.
int Close_Port( HANDLE fd);
Recibe la variable fd y cierra el puerto.
fd : Es el manejador del puerto devuelto por Open_port.
Retorna: TRUE si se ha cerrado el Puerto y FALSE en el caso contrario.
2.12. Set_Hands_Haking
Configura el control de flujo en el puerto serie.
int Set_Hands_Haking( HANDLE fd,
int FlowControl);
Recibe como variables el manejador de el puerto y el tipo de control de flujo.
fd : Es el manejador del puerto devuelto por Open_port.
FlowControl: es un numero entero que indica el tipo de control de flujo.
0 Ninguno
1 RTSCTS
2 XonXoff
3 DTRDSR
Retorna : TRUE si todo fue bien y FALSE si no lo fue.
2.13. Set_BaudRate
Configura la velocidad puerto serie.
int Set_BaudRate( HANDLE fd,
unsigned int BaudRate);
Recibe como datos el manejador del puerto y la velocidad del mismo.
fd : Es el manejador del puerto devuelto por Open_port.
BaudRate: Es la velocidad del puerto, los valores pueden ser.
B2400
B9600
B19200
B115200
Para mas datos vea el archivo baudios.h .
Retorna: TRUE si todo fue bien y FALSE si no lo fue.
2.14. Set_Time
Configura Temporizador para read y write.
int Set_Time( HANDLE fd,
unsigned int Time);
Recibe como variables, el manejador del puerto y el máximo tiempo entre bytes en milisegundos
fd : Es el manejador del puerto devuelto por Open_port.
Time : multiplicador en m-seg, para el tamaño total de time-out en read y write.
Timeout = (Time-m-seg * number_of_bytes)
Retorna: TRUE si todo fue bien y FALSE si no lo fue.
2.15. IO_Blocking
Escoge como modo bloqueante o no bloqueante para lectura.
int IO_Blocking( HANDLE fd,
int Modo);
La funcion recibe como parametro el manejador del puerto y TRUE si se quiere una conexión bloqueante o FALSE si no.
fd : Es el manejador del puerto devuelto por Open_port.
Modo : TRUE : Modo bloqueante.
FALSE: Modo no bloqueante.
Retorna: TRUE si todo fue bien y FALSE si no lo fue.
2.16. Clean_Buffer
Termina las operaciones de lectura y escritura pendientes y limpia las colas de recepción y de transmisión.
int Clean_Buffer( HANDLE fd);
La funcion recibe como parametro el manejador del puerto.
fd : Es el manejador del puerto devuelto por Open_port.
Retorna: TRUE si todo fue bien y FALSE si no lo fue.
2.17. Create_Thread_Port
Crea una función hilo que se ejecuta cuando existan caracteres en el buffer de de entrada del puerto.
pthread_t Create_Thread_Port( HANDLE *fd);
Recibe como parametro el manejador del puerto. y devuelve una variable de tipo pthread_t
fd : Es el manejador del puerto devuelto por Open_port.
Retorna: El manejador del hilo creado.
Para poder usar la función Create_Thread_Port primero se debe de habilitar escribiendo lo siguiente: #define ENABLE_SERIAL_PORT_EVENT Luego se debe de escribir el código de la función SERIAL_PORT_EVENT(HANDLE *hPort)
#define ENABLE_SERIAL_PORT_EVENT
#include “com/serial.h”
void SERIAL_PORT_EVENT( HANDLE *hPort)
{
// Código de ejemplo aquí
// char Data[16];
// Read_Port(*hPort,Data,15);
// Data[15]=0;
// printf(“%s”,Data);
}
La función SERIAL_PORT_EVENT recibe como parametro un puntero de tipo HANDLE que es el manejador del puerto.
Capítulo 3. Ejemplos
Para escribir tus programas puedes escoger cuatro metodos bloqueante, no-bloqueante, time-out y evento.
3.1. Previamente
La cabecera cambia según el sistema operativo.
Linux:
#define __LINUX_COM__
#include “com/serial.h”
Windows:
#define __WINDOWS_COM__
#include “com/serial.h”
La función Open_Port también cambiara de argumento según el sistema operativo.
Linux:
“/dev/ttyS0″ , “/dev/ttyS1″ , …
“/dev/ttyUSB0″, “/dev/ttyUSB1″, …
“/dev/ttyACM0″, “/dev/ttyACM1″, …
Windows:
“COM1″, “COM2, “COM3″, …
Si se esta usando linux como sistema operativo la compilación de los programas que se realicen se hará de la siguiente manera:
gcc -o archivo archivo.c
En el caso de que se este creando un hilo se debera compilar de la siguiente manera.
gcc -o archivo archivo.c -lpthread
3.2. Bloqueante
Aqui (../bloqueante.c) se tiene un ejemplo de un programa bloqueante
#define __WINDOWS_COM__ /* #define __LINUX_COM__ */
#include "com/serial.h"
int main()
{
HANDLE fd;
DCB OldConf;
char cad[16]="Enviando Texto";
int n;
fd=Open_Port("COM1"); /* Abre el puerto serie
fd=Open_Port("/dev/ttyS0"); */
OldConf=Get_Configure_Port(fd); /* guardo la configuracion del puerto */
Ca
Configure_Port(fd,B115200,"8N1"); /* Configuro el puerto serie */
/* Bloqueante por defecto, pero también
se puede usar
IO_Blocking(fd,TRUE); */
n=Write_Port(fd,cad,16); /* Escribo en el puerto serie*/
while(Kbhit_Port(fd)<16); /* Espero a leer hasta que se tengan
16 bytes en el buffer de entrada */
n=Read_Port(fd,cad,16); /* Leo el puerto serie */
Set_Configure_Port(fd,OldConf); /* Restituyo la antigua configuración
del puerto */
Close_Port(fd); /* Cierro el puerto serie */
printf("Presione ENTER para terminarn");
getchar();
return 0;
}
|
3.3. No-Bloqueante
Aqui (../nobloqueante.c) se tiene un ejemplo de un programa no-bloqueante
#define __WINDOWS_COM__ /* #define __LINUX_COM__ */
#include "com/serial.h"
int main()
{
HANDLE fd;
DCB OldConf;
char cad[16]="Enviando Texto";
int n;
fd=Open_Port("COM1"); /* Abre el puerto serie
fd=Open_Port("/dev/ttyS0"); */
OldConf=Get_Configure_Port(fd); /* guardo la configuración del puerto */
Configure_Port(fd,B115200,"8N1"); /* Configuro el puerto serie */
IO_Blocking(fd,FALSE); /* Seleccionamos lectura no bloquenate */
n=Write_Port(fd,cad,16); /* Escribo en el puerto serie*/
while(Kbhit_Port(fd)<16); /* Espero a leer hasta que se tengan
16 bytes en el buffer de entrada */
n=Read_Port(fd,cad,16); /* Leo el puerto serie */
Set_Configure_Port(fd,OldConf); /* Restituyo la antigua configuración
del puerto */
Close_Port(fd); /* Cierro el puerto serie */
printf("Presione ENTER para terminarn");
getchar();
return 0;
}
|
3.4. Timeout
Aqui (../timeout.c) se tiene un ejemplo de un programa con timeout
#define __WINDOWS_COM__ /* #define __LINUX_COM__ */
#include "com/serial.h"
int main()
{
HANDLE fd;
DCB OldConf;
char cad[16]="Enviando Texto";
int n,TIME=2;
fd=Open_Port("COM1"); /* Abre el puerto serie
fd=Open_Port("/dev/ttyS0"); */
OldConf=Get_Configure_Port(fd); /* guardo la configuracion del puerto */
Configure_Port(fd,B115200,"8N1"); /* Configuro el puerto serie */
Set_Time(fd,TIME); /* time-out entre caracteres es TIME*0.1*/
n=Write_Port(fd,cad,16); /* Escribo en el puerto serie*/
n=Read_Port(fd,cad,16); /* Leo el puerto serie */
Set_Configure_Port(fd,OldConf); /* Restituyo la antigua configuracion
del puerto */
Close_Port(fd); /* Cierro el puerto serie */
printf("Presione ENTER para terminarn");
getchar();
return 0;
}
|
3.5. Evento
Aqui (../evento.c) se tiene un ejemplo de un programa con evento
#define __WINDOWS_COM__ /* #define __LINUX_COM__ */
#define ENABLE_SERIAL_PORT_EVENT
#include "com/serial.h"
int numero=0;
SERIAL_PORT_EVENT(HANDLE * hPort)
{
char c;
Getc_Port(*hPort,& c);
printf("[%d]=%cn",numero,c);
numero++;
}
int main()
{
HANDLE fd;
DCB OldConf;
char cad[16]="Enviando Texton";
int n;
fd=Open_Port("COM1"); /* Abre el puerto serie
fd=Open_Port("/dev/ttyS0"); */
OldConf=Get_Configure_Port(fd); /* guardo la configuracion del puerto */
Configure_Port(fd,B115200,"8N1"); /* Configuro el puerto serie */
IO_Blocking(fd,TRUE); /* Bloqueante por defecto, pero tambien
se puede usar
IO_Blocking(fd,TRUE); */
n=Write_Port(fd,cad,16); /* Escribo en el puerto serie*/
Create_Thread_Port(& fd); /* Creo un hilo y le paso el manejador */
while(TRUE);
Set_Configure_Port(fd,OldConf); /* Restituyo la antigua configuracion
del puerto */
Close_Port(fd); /* Cierro el puerto serie */
printf("Presione ENTER para terminarn");
getchar();
return 0;
}
|
Capítulo 4. Referencias
• http://ZSoluciones.com (http://zsoluciones.com)
• http://winapi.conclase.net
• Y el gran GOOGLE (http://google.com)
Comments
Comment from fegasoft
Time: August 29, 2009, 2:42 pm
Excelente libreria!!.. me ayudo muchisimo!… ahora ya puedo controlar y monitorear mis proyectos con la notebook con el cable serial-usb.. tanto en linux como en windows!…
Write a comment