Autor Tema: C + comunicacion serie + base de datos  (Leído 8699 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado piccar56

  • PIC10
  • *
  • Mensajes: 10
C + comunicacion serie + base de datos
« en: 10 de Agosto de 2009, 18:10:55 »
hola a todos

bueno, quiero desarrollar un proyecto con Pic, lo que tengo pensado hacer es: realizar la lectura del conversor analogico/digital de mi pic (16f877A) y este dato enviarlo por rs232 a la PC(enviarlo cada 60 min), hasta ahi todo bien, el problema surge cuando quiero  desarrollar un programa  en  C o C++  para poder leer los datos del puerto serie y tratar de almacenar  esos datos en una  pequeña  base de datos.

Los datos que  envia mi pic estan en formato ASCII y por lo general seran de este tipo 13.4 con punto flotante, pienso que  lo primero que tengo que hacer es transformar los datos de  formato ASCII a formato de numero para luego almacenarlo en la base de datos.
Fecha                Hora     Dato     
10/08/2009        13:00    17.5     

Agradecería cualquier sugerencia, experiencia similar o aporte, para poder crear la base de datos
Saludos y gracias de antemano.
 

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: C + comunicacion serie + base de datos
« Respuesta #1 en: 10 de Agosto de 2009, 18:22:02 »
Hola

¿Es obligatorio que sea una base de datos? Porque podrías escribir los datos en un archivo de Valores Separados por Comas (.CSV) y abrirlo con Excel.

Los archivos csv son simples archivos de texto y son fácilmente modificables en excel o exportables.

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: C + comunicacion serie + base de datos
« Respuesta #2 en: 10 de Agosto de 2009, 21:52:19 »
Un sistema de DB muy bueno es mysql, es libre y muy facil de usar. Vienen unas librerias para C. El tema es q tenes q tener conocimientos previo de bases de datos y mysql.
Fijate si encontras algun tutorial por internet, no es nada del otro mundo.
Saludos!!!

PD: aca hay un curso muy bueno http://www.conclase.net/c/mysql/index.php

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado tsk

  • PIC18
  • ****
  • Mensajes: 258
Re: C + comunicacion serie + base de datos
« Respuesta #3 en: 11 de Agosto de 2009, 02:17:37 »
El siguiente es el programa que hice para leer la temperatura de un lm35 con el 12f683(10 bits) y guardar la lectura en una base de datos de MySQL,  probablemente te sirva de algo.

Para leer el puerto serie utilizo unas librerías que se llaman LnxComm. Que funcionan tanto en Linux con en Windows

Código: [Seleccionar]
#define __LINUX_COM__


#include "com/serial.h"
#include <iostream>
#include <fstream>
using namespace std;
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <unistd.h>
#include <mysql.h>
MYSQL *connection, mysql;
MYSQL_RES *result,*result1,*result2,*result3,*result4;
MYSQL_ROW row,row1,row2,row3,row4;
int query_state;
typedef unsigned char byte;

int filtro(double *data)
{
 int res=0;
 if(*data == *(data+1)){res=0;} else if(*data==*(data+2)){res=0;} else if(*(data+1)==*(data+2)){res=1;}
 return res;
}
unsigned int char2int(char *data)
{
    unsigned char d[2];
    unsigned int i1,i2;
    d[0]=*data;
    d[1]=*(data+1);
    i1=d[0];
    i2=d[1];
    unsigned int int1 = i1*pow(2,8)+i2;  // Variable para almacenar el Resultado
    return int1;
}
int main(int argc, char* argv[])
{
    HANDLE fd;
    time_t rawtime;
    DCB OldConf;
    int fraq=10;
    int n,i,comand;
    char cad[46];
    char cmd[1];
    double x[3];

    for(i=0;i<=2;i++)
   {
    fd=Open_Port("/dev/ttyS0");
    OldConf=Get_Configure_Port(fd);
    Configure_Port(fd,B9600,"8N1");
    IO_Blocking(fd,FALSE);
    cmd[0]='0';
    n=Write_Port(fd,cmd,1);
    while(Kbhit_Port(fd)<2);           // Espero a leer hasta que se tengan
                                       // 2 bytes en el buffer de entrada
    n=Read_Port(fd,cad,2);             // Leo el puerto serie
    Set_Configure_Port(fd,OldConf);
    Close_Port(fd);

    x[i]=double(char2int(cad))*100.0*5.01/(1024.0*4.6);

    cout<<x[i]<<endl;

    sleep(1);
    }
    i=filtro(&x[0]);
    time(&rawtime);
/*
Conexión a la Base de datos
*/
    mysql_init(&mysql);
    connection=mysql_real_connect(&mysql,"localhost","root","password","Clima",0,NULL,0);
    if (connection == NULL) {
cout<<mysql_error(&mysql)<<endl;
return 1;
    } else {cout<<"Conexión Exitosa 1"<<endl;}
//Fin
//INSERT Query
    char query[1024];
    sprintf(query,"INSERT INTO Temperatura (Fecha,Hora,Lectura) Values (Now(), Now(),%f)",x[i]);
    query_state=mysql_query(connection,query);
    if (query_state!=0) {cout<<mysql_error(connection)<<endl; return 1;}
    mysql_free_result(result);
    mysql_close(connection);
    cout<<"Conección Cerrada"<<endl;
//Fin

    ofstream ofman("/ruta/index.xhtml");
    ofman<<"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"<<endl;
    ofman<<"<!DOCTYPE"<<endl;
    ofman<<"html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\""<<endl;
    ofman<<"\"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">"<<endl;
    ofman<<"<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"es\">"<<endl;
    ofman<<"<head >"<<endl;
    ofman<<"<link href=\"estilo2.css\" rel=\"stylesheet\" type=\"text/css\" />"<<endl;
    ofman<<"<meta http-equiv =\" Content-Type\" content=\"text/html;"<<endl;
    ofman<<"charset=utf-8\" />"<<endl;
    ofman<<"<title>LinuxRuleZ</title>"<<endl;
    ofman<<"</head>"<<endl;
    ofman<<"<body>"<<endl;
    ofman<<"<div id=\"container\">"<<endl;
    ofman<<"<div id=\"header\">"<<endl;
    ofman<<"<h1>LinuxRuleZ</h1>"<<endl;
    ofman<<"<h2>Algo</h2>"<<endl;
    ofman<<"</div>"<<endl;

    ofman<<"<div id=\"sidebar\">"<<endl;
    ofman<<"<img src=\"avatars.png\" alt=\"avatar\"></img>"<<endl;
    ofman<<"<h3>Enlaces</h3>"<<endl;
    ofman<<"<p>"<<endl;
    ofman<<"<a href=\"http://algo.com/\">Blog Algo.Com</a><br/>"<<endl;
    ofman<<"</p>"<<endl;
    ofman<<"<a href=\"http://Otro.com\">Otro.com</a><br/>"<<endl;
    ofman<<"</div>"<<endl;

    ofman<<"<div id=\"main\">"<<endl;
    ofman<<"<h3>¿Que es esto?</h3>"<<endl;
    ofman<<"<p>Pues la neta no yo mismo se</p>"<<endl;
    ofman<<"<br/>"<<endl;
    ofman<<"<br/>"<<endl;
    ofman<<"<h3>Temperatura Local</h3>"<<endl;
    ofman<<"<br/>"<<endl;
    ofman<<"Usando el PIC12F683 y el sensor de temperatura LM35 sabemos que estoy a:"<<endl;
    ofman<<"<br/>"<<endl;
    ofman<<"<h2>"<<x[i]<<" ºC</h2>"<<endl;
    ofman<<"<br/>"<<endl;
    ofman<<"(Actualización  "<<ctime(&rawtime)<<")."<<endl;
    ofman<<"<br/>"<<endl;
//Consultas a la base de datos
    mysql_init(&mysql);
    connection=mysql_real_connect(&mysql,"localhost","root","password","Clima",0,NULL,0);
    if (connection == NULL) {
cout<<mysql_error(&mysql)<<endl;
return 1;
    } else {cout<<"Conexión Exitosa"<<endl;}
    query_state=mysql_query(connection,"select * from  Temperatura WHERE Lectura = (Select MAX(Lectura) from Temperatura Where Fecha=CURDATE()) and Fecha=CURDATE();");
    if (query_state!=0) {cout<<mysql_error(connection)<<endl; return 1;}
    result3 = mysql_store_result(connection);
    row3=mysql_fetch_row(result3);
    ofman<<"Hoy: "<<row3[1]<<"<br />"<<endl;
    ofman<<"Temperatura Máxima "<<row3[3]<<"ªC a las "<<row3[2]<<" horas <br />"<<endl;
    mysql_free_result(result3);
    mysql_close(connection);
//Otro
    mysql_init(&mysql);
    connection=mysql_real_connect(&mysql,"localhost","root","password","Clima",0,NULL,0);
    if (connection == NULL) {
cout<<mysql_error(&mysql)<<endl;
return 1;
    } else {cout<<"Conexión Exitosa"<<endl;}
    query_state=mysql_query(connection,"select * from  Temperatura WHERE Lectura = (Select MIN(Lectura) from Temperatura Where Fecha=CURDATE()) and Fecha=CURDATE()");
    if (query_state!=0) {cout<<mysql_error(connection)<<endl; return 1;}
    result4 = mysql_store_result(connection);
    row4=mysql_fetch_row(result4);
    ofman<<"     Temperatura Mínima "<<row4[3]<<"ªC a las "<<row4[2]<<" horas <br />"<<endl;
    mysql_free_result(result4);
    mysql_close(connection);
    cout<<"Cerrando Conexión MySQL"<<endl;
    ofman<<"<img src=\"test.png\" alt=\"grafTem\"></img>"<<endl;
    ofman<<"<br/>"<<endl;

    ofman<<"<img src=\"cobra.jpg\" alt=\"cobra\"></img>"<<endl;
    ofman<<"<br/>"<<endl;
    ofman<<"</div>"<<endl;

    ofman<<"<div id=\"footer\">"<<endl;
    ofman<<"<p> <a href=\"http://validator.w3.org/check?uri=referer\"><img src=\"http://www.w3.org/Icons/valid-xhtml11-blue\" alt=\"Valid XHTML 1.1\" height=\"31\" width=\"88\" /></a> <a href=\"http://jigsaw.w3.org/css-validator/\"> <img style=\"border:0;width:88px;height:31px\" src=\"http://jigsaw.w3.org/css-validator/images/vcss-blue\" alt=\"Valid CSS!\" /> </a></p>"<<endl;
    ofman<<"</div>"<<endl;
    ofman<<"</div>"<<endl;
    ofman<<"</body >"<<endl;
    ofman<<"</html >"<<endl;
    ofman.close();

    try {
system("cp /ruta/index.xhtml /var/www/index.xhtml");
cout<<"Actualización de la página web, terminada ..."<<endl;
system("/home/aarmalo/temp_sys/imag"); //este programa usa la librería pngwriter para generar la gráfica de
//de la evolución de la temperatura durante el día
cout<<"Generación de gráfico Completada"<<endl;
system("cp /ruta/test.png /var/www/test.png");
cout<<"Copia de imágen completada"<<endl;
     } catch(...) { printf("Necesitas ser root para escribir en /var/www/");}
    
    return 0;
}

Saludos

Edición: Añado la captura de pantalla del resultado del programa (Tomo lecturas cada 5 minutos por medio del cron)
« Última modificación: 12 de Agosto de 2009, 15:57:51 por tsk »

Desconectado piccar56

  • PIC10
  • *
  • Mensajes: 10
Re: C + comunicacion serie + base de datos
« Respuesta #4 en: 18 de Octubre de 2009, 01:00:35 »
hola a todos
muchas gracias por su sugerenecias y recomendaciones, estos 2 ultimos  meses estaba un tanto ocupado   y deje abandono este  proyecto, pero ahora que dispongo de tiempo lo voy  a retomar; la idea original es  crear una  base  de datos en MySQL, comenzare tratando de averiguar mas acerca de base de datos en MySQL, si alguno de ustedes me  podria recomendar algun tutorial o pagina web.
Luego pienso ver  lo de la programacion en lenguaje  C u cualquier otro para poder guaradar los datos en la base  de datos, Agradecería cualquier sugerencia, experiencia similar o aporte, para poder crear la base de datos en cualquie  lenguaje de programacion.
Y  por ultimo darle las gracias  a tsk  por el ejemplo que posteo, pienso probarlo y  haber  que tal va, el codigo es  de un programa en lenguaje C?, necesito algun compilador en especial?

gracias por la ayuda que me prestan
que tengan un buen dia


Desconectado stevengalindom

  • PIC10
  • *
  • Mensajes: 18
Re: C + comunicacion serie + base de datos
« Respuesta #5 en: 22 de Agosto de 2011, 19:32:12 »
Que interesante programa en que sistema operativo lo estas implementando? tienes un tutorial para empezar a manejar mysql en c gracias por tu aporte


 

anything