Comunicazione Seriale RS232

martedì 02 ottobre 2007 - 10.03

cinquanta Profilo | Newbie

Ciao a tutti ho un problema.

Qui con me c'è una bilancia ad uso industriale che devo collegare al mio software per ricevere il perso. Aprendo hiperterminal e creando una connessione la periferica comunica e mi torna il peso ma quando lo faccio con .net c# mi da errore di time out in lettura e penso che non invii nemmeno i dati, ma la connessione la apre !! Aiutatemi, nessuno a mai fatto lavori di questo tipo?


SerialPort sp = new SerialPort("COM1", 2400, Parity.Even, 7, StopBits.Two);

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
sp.Handshake = Handshake.XOnXOff;
sp.Open();
sp.ReadTimeout = 5000;
}



private void button1_Click(object sender, EventArgs e)
{
try
{
sp.WriteLine(Manda.Text);
Leggi.Text = sp.ReadLine();
sp.Close();
}
catch (System.Exception ex)
{
Errore.Text = "";
Errore.Text = ex.Message;
}
}

Walimay Profilo | Newbie

Credo che tu debba leggere i dati usando l'evento serialport.datareceived

Se crei la porta con il withevents hai anche quell'evento che viene attivato quando la seriale riceve il numero di bytes indicati nella proprieta' receivedbytesthresold (o qualcosa di simile).

Io ho usato quello per ricevere dati da uno strumento, e funziona.

Occhio solo ad una cosa, l'evento gira in un thread diverso e da li' non puoi aggiornare forms od oggetti che sono istanziati dal thread principale.

per farlo devi usare i delegates ed il metodo invoke del controllo che intendi aggiornare.

Ciao.
Max
Walimay

newbie developer in vb.net

Sistemista ambiente MSWindows

cinquanta Profilo | Newbie

Grazie gentilissimo ora provo subito.

cinquanta Profilo | Newbie

Non funziona non solleva mai l'evento penso che allora il comando che invia non fa nulla ....


SerialPort sp = new SerialPort("COM1", 2400, Parity.Even, 7, StopBits.Two);

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{

sp.Handshake = Handshake.XOnXOff;
sp.DataReceived += new SerialDataReceivedEventHandler(e_leggi);
sp.Open();
sp.ReadTimeout = 5000;
sp.WriteLine("S");
sp.Close();
}


private void e_leggi(object sender, SerialDataReceivedEventArgs e)
{
Leggi.Text = sp.ReadExisting();
}

rdxreg Profilo | Newbie

mannaggia ragazzi, ci ho passato le notti sopra alla seriale collegata ad una bilancia ancora con .Net 1.1 e non c'era la serialport! ora è tutto più semplice.

Intanto la bilanca di solito aspetta un segnale dalla tua applicazione. Dal tuo codice vedo che gli mandi una S, sei sicuro che quello sia il segnale che la bilancia si aspetta come segnale per mandarti il peso? (alla mia che è una Mettler devo mandare un ACK SI CRLF)
Poi devi capire se il peso lo devi leggere in continuazione (che è quello che dovevo fare io) oppure solo una volta che si è stabilizzato. In tal caso leggi il peso e poi mandi di nuovo il comando di rilevazione peso e così finché ti serve.
Come ti ha già risposto qualcuno devi usare correttamente delagates e invoke per scrivere i dati che ricevi sul form della applicazione.
Ricordati di svuotare il buffer prima di iniziare a leggere i dati (anche di questo dovresti trovare il comando sul manuale della tua bilancia).
Ti consiglierei anche di impostare handshake su None.

Auguri!!!

cinquanta Profilo | Newbie

Ciao anche la mia è una mettler come fai a svuotare il buffer?
ora ho provato cosi ma va sempre in timeout operazione:


using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO.Ports;
namespace Bilancia
{
delegate void Manda(String s);


class Program
{

static void Main(string[] args)
{

Manda M = Manda;

M("S");


}



static void Manda(String s)
{

SerialPort sp = new SerialPort("COM1", 2400, Parity.Even, 7, StopBits.Two);
sp.Handshake = Handshake.None;
sp.ReadTimeout = 5000;
sp.Open();

sp.WriteLine(s);
Console.WriteLine(sp.ReadLine());
sp.Close();


}

}
}

rdxreg Profilo | Newbie

ti ho mandato via mail il codice, che comunque riporto qui:
1) in questo modo azzeri la bilancia (come premere il pulsante apposito sul
display):

SerialPort ComPort = new SerialPort();
private string sCRLF = Convert.ToString(Convert.ToChar(13)) +
Convert.ToString(Convert.ToChar(10));
private string sACK = Convert.ToString(Convert.ToChar(06));
ComPort.Write(sACK + "Z" + sCRLF);

2) in questo modo azzeri la tara:
ComPort.Write(sACK + "T" + sCRLF);

3) in questo modo cancelli il buffer dei dati che il pc sta ricevendo dalla
bilancia e quelli che ha ancora in coda da spedire:
ComPort.DiscardInBuffer()
ComPort.DiscardOutBuffer()

Però devi usare correttamente i thread perché la comunicazione con la seriale lavora su un altro thread rispetto a quello della tua interfaccia, quindi non puoi inviare una stringa alla bilancia ed aspettarti la risposta nello stesso thread.

Inoltre: i dati dalla bilancia li devi leggere solo una volta che sono stabilizzati (per esempio per pesare le pagate in un banco al mercato), oppure la lettura deve essere continua perché devi, per esempio, visualizzare in un form il peso che cambia mentre versi dell'acqua in un recipiente che sta sulla bilancia???
E poi: devi anche gestire la rilevazione del peso per registrarlo in qualche db?

Sono tutte cose che vanno a complicare la tua gestione.
Ciauzzz

cinquanta Profilo | Newbie

Ok ora provo mi sa che i tuo comandi sono molto piu giusti dei miei. Non devo salvare nulla faccio solo un eseguibile che quando lo chiamo mi restituisce il peso. Per ora grazie mille sei l'unico che mi riesce a dare una mano con questo problema contorto.

cinquanta Profilo | Newbie

Perfetto ora il reset della tara lo fa correttamente i tuoi comandi sono perfetti ! Mi manca solo la lettura ma ce la farò

rdxreg Profilo | Newbie

ti mando via mail un pezzo di codice così eviti di impazzire...
ciao

cinquanta Profilo | Newbie

Non solleva mail l'evento della ricezione come mai ?

class Collegamento
{
SerialPort sp;
String s_messaggio;
String s_ritorno;

public Collegamento()
{
sp = new SerialPort("COM1", 2400, Parity.Even, 7, StopBits.Two);
sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
sp.Handshake = Handshake.XOnXOff;
sp.ReadTimeout = 500;

}

public void ApriConnessione()
{
sp.Open();

}

public void ChiudiConnessione()
{
sp.Close();
}

public bool StatoConnessione()
{
if (sp.IsOpen == true)
{
return true;
}
else
{
return false;
}
}

public void SvuotaBuffer()
{
sp.DiscardInBuffer();
sp.DiscardOutBuffer();
}

public void InviaStringa()
{

String sCRLF = Convert.ToString(Convert.ToChar(13)) + Convert.ToString(Convert.ToChar(10));
String sACK = Convert.ToString(Convert.ToChar(06));
sp.Write(sACK + s_messaggio + sCRLF);


}

void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
s_ritorno = sp.ReadLine().ToString();
//throw new Exception("The method or operation is not implemented.");
}




#region get set Variabili

public String ritorno
{
get
{
return s_ritorno;
}
set
{
s_ritorno = value;
}
}

public String messaggio
{

get
{
return s_messaggio;
}

set
{
s_messaggio = value;
}
}

#endregion

}
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5