Principales respuestas
Problema puerto serial

Pregunta
-
Saludos, es la primera pregunta que realizo espero que se entienda...
Tengo un lector RFID conectado por el puerto serial y puedo capturar como string el identificador de una tarjeta (tag) usando visual studio 2010, mi pregunta es:
¿Como hacer un ciclo infinito a medida que un TAG se acerque al lector, guardar ese identificador en una base de datos, en donde cada identificador se le asocia a un usuario?
Adjunto código que estoy utilizando:
if (serialPort1.IsOpen) { estado.Text = "Conectado"; buttonStart.Enabled = false; buttonStop.Enabled = true; textBox1.ReadOnly = false; user.Enabled = true; string message = serialPort1.ReadLine(); textBox1.AppendText(message); string message2 = serialPort1.ReadLine(); textBox1.AppendText(message2);
Yo capturo el dato del tag en message pero para un segundo tag en un message2, me gustaria hacerlo de forma infinita...
Esperando una pronta y buena respuesta.
Respuestas
-
hola
pero porque no asocias el evento
entonces abres el puerto esperas a que se lance el evento que recepciona las lecturas
dee sta forma no necesitas ningun ciclo
Nota: tampoco usarias el serialPort1.ReadLine();, ya que esto lo recibes en el evento
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina- Propuesto como respuesta Sergio ParraModerator sábado, 8 de junio de 2013 20:08
- Marcado como respuesta LithiumCL domingo, 9 de junio de 2013 18:33
-
claro se deba a que ese evento se genera en un thread separado, no puedes acceder al textbox directo, habi olvidado ese punto
Acceder a un control desde otro hilo
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina- Marcado como respuesta LithiumCL domingo, 9 de junio de 2013 20:51
Todas las respuestas
-
-
hola
pero porque no asocias el evento
entonces abres el puerto esperas a que se lance el evento que recepciona las lecturas
dee sta forma no necesitas ningun ciclo
Nota: tampoco usarias el serialPort1.ReadLine();, ya que esto lo recibes en el evento
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina- Propuesto como respuesta Sergio ParraModerator sábado, 8 de junio de 2013 20:08
- Marcado como respuesta LithiumCL domingo, 9 de junio de 2013 18:33
-
-
-
-
Fíjate en el ejemplo del enlace de Leandro,
private static void DataReceivedHandler( object sender, SerialDataReceivedEventArgs e) { SerialPort sp = (SerialPort)sender; string indata = sp.ReadExisting(); Console.WriteLine("Data Received:"); Console.Write(indata); }
Este el el método que meneja dicho evento...la variable indata contiene los datos que se aun leído del puertoSi se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos
-
es posible que esa misma lectura lo envie a una base de datos "creando" un registro?
claro esa es la idea, en ese evento tomas la lectura que recibes en el puerto
depsues con esta haces lo que necesites, la registras, la muestras al usuario la escribes en un archivo
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina -
-
-
Es que agrego algo parecido a mi codigo, pero no puedo mostrar en un textBox el string indata en el FORM1...
namespace serial { public partial class Form1 : Form { public Form1() { InitializeComponent(); } class PortDataReceived { public static void serial() { SerialPort puertoserial = new SerialPort("COM9"); puertoserial.BaudRate = 9600; puertoserial.Parity = Parity.None; puertoserial.StopBits = StopBits.One; puertoserial.DataBits = 8; puertoserial.Handshake = Handshake.None; puertoserial.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); puertoserial.Open(); Console.WriteLine("Press any key to continue..."); Console.WriteLine(); Console.ReadKey(); puertoserial.Close(); } private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) { SerialPort sp = (SerialPort)sender; string indata = sp.ReadExisting(); Console.WriteLine("Data Received:"); Console.Write(indata); } } private void button1_Click(object sender, EventArgs e) { } private void textBox1_TextChanged(object sender, EventArgs e) { } } }
-
pero se supone que no tienes que copiar y pegar todos lo que se muestre, deberias entender algo del codigo para adaptarlo
para que usas el Console.WriteLine()
en tu codigo si es una aplciacion winfor, eso solo aplica a desarollos de tipo consola
por ejemplos esto
Console.WriteLine("Press any key to continue...");
esta de mas
ademas defines esto
class PortDataReceived { public static void serial()
pero donde creas la instancia de PortDataRecive ? donde invocas el metodo serial ?
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina -
se supone que debs trabjar con los eventos del formularios
public partial class Form1 : Form { public Form1() { InitializeComponent(); } SerialPort puertoserial; private void form1_Load(..) { puertoserial = new SerialPort("COM9"); puertoserial.BaudRate = 9600; puertoserial.Parity = Parity.None; puertoserial.StopBits = StopBits.One; puertoserial.DataBits = 8; puertoserial.Handshake = Handshake.None; puertoserial.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); puertoserial.Open(); } private void From1_Close(..) { puertoserial.Close(); } private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) { SerialPort sp = (SerialPort)sender; string indata = sp.ReadExisting(); TextBox1.Text = indata; } }
lo que acabo de pones no lo copies y pegues, sino que trata antes de entenderlo
completa la definicion de los eventos
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina -
-
estas recuperando la lectura que ingresa por el puerto serie
el sender es el serialport que lanza la accion
SerialPort.ReadExisting (Método)
Leandro Tuttini
Blog
Buenos Aires
Argentina -
-
Hola.
¿Pero cual es tu problema?,¿Por qué no puedes mostrar lo que recibes en el TexBox?, ¿Te da algún error?,¿No se escribe nada?. Leandro te lo ha escrito todo como tiene que ser. Lo único raro que veo es la configuración del puerto estas seguro que es Com9 muchos puertos serie para un ordenador.
Pon un punto de interrupción y revisa lo que hay en indata
private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) { SerialPort sp = (SerialPort)sender; string indata = sp.ReadExisting(); TextBox1.Text = indata; // Punto de interrupción en esta linea }
No hay problema bajo el Sol que no tenga solución. Nunca una noche ha vencido a un amanecer.
-
-
En esta línea me aparece el error:
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) { SerialPort serialport = (SerialPort)sender; string indata = serialport.ReadExisting(); textBox1.AppendText(indata); // En esta linea me marca el error cuando acerco la tarjeta. //Operación no válida a través de subprocesos: Se tuvo acceso al control 'textBox1' desde un subproceso distinto a aquel en que lo creó. }
Saludos.
-
claro se deba a que ese evento se genera en un thread separado, no puedes acceder al textbox directo, habi olvidado ese punto
Acceder a un control desde otro hilo
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina- Marcado como respuesta LithiumCL domingo, 9 de junio de 2013 20:51
-
-
Saludos.
Agrego una nueva consulta que me aparece en el textBox...
Lee el tag, pero me aparecen dos caracteres "extraños" al inicio y otro al final, el problema es que me hace un salto de linea (0A y 0D) y como le quiero agregar la hora / fecha (en otros dos textbox) me la escribe dos veces...
¿Como le puedo quitar todo los caracteres y el salto de linea para que me muestre en el textbox solo el tag?.
Agrego codigo:
SerialPort serialport = (SerialPort)sender; string indata = serialport.ReadExisting(); textBox1.AppendText(indata + "\n"); string hora; hora = DateTime.Now.ToString("hh:mm:ss\n"); textBox2.AppendText(hora + "\n"); string fecha; fecha = DateTime.Today.ToString("D"); textBox3.AppendText(fecha + "\n");
Esperando respuesta.