LnxComm

Linux Communication es una biblioteca multiplataforma que nos da la posiblidad de conectarnos de forma facil y rapida con el puerto seria de la PC.

se puede descardar de forma directa aqui

El tutorial se puede encontrar en formato PDF aqui

El manual de referencia se puede encontrar en HTML aqui

LnxComm

Linux Communication

LnxComm : Linux Communication

por Fernando Pujaico Rivera

<fernando.pujaico.rivera a-r-r-o-b-a gmail.com>

Tabla de contenidos

1. Introduccion

2. Descripción de funciones

2.1. Previamente

2.2. Open_Port

2.3. Get_Configure_Port

2.4. Configure_Port

2.5. Set_Configure_Port

2.6. Write_Port

2.7. Read_Port

2.8. Gets_Port

2.9. Getc_Port

2.10. Kbhit_Port

2.11. Close_Port

2.12. Set_Hands_Haking

2.13. Set_BaudRate

2.14. Set_Time

2.15. IO_Blocking

2.16. Clean_Buffer

2.17. Create_Thread_Port

3. Ejemplos

3.1. Previamente

3.2. Bloqueante

3.3. No-Bloqueante

3.4. Timeout

3.5. Evento

4. Referencias

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)