LusoRobótica - Robótica em Português

Software => C/C++ => Tópico iniciado por: maurosmartins em 03 de Outubro de 2012, 21:50

Título: Base de dados e Serial Port em Visual C++
Enviado por: maurosmartins em 03 de Outubro de 2012, 21:50
Viva pessoal,

hoje preciso de me dirigir mais aos informáticos a ver se consigo tirar uma duvida que me assombra.

Bem então a questão é a seguinte:

quero fazer um pequeno programa que recebe strings na porta série e com os valores lá presentes alimentam uma base de dados. Já consigo ler da porta série e consigo ligar e escrever na base de dados (MySQL), mas não consigo juntar as duas no mesmo programa  :(

O que pretendo fazer é ter uma instância única da classe que liga à base de dados e que fosse "Global" ao programa, ou seja poderia aceder a esta instância (e carregar dados na base de dados) em todo o lado no programa.

Este facto seria de extrema ajuda porque poderia carregar os dados provenientes da porta serie na rotina de callback ao evento de dados recebidos.

No entanto eu não consigo fazer esta classe global. já perguntei no fórum Portugal a Programar que me ajudaram dizendo-me que a maneira correcta seria implementar um "singleton".

Não fazia ideia do que isso era, ao pesquisar verifiquei que é um método de permitir a criação de apenas uma instancia de uma classe e que pode ser acedida em todo o lado no programa, e ainda vi que realmente se usa em sistemas com base de dados.

O senão da coisa é que nao sei/nao consigo perceber como fazer isto.

Agradecia que se alguem tiver ideias, eu agradecia! posso meter aqui todo o código (k não é mto) a ver se consigo ultrapassar esta dificuldade.

Desde já obrigado,

Cumprimentos, Mauro.

PS, o meu C++ é inexistente  ;)
Título: Re: Base de dados e Serial Port em Visual C++
Enviado por: SJD22 em 03 de Outubro de 2012, 22:40
Visual C++ nao é mto a minha especialidade... mas se quiseres fazer em C#.NET posso ajudar-te.

De qq forma ainda nao percebi bem o problema. Se queres receber isso pela Serial e dps gravar em Mysql, com meia duzia de linhas fazes isso.
Título: Re: Base de dados e Serial Port em Visual C++
Enviado por: maurosmartins em 03 de Outubro de 2012, 22:44
Viva SJD22, agradeço-te a resposta!

k venha o C#, desde que eu consiga perceber... A questão é que a porta serie em uma função que eu atribuo como sendo a função de resposta ao evento.

esta função dps nao consegue (eu nao sei como fazer) aceder a uma instância da ligação a base de dados.

a função de callback tem de ser declarada como static.

cumps, Mauro.
Título: Re: Base de dados e Serial Port em Visual C++
Enviado por: SJD22 em 03 de Outubro de 2012, 22:49
Esquece isso... queres o que concretamente?

Sempre que recebes dados pela Serial, ele grava na BD, é isso?

Web, Desktop app ou Consola?
Título: Re: Base de dados e Serial Port em Visual C++
Enviado por: maurosmartins em 03 de Outubro de 2012, 22:52
SJD22,

é assim tão fácil? assim fico mal visto :)

consola basta, a minha ideia final era conseguir fazer disto um serviço do windows, mas uma aplicação de consola é mais que suficiente.

Cumps, Mauro.
Título: Re: Base de dados e Serial Port em Visual C++
Enviado por: SJD22 em 03 de Outubro de 2012, 22:55
Isto é como tudo na vida... quem está por dentro do assunto, é facil... quem nao está, é dificil :)

Nao precisa de ser serviço... Metes a correr uma vez e fica a correr sempre à escuta da porta de série.

A ver se amanha já te ajudo nisto.

Entretanto instala o Visual Studio 2010 Express que é de borla para conseguires trabalhar na coisa.
Título: Re: Base de dados e Serial Port em Visual C++
Enviado por: maurosmartins em 03 de Outubro de 2012, 23:02
SJD22 concordo plenamente com o que dizes.

eu já tenho o visual studio express instalado,

quando tiveres oportunidade agradecia então!

obrigado, Mauro
Título: Re: Base de dados e Serial Port em Visual C++
Enviado por: senso em 03 de Outubro de 2012, 23:20
Não percebendo eu muito sobre programação no lado do pc.....
Não devias fazer como fazemos nos micros, tens uma função chamada regularmente para ler e escrever dados para a porta serial(tipo de uma interrupção) e metes os dados num buffer, e depois procedes ao processamento e tratamento dos mesmos, mas desacoplado do interface serial, ou seja abstraido de como chegam e como se enviam os dados.
Título: Re: Base de dados e Serial Port em Visual C++
Enviado por: maurosmartins em 04 de Outubro de 2012, 00:16
Viva pessoal,

@senso, essa solução seria como fazer Polling. Em alternativa a classe SerialPort tem um evento de dados recebidos, ou seja quando houver uma recepção de dados vai automaticamente executar uma funcao definida por nos, o equivalente a uma interrupção nos micros.

Acho a segunda opção mais interessante, resta-me saber como a implementar.

@SJD22, fiz um pequeno código em C# baseando-me no que tinha em C++

Código: (C#) [Seleccione]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO.Ports;
using MySql.Data.MySqlClient;

namespace ConsoleApplication1
{
    class Program
    {


        static void Main(string[] args)
        {

            string constring;

            constring = "server=127.0.0.1;uid=root;" +
                        "pwd=#########;database=measures;";

            MySqlConnection consql = new MySqlConnection(constring);

            MySqlCommand mycommand = new MySqlCommand();

            mycommand.Connection = consql;

            SerialPort myserial = new SerialPort("com6", 28800);

            myserial.DataBits = 8;
            myserial.Parity = Parity.None;
            myserial.StopBits = StopBits.One;

            myserial.DataReceived +=new SerialDataReceivedEventHandler(funcao);

            myserial.Open();

            consql.Open();

            mycommand.CommandText = "use measures";
            mycommand.ExecuteNonQuery();

            consql.Close();

            Console.WriteLine(constring);

            while (true){
                Console.WriteLine("Alive\n");
                Thread.Sleep(2000);
            }
           
        }

        private static void funcao(object sender,SerialDataReceivedEventArgs e){
            SerialPort sp = (SerialPort)sender;
            string indata = sp.ReadExisting();


            //!!!!!PROBLEMA AQUI!!!!!\\
            myCommand.CommandText = "INSERT INTO measures (measure,timedate,deviceID,measuretypeID) VALUES(2.222225,now(),1,1);";
            myCommand.ExecuteNonQuery();
            Console.Write(indata);
        }
    }
}


A area onde tenho duvidas esta assinalada, ou seja, como posso partilhar a minha ligação que ja esta definida para que possa ser acedida na rotina de callback que neste caso se chama funcao?

Obrigado, Mauro.
Título: Re: Base de dados e Serial Port em Visual C++
Enviado por: msr em 04 de Outubro de 2012, 13:59
Queres ter a instancia "mycommand" disponivel na "funcao"? Tal como tens, essa é uma instancia local da função main. Tens que declarar "MySqlCommand mycommand;" fora da main (no header da classe se for em C++) e dentro da main só instancias "mycommand = new ...".

Se for em C# tens que ter em atenção que atributos/variaveis static só podem ser acedidos por métodos/funções static. A função main em C# é sempre static se não me engano.
Em C++ não me lembro se também é assim.
Título: Re: Base de dados e Serial Port em Visual C++
Enviado por: maurosmartins em 04 de Outubro de 2012, 22:00
Viva pessoal,

msr, o programa está praticamente feito, mas falta-me essa parte, será que entre ti o SJD22 e eu não metemos isso a trabalhar?

acho que terão de ser mais voces k eu :P

nao digo que o que esta feito esteja bem, pode ser alterado de qq maneira que achem, só gostava que dps me explicassem :D

Obrigado, Mauro.
Título: Re: Base de dados e Serial Port em Visual C++
Enviado por: rglove em 04 de Outubro de 2012, 22:52
Não sei muito de C# (só uso quando faço apps WPF). Alterei o código, mas não sei se funciona... Experimenta  :)
Se calhar fiz porcaria, se fiz ignora  ;D

Código: [Seleccione]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO.Ports;
using MySql.Data.MySqlClient;

namespace ConsoleApplication1
{
    class Program
    {

        static string constring = "server=127.0.0.1;uid=root;" + "pwd=#########;database=measures;";
        static MySqlConnection consql = new MySqlConnection(constring);
        static MySqlCommand mycommand = new MySqlCommand();
       
        static void Main(string[] args)
        {
            mycommand.Connection = consql;
           
            SerialPort myserial = new SerialPort("com6", 28800);
            myserial.DataBits = 8;
            myserial.Parity = Parity.None;
            myserial.StopBits = StopBits.One;
            myserial.DataReceived +=new SerialDataReceivedEventHandler(funcao);
            myserial.Open();
            consql.Open();
            mycommand.CommandText = "use measures";
            mycommand.ExecuteNonQuery();
            consql.Close();
            Console.WriteLine(constring);

            while (true){
                Console.WriteLine("Alive\n");
                Thread.Sleep(2000);
            }
           
        }

        private static void funcao(object sender,SerialDataReceivedEventArgs e){
            SerialPort sp = (SerialPort)sender;
            string indata = sp.ReadExisting();

            mycommand.CommandText = "INSERT INTO measures (measure,timedate,deviceID,measuretypeID) VALUES(2.222225,now(),1,1);";
            mycommand.ExecuteNonQuery();
            Console.Write(indata);
        }
    }
}

EDIT: Acho que ainda falta consql.open() antes de mycommand.ExecuteNonQuery() não?
Título: Re: Base de dados e Serial Port em Visual C++
Enviado por: maurosmartins em 05 de Outubro de 2012, 15:35
rglove,

FUNCIONA :D mto obrigado!

EDIT: Acho que ainda falta consql.open() antes de mycommand.ExecuteNonQuery() não?

não, só tinha um consql.close() a mais!

vou analisar isto e dps coloco aqui as minhas duvidas, até porque ja tinha ttado fazer algo do género, declarando as variaveis como estaticas, mas nao devo ter feito bem!

Mais uma vez obrigado, Mauro.
Título: Re: Base de dados e Serial Port em Visual C++
Enviado por: rglove em 05 de Outubro de 2012, 16:16
De nada, ainda bem que funciona  :D