C# - Comunicação concorrente RS232

_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
 
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
 
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.
 
Back
Topo