fondo

martes, 30 de abril de 2013

Limpito y perfumado

Weno, después de.... no recuerdo cuanto tiempo, acabo de formatear el PC y hacer una reinstalación desde 0.

A falta de instalar algún que otro programita, he liberado en torno a los 50 GBs de espacio que probablemente fuera las mas pura de las basuras.

Además, he conseguido después de 6 días, configurar correctamente la lectura del puerto serie de las narices. Dejo por aquí un trozo del código perfectamente funcional (no como los ejemplos que he visto por internet, que de una forma u otra no funcionan).

Hay que aclarar que este código se ejecuta sobre OSX 10.8.3 y que tras 6 días, no he conseguido trabajar con el puerto serie de forma asíncrona mediante el uso de las señales del sistema.

En fin, sin más dilación aquí va el código (que imagino que no es perfecto :P). En este ejemplo, capturo un paquete de 20 bytes que almaceno en un vector (STL) de char. (Puede que falte algún #include o algo)
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <iostream>
#include <vector>

#define BAUDRATE B19200 #define MODEMDEVICE "/dev/ElTTYDeTurno"
#define _POSIX_SOURCE 1
#define FALSE 0
#define TRUE 1

using namespace std;

int main()
{
    int fd;
    struct termios oldtio,newtio;
    vector<char> codigo;
    int STOP=0;
    long res;
    char buf[1];
    char a = 0xaa;
 
    fd = open(MODEMDEVICE, O_RDONLY | O_NOCTTY | O_NONBLOCK ); /* Abrimos el puerto. O_NOCTTY y O_NONBLOCK obligatorias. O_NOCTTY indica que no es un terminal de consola y O_NONBLOCK indica que no hay bloqueo. */
    if (fd <0)
    {
        perror(MODEMDEVICE);
        error = 1;
    }
    else
    {
        if (fcntl(fd, F_SETFL, 0) == -1) /* Inicializamos la configuracion del descriptor del puerto. */
        {
            printf("Error %s - %s(%d).\n", MODEMDEVICE, strerror(errno), errno);
            error = 1;
        }
     
        tcgetattr(fd,&oldtio); /* Obtenermos los parametros originales */
        newtio = oldtio; /* Creamos unos parámetros nuevos a partir de los originales */
     
        cfsetspeed(&newtio, BAUDRATE); /* Asignamos la tasa de baudios */
        newtio.c_cflag |= CS8; /* 8 bits de datos */
        newtio.c_cflag &= ~( CSIZE | PARENB | PARODD | CSTOPB ); /* Sin paridad, 1 bit de parada */
     
        tcflush(fd, TCIOFLUSH); /* Hacemos un flash sobre el puerto */
        tcsetattr(fd,TCSANOW,&newtio); /* Asignamos los parámetros al descriptor con efecto inmediato */
    }
 
    while (!STOP)
    {
        res = read(fd, buf, 1); /* Leemos del puerto 1 byte y lo guardamos en buf */
        if (res<0)
        {
            error=1;
        }
        codigo.push_back(buf[0]); /* Añado el byte leido al final del vector */
        if (codigo[0]!=a) /* Este if se encarga de garantizar que la captura no se hace desfasada entre paquetes. No se si es lo más correcto, pero aquí está.*/
        {
            codigo.clear();
        }
     
        if (codigo.size()==20) /* En este caso, comprobamos que el paquete de 20 bytes esta completo y paramos la lectura. */
        {
            STOP = 1;
        }
    }
 
    tcsetattr(fd,TCSANOW,&oldtio); /* Volvemos a asignar los valores de la configuracion inicial */
    close(fd); /* Cerramos el descriptor */
    return 0;
}

No hay comentarios: