Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
ASP.NET 2.0 / 3.5 / 4.0
Comunicazione Seriale RS232
martedì 02 ottobre 2007 - 10.03
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
cinquanta
Profilo
| Newbie
10
messaggi | Data Invio:
mar 2 ott 2007 - 10:03
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
13
messaggi | Data Invio:
mar 2 ott 2007 - 10:13
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
10
messaggi | Data Invio:
mar 2 ott 2007 - 10:14
Grazie gentilissimo ora provo subito.
cinquanta
Profilo
| Newbie
10
messaggi | Data Invio:
mar 2 ott 2007 - 10:45
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
8
messaggi | Data Invio:
gio 4 ott 2007 - 09:54
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
10
messaggi | Data Invio:
mer 31 ott 2007 - 17:08
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
8
messaggi | Data Invio:
ven 2 nov 2007 - 10:47
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
10
messaggi | Data Invio:
lun 5 nov 2007 - 08:00
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
10
messaggi | Data Invio:
lun 5 nov 2007 - 08:22
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
8
messaggi | Data Invio:
lun 5 nov 2007 - 09:29
ti mando via mail un pezzo di codice così eviti di impazzire...
ciao
cinquanta
Profilo
| Newbie
10
messaggi | Data Invio:
gio 8 nov 2007 - 13:17
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
}
Torna su
Stanze Forum
Elenco Threads
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 !