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: