collapse

* Links de Robótica

* Posts Recentes

URGENTE - display de 7 segmentos com backpack por helderjsd
[Hoje às 12:30]


Preços e fabricantes de pcb por Sérgio_Sena
[Ontem às 10:20]


Palavras Cruzadas por Njay
[Ontem às 02:24]


Isaac Asimov - I, Robot por senso
[18 de Setembro de 2017, 03:41]


Apresentação por TigPT
[17 de Setembro de 2017, 07:31]


ic SL440 da Plessey? por senso
[16 de Setembro de 2017, 13:11]


Compra Colectiva RS-Amidata por brunus
[15 de Setembro de 2017, 22:31]


Ideias para construir um quadrúpede simples por zordlyon
[15 de Setembro de 2017, 10:18]


Preparar bancada de testes por jm_araujo
[14 de Setembro de 2017, 10:24]


Mitos: mudança da ilumação tradicional p/ iluminação a LEDs? por LVirtual
[14 de Setembro de 2017, 07:46]

Autor Tópico: Porta serie, eventos e dores de cabeça  (Lida 927 vezes)

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

Offline maurosmartins

  • Mini Robot
  • *
  • Mensagens: 483
    • msm
Porta serie, eventos e dores de cabeça
« em: 08 de Novembro de 2011, 01:17 »
Boas pessoal,

na continuação do projecto em que tenho vindo a trabalhar (módulos RF, MySQL, gráficos online), hoje trago-vos mais uma questão caso possam ajudar.

Tenho já em funcionamento uma aplicação em C# que lista as portas serie disponíveis e permite ligar à desejada e vai fazendo o parsing de uma sting recebida através da porta série algo do género "1,12,23,20" em que os campos sao o ID, Contador, temperatura, bateria.

A aplicação funciona mas assim que me ligo à porta o GUI deixa de estar acessível (eu sei, erro de novatos) no entanto o programa continua a funcionar e preenche a base de dados à medida que chegam novas strings.

A solução que encontrei para que o GUI não bloqueie foi o uso de threads. Criei uma pequena aplicação em linha de comandos para testar o seu funcionamento:
Código: [Seleccione]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
       
        static SerialPort _port;
        static private string dados;

        public delegate void evento(object _port, EventArgs args);
        public event evento OnNewString;

        static void Main(string[] args)
        {
            _port = new SerialPort("COM4");
            _port.BaudRate = 115200;
            _port.DataBits = 8;
            _port.Parity = Parity.None;
            _port.StopBits = StopBits.One;

            _port.ReadTimeout = 20000;

            Console.WriteLine("inicio");

            Thread readThread = new Thread(Read);

            //_port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
            _port.Open();

            readThread.Start();

        }

        private static void Read(){

            while (true)
            {
                Console.WriteLine("A ttar ler....");

                string message = _port.ReadTo("\n");

                Console.WriteLine("li {0} \n", message);
                dados = message;

                //OnNewString(_port, new EventArgs());

            }
           
        }

        private static void DataReceivedHandler(object sender,SerialDataReceivedEventArgs e)
        {
            Console.WriteLine("Evento " + dados);
           
        }



    }
}

O que queria fazer agora era lançar um evento, por exemplo "OnNewString" que informasse que a thread tinha uma nova string e posteriormente (na aplicação com GUI) fazer o update dos campos, no entanto nao estou a conseguir fazer nenhuma das duas coisas.

Se puderem ajudar ficaria bastante agradecido. Desde já obrigado,

Cumps, Mauro.
« Última modificação: 13 de Janeiro de 2012, 22:55 por Psycop »