1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

C# - Comunicação concorrente RS232

Discussão em 'Programação' iniciada por _Meco_, 11 de Maio de 2009. (Respostas: 4; Visualizações: 2251)

  1. _Meco_

    _Meco_ Power Member

    Boas pessoal,

    preciso de fazer um programa 1server(com bd) <-> n clients que estão ligados por porta-série.
    A minha dúvida é... no C... faço a camada típica de porta-série e tal...
    E caso vários clientes tentem aceder ao mesmo tempo?

    é aqui que entra a concorrência... pois bem. posso escolher threads ou processos right?
    p_thread blabla Vs fork() / named pipes e nao sei que...

    qual o melhor?
    algum tutorial porreiro por aí?

    Desde já o meu muito obrigado.
    aquele abraço
     
  2. iznougud

    iznougud I quit My Job for Folding

    Tens 1 porta serie ou varias portas serie?
     
  3. _Meco_

    _Meco_ Power Member

    Boas!

    No cada cliente tem apenas uma porta série. O servidor terá portas série quantos clientes tiver.
    Fiz-me entender?

    Ou seja, basicamente seria por exemplo... imaginando que temos 100 clientes...

    SERVIDOR (com a base de dados)
    ---------------------------------------
    client1 client2 (client...) client100


    Cada um ligado por porta serie ao SERV, e sem nenhuma ligação entre clientes...

    basicamente os clientes terão que aceder ao servidor, fazendo pedidos ao mesmo para efectuar algo... no meu caso especifico:

    cada cliente é um armazém de logistica e fará pedidos ao ser do tipo INSERIR, REMOVER, ALTERAR encomendas...



    edit: mas segundo percebi pela tua pergunta. no codigo terei que ter uma rotina de recepção de várias portas no servidor. já no cliente apenas uma de envio e recepçao (ja que so faz ligaçao com serv). Uns tutoriais disto é que era... tou aqui um bocado as aranhas.. lol
     
  4. iznougud

    iznougud I quit My Job for Folding

    Sendo assim o melhor e criares uma classe que te trate das portas RS232. Assim por cada porta vais ter um objecto que tem uma porta série como elemento.

    Código:
    /*
     * Created by SharpDevelop.
     * User: Administrator
     * Date: 12-05-2009
     * Time: 18:35
     * 
     * To change this template use Tools | Options | Coding | Edit Standard Headers.
     */
    
    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Windows.Forms;
    using System.IO.Ports;
    using System.Diagnostics;
    using System.Collections;
    	
    namespace RS232
    {
    	/// <summary>
    	/// Description of MainForm.
    	/// </summary>
    	public partial class MainForm : Form
    	{
    		public MainForm()
    		{
    			//
    			// The InitializeComponent() call is required for Windows Forms designer support.
    			//
    			InitializeComponent();
    			
    			//
    			// TODO: Add constructor code after the InitializeComponent() call.
    			//
    		}
    		
    		public bool ExecutaComandoSQL(String comando)
    		{
    			// aqui entra o codigo que trata do SQL
    			return true;
    		}
    		
    		void MainFormLoad(object sender, EventArgs e)
    		{
    			ArrayList lista = new ArrayList();
    			
    			for(int i = 1; i < 10; i++)
    			{
    				Cliente p = new Cliente();
    				if(p.Start("COM"+i, this))
    				{
    					lista.Add(p);
    				}
    			}
    		}
    	}
    	public class Cliente
    	{
    		private System.IO.Ports.SerialPort rs232; 
    		private MainForm main;
    		
    
    		public bool Start(String porta, MainForm m)
    		{
    			try
    			{
    				rs232 = new System.IO.Ports.SerialPort();
    				rs232.PortName = porta;
    				rs232.BaudRate = 9600;
    				rs232.DataBits = 8;
    				rs232.StopBits = StopBits.One;
    				rs232.Parity = Parity.None;
    					
    				main = m;
    			
    				rs232.Open();
    				rs232.DataReceived += new SerialDataReceivedEventHandler(this.RecebeDados);
    				return true;
    			}
    			catch(Exception ex)
    			{
    				Debug.WriteLine("Erro a abrir a porta " + rs232.PortName + ": " + ex.Message );
    				return false;
    			}
    		}
    		
    		private void RecebeDados(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    		{
    			String dados = rs232.ReadExisting();
    			main.ExecutaComandoSQL(dados);
    		}
    	}
    }
    
    
    Vê esse código, costumo programas em VB.Net por isso pode nao estar tudo bem e não tenho aqui nada para testar a recepção de dados.

    Se reparares a Class Cliente tem 2 variáveis globais, uma porta série (rs232) e o apontador para o form principal (main). O rs232 vai-te tratar de receber os dados (activei o evento DataReceived para saberes sempre que alguma coisa chegou e nao teres de estar a espera) e depois vai executar uma funcao do Form principal onde supostamente fazes o tratamento dos dados e executas o comando SQL.

    Assim podes criar as portas que quiseres sem teres muito trabalho, basta criares objectos do tipo Cliente e indicares que a que porta corresponde.


    Tens de acertar os DataBits, StopBits e Parity para o que vais usar.
     
  5. _Meco_

    _Meco_ Power Member

    Thanks iznougud, vou tentar ver isso então ;)
     

Partilhar esta Página