[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Off topic - Programa en C para manejar puerto serial



El mié, 02-07-2008 a las 23:20 +0200, Jesús Genicio escribió:
> Hola:
> 
> Aquí tienes varios ejemplos de cómo hacerlo.
> 
> http://tuxgraphics.org/electronics/
> 
> S2.
> 
> 

tal vez esto te sirva:

http://es.tldp.org/COMO-INSFLUG/es/ps/Programacion-Serie-Como.ps.gz

O esto:
Este programita se comunica con un PIC y a través del puerto serie lee
datos y los grafica. A lo mejor podés sacar algo.


#include    <string.h>
#include    <fcntl.h>
#include    <termios.h>
#include    <stdio.h>
#include    <stdlib.h>
#include    <unistd.h>
#include    <libio.h>
#include    <X11/Xlib.h>
#include    "Escala.h"
#include    "Escala.cc"
// Ancho y alto de la ventana en pixels.
#define ANCHO 800
#define ALTO 540
/* la tasa de baudios esta definida en <asm/termbits.h>, que esta
   incluida <termios.h> */
#define BAUDRATE B57600
/* cambie esta definicion por el puerto correcto */
#define MODEMDEVICE "/dev/ttyS0"
#define _POSIX_SOURCE 1 /* fuentes cumple POSIX */
#define FALSE 0
#define TRUE 1
main()
{
           int fd , res;
   double x,y;
   int xPixel, yPixel;
   struct termios oldtio,newtio;
           unsigned char datosrx[2500]={0}, datostx;
           Display *disp = NULL;
           /* Ventana que vamos a crear para dibujar */
           Window ventana;
           /* Color que vamos a utilizar para dibujar una linea */
           XColor color;
           /* Abrimos la conexion con el servidor de X */
           disp = XOpenDisplay(NULL);
           /* Creamos una ventana */
           ventana = XCreateSimpleWindow (
                      disp,
                      XDefaultRootWindow (disp),
                      100, 100,
                      ANCHO, ALTO,
                      1, 1,
                      WhitePixel (disp, DefaultScreen(disp)));
           /* Hacemos que la ventana sea visible */
           XMapWindow (disp, ventana);
           /* Obtenemos el color azul */
           color.flags = DoRed | DoGreen | DoBlue;
           color.red = 65535;
           color.blue = 0;
           color.green = 0;
           color.pad = 0;
           XAllocColor (
                      disp,
                      DefaultColormap (disp, DefaultScreen(disp)),
                      &color);
           /* Indicamos que el color de dibujo a partir de ahora es el
azul */
           XSetForeground (
                      disp,
                      XDefaultGC (disp, DefaultScreen(disp)),
                      color.pixel);
   /* Instanciamos y preparamos la clase de conversión de escala.*/
   EscalaC escala;
   escala.tomaExtremos (0.0, 3.0, -1.01, 2.0);
   escala.tomaAreaGrafica (ANCHO, ALTO);
           sleep(1);
   fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
           if (fd <0) { perror(MODEMDEVICE); exit(-1); }
   tcgetattr(fd,&oldtio);
           bzero(&newtio, sizeof(newtio)); /* limpiamos struct para
recibir los
     /*           types                nuevos parametros del puerto */
/*
      BAUDRATE: Fija la tasa bps. Podria tambien usar cfsetispeed y
cfsetospeed.
      CRTSCTS : control de flujosize de salida por hardware (usado solo
si el cable
      tiene todas las lineas necesarias Vea sect. 7 de Serial-HOWTO)
      CS8      : 8n1 (8bit,no paridad,1 bit de parada)
      CLOCAL : conexion local, sin control de modem
      CREAD : activa recepcion de caracteres
*/
//| CRTSCTS
   newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
   newtio.c_iflag = IGNPAR;
   newtio.c_oflag = 0;
           cfsetispeed(&newtio, B57600);
           cfsetospeed(&newtio, B57600);
   newtio.c_lflag = 0;
   newtio.c_cc[VTIME]        =0; /* temporizador entre caracter, no
usado */
   newtio.c_cc[VMIN]         =250; /* bloquea lectura hasta recibir 5
chars */
   tcflush(fd, TCIFLUSH);
   tcsetattr(fd,TCSANOW,&newtio);
/**
Mandandole un 15 al pic comienza a convertir
**/
           int variable = 0;
           datostx = 1;
           write(fd, &datostx, 1);
           usleep(100);
           x=0.0;
           y=1.0;
           while(1)
           {
                      res = read(fd, &datosrx[250 * variable], 250);
                      //printf("caracteres leidos:%d\n\n", res);
                      variable++;
                      res = read(fd, &datosrx[250 * variable], 250);
                      //printf("caracteres leidos:%d\n\n", res);
                      variable++;
                      res = read(fd, &datosrx[250 * variable], 250);
                      //printf("caracteres leidos:%d\n\n", res);
                      variable++;
                      graficar(datosrx, x, y, disp, ventana, escala);
                      XFlush(disp);
                      //scanf("%c", &datostx);
            x=y;
            y+=1.0;
  if(y > 3)
            {
                    y=1.0;
                    variable=0;
                    x=0;
                    XClearWindow(disp, ventana);
            }
  }
  tcsetattr(fd,TCSANOW,&oldtio);
  printf("\nchau\n");
}



Reply to: