collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Base de dados e Serial Port em Visual C++  (Lida 8030 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline maurosmartins

  • Mini Robot
  • *
  • Mensagens: 483
    • msm
Base de dados e Serial Port em Visual C++
« 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  ;)

Offline SJD22

  • Mini Robot
  • *
  • Mensagens: 660
Re: Base de dados e Serial Port em Visual C++
« Responder #1 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.

Offline maurosmartins

  • Mini Robot
  • *
  • Mensagens: 483
    • msm
Re: Base de dados e Serial Port em Visual C++
« Responder #2 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.

Offline SJD22

  • Mini Robot
  • *
  • Mensagens: 660
Re: Base de dados e Serial Port em Visual C++
« Responder #3 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?

Offline maurosmartins

  • Mini Robot
  • *
  • Mensagens: 483
    • msm
Re: Base de dados e Serial Port em Visual C++
« Responder #4 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.

Offline SJD22

  • Mini Robot
  • *
  • Mensagens: 660
Re: Base de dados e Serial Port em Visual C++
« Responder #5 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.

Offline maurosmartins

  • Mini Robot
  • *
  • Mensagens: 483
    • msm
Re: Base de dados e Serial Port em Visual C++
« Responder #6 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

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Base de dados e Serial Port em Visual C++
« Responder #7 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.
Avr fanboy

Offline maurosmartins

  • Mini Robot
  • *
  • Mensagens: 483
    • msm
Re: Base de dados e Serial Port em Visual C++
« Responder #8 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.

Offline msr

  • Mini Robot
  • *
  • Mensagens: 798
Re: Base de dados e Serial Port em Visual C++
« Responder #9 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.

Offline maurosmartins

  • Mini Robot
  • *
  • Mensagens: 483
    • msm
Re: Base de dados e Serial Port em Visual C++
« Responder #10 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.

Offline rglove

  • Mini Robot
  • *
  • Mensagens: 527
Re: Base de dados e Serial Port em Visual C++
« Responder #11 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?
« Última modificação: 04 de Outubro de 2012, 22:55 por rglove »

Offline maurosmartins

  • Mini Robot
  • *
  • Mensagens: 483
    • msm
Re: Base de dados e Serial Port em Visual C++
« Responder #12 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.

Offline rglove

  • Mini Robot
  • *
  • Mensagens: 527
Re: Base de dados e Serial Port em Visual C++
« Responder #13 em: 05 de Outubro de 2012, 16:16 »
De nada, ainda bem que funciona  :D