Usuario
Recibir caracter del puerto serie

Pregunta
-
Hola:
Teniendo este código hecho. Tengo un textBox1 y un buton1 debtro del Form1. Si recibo un byte por ejemplo la "A" en hexadecimal y la "a". El textBox1 debe cambiar de color que desee cuando el puerto serie lo detecte. Por ejemplo, Si recibe la "A", el color de fondo del textBox se enciende en rojo como indica este código.
textBox1.BackColor = Color.Red;
Si detecta la "a", cambia de color el fondo a rojo oscuro del textVox1.
textBox1.BackColor = Color.Maroon;
Por ahora los códigos necesarios que tengo preparado hasta ahora es este;
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO.Ports; // No olvidar aquí. namespace Depepees_puerto_serie { public partial class Form1 : Form { // Utilizaremos un string como buffer de recepcion string Recibidos; public Form1() { InitializeComponent(); // Abrir puerto mientra se ejecute la aplicación if (!serialPort1.IsOpen) { try { serialPort1.Open(); } catch (System.Exception ex) { MessageBox.Show(ex.ToString()); } } // Ejecutar la funcion Recepcion por disparo del Evento 'DataReived' //serialPort1.DataReceived += new SerialDataReceivedEventHandler(Recepcion); } /* // Al recibir los datos private void Recepcion(object sender, SerialDataReceivedEventArgs e) { // Acumular los carácteres recibidos a nuestro 'buffer' (string) Recibidos += serialPort1.ReadExisting(); // Invocar o llamar al proceso de tramas this.Invoke(new EventHandler(Actualizar)); } // Procesar los datos recibidos en el buffer y extraer tramas completas private void Actualizar(object s, EventArgs e) { // Asignar el valor de la trama al textBox richTextBox1.Text = Recibidos; } */ string botonazo_1 = "a"; private void button1_Click(object sender, EventArgs e) { if (botonazo_1 == "a") { byte[] mBuffer = new byte[1]; mBuffer[0] = 0x41; // Es la letra "A". serialPort1.Write(mBuffer, 0, mBuffer.Length); //textBox1.BackColor = Color.Red; botonazo_1 = "b"; } else { byte[] mBuffer = new byte[1]; mBuffer[0] = 0x61; // Es la letra "a". serialPort1.Write(mBuffer, 0, mBuffer.Length); //textBox1.BackColor = Color.Maroon; botonazo_1 = "a"; } } } }
Saludo.
http://electronica-pic.blogspot.com
Todas las respuestas
-
Metaconta,
Entonces lo único que te queda por hacer es verificar el contenido de 'Recibidos'...
Recibidos.Contains("A" ) o Recibidos.Contains( "a" ) asignando el color pertinente.
Y posteriormente borrar el Buffer Recibidos = "";
Saludos,
Pep Lluis,
MVP - Visual Developer -
Hola:
He decidido leer hexadecimales.
// Procesar los datos recibidos en el buffer y extraer tramas completas private void Actualizar(object s, EventArgs e) { // Asignar el valor de la trama al textBox byte byte_recibido = Convert.ToByte(Recibidos); switch (byte_recibido) { // A switch section can have more than one case label. case 0x41: textBox1.BackColor = Color.Red; break; case 0x42: textBox2.BackColor = Color.Red; break; case 0x43: textBox3.BackColor = Color.Red; break; case 0x44: textBox4.BackColor = Color.Red; break; case 0x61: textBox1.BackColor = Color.Maroon; break; case 0x62: textBox2.BackColor = Color.Maroon; break; case 0x63: textBox3.BackColor = Color.Maroon; break; case 0x64: textBox4.BackColor = Color.Maroon; break; default: // Ignorar cualquier carácter que no reconozca. break; } }
No se si está bien. Código completo abajo.
Quiero lo mismo pero en byte, que en hexadecimal es así: 0x41 que es "A" y el 0x61 es la "a". ¿Se puede hacer?
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO.Ports; // No olvidar aquí. using System.Xml; namespace Depepees_puerto_serie { public partial class Form1 : Form { // Utilizaremos un string como buffer de recepcion string Recibidos; public Form1() { InitializeComponent(); // Abrir puerto mientra se ejecute la aplicación if (!serialPort1.IsOpen) { try { serialPort1.Open(); } catch (System.Exception ex) { MessageBox.Show(ex.ToString()); } } // Ejecutar la funcion Recepcion por disparo del Evento 'DataReived' serialPort1.DataReceived += new SerialDataReceivedEventHandler(Recepcion); } // Al recibir los datos private void Recepcion(object sender, SerialDataReceivedEventArgs e) { // Acumular los carácteres recibidos a nuestro 'buffer' (string) Recibidos += serialPort1.ReadExisting(); // Invocar o llamar al proceso de tramas this.Invoke(new EventHandler(Actualizar)); } // Procesar los datos recibidos en el buffer y extraer tramas completas private void Actualizar(object s, EventArgs e) { // Asignar el valor de la trama al textBox byte byte_recibido = Convert.ToByte(Recibidos); switch (byte_recibido) { // A switch section can have more than one case label. case 0x41: textBox1.BackColor = Color.Red; break; case 0x42: textBox2.BackColor = Color.Red; break; case 0x43: textBox3.BackColor = Color.Red; break; case 0x44: textBox4.BackColor = Color.Red; break; case 0x61: textBox1.BackColor = Color.Maroon; break; case 0x62: textBox2.BackColor = Color.Maroon; break; case 0x63: textBox3.BackColor = Color.Maroon; break; case 0x64: textBox4.BackColor = Color.Maroon; break; default: // Ignorar cualquier carácter que no reconozca. break; } } #region Botones enviar. private void button1_Click(object sender, EventArgs e) { byte[] mBuffer = new byte[1]; mBuffer[0] = 0x41; // Es la letra "A". serialPort1.Write(mBuffer, 0, mBuffer.Length); } private void button2_Click(object sender, EventArgs e) { byte[] mBuffer = new byte[1]; mBuffer[0] = 0x42; // Es la letra "B". serialPort1.Write(mBuffer, 0, mBuffer.Length); } private void button3_Click(object sender, EventArgs e) { byte[] mBuffer = new byte[1]; mBuffer[0] = 0x43; // Es la letra "C". serialPort1.Write(mBuffer, 0, mBuffer.Length); } private void button4_Click(object sender, EventArgs e) { byte[] mBuffer = new byte[1]; mBuffer[0] = 0x44; // Es la letra "D". serialPort1.Write(mBuffer, 0, mBuffer.Length); } #endregion private void Form1_Load(object sender, EventArgs e) { try { XmlReader r = XmlReader.Create("miXML.xml"); r.ReadStartElement("MiInfo"); textBox1.Text = r.ReadElementContentAsString(); textBox2.Text = r.ReadElementContentAsString(); textBox3.Text = r.ReadElementContentAsString(); textBox4.Text = r.ReadElementContentAsString(); r.ReadEndElement(); r.Close(); } catch { // No encuentra el archivo XML. } } private void button_activar_desactivar_textBox_Click(object sender, EventArgs e) { XmlWriter w = XmlWriter.Create("miXML.xml"); w.WriteStartElement("MiInfo"); w.WriteElementString("Boton1", textBox1.Text); w.WriteElementString("Boton2", textBox2.Text); w.WriteElementString("Boton3", textBox3.Text); w.WriteElementString("Boton4", textBox4.Text); w.WriteEndElement(); w.Close(); textBox1.Enabled = false; textBox2.Enabled = false; textBox3.Enabled = false; textBox4.Enabled = false; button_activar_desactivar_textBox.Enabled = false; button_Excribir_textBox.Enabled = true; } private void button_Excribir_textBox_Click(object sender, EventArgs e) { textBox1.Enabled = true; textBox2.Enabled = true; textBox3.Enabled = true; textBox4.Enabled = true; button_activar_desactivar_textBox.Enabled = true; button_Excribir_textBox.Enabled = false; } } }
http://electronica-pic.blogspot.com -
-
-
-
Hola Smithjhon te dire que estoy haciendo algo como metaconta de escho es lo mismo dado que fuy yo quien le pidio ayuda sobre este asunto,por otra parte meta estara en examenes y no te ha contestado te dire que soy mas que NOVICIO ha continuacion te explico lo que falta.Cada vez que pulso me manda un dato al pic y este responde con" A" esta encendido," a" esta apagado el 1º pic, "B" encendido "b" apagado el 2º pic "C" encendido "c" apagado el 3º pic y por ultimo "D" encendido "d" apagado,todo esto me funciona bien ahora lo que necesito que con estos datos los texbox cambien de color A 1º texbox B2º texbox C 3º texbox D 4º texbox.Te pongo el codigo y como te repito los pulsadores funciona.de antemano gracias,saludos
http://www.fileupyours.com/view/303869/Serial%20Port%2032.rarpepe
-
Hola Smithjhon no se que ha pasado que no se ha copiado vien el enlace,como te he dicho antes los pulsadores funcionan bien, los texbox necesito que cuando reciban los carecteres del los pic cambiende color.te repito que soy novicio si puedes se muy explicito te lo agradezco muy atte pepe saludos
Imports System.IO.Ports
Public Class Form_Principal
Public Sub New()
InitializeComponent()
If Not SerialPort1.IsOpen Then
Try
SerialPort1.Open()
Catch ex As Exception
MessageBox.Show(ex.ToString())
End Try
End If
End Sub
Private Sub Button_A_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_A.Click
Dim mBuffer As Byte() = New Byte(0) {}
mBuffer(0) = &H41 ' A en ASCII
SerialPort1.Write(mBuffer, 0, mBuffer.Length)
End Sub
Private Sub Button_B_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_B.Click
Dim mBuffer As Byte() = New Byte(0) {}
mBuffer(0) = &H42 'B en ASCII
SerialPort1.Write(mBuffer, 0, mBuffer.Length)
End Sub
Private Sub Button_C_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_C.Click
Dim mBuffer As Byte() = New Byte(0) {}
mBuffer(0) = &H43 'C en ASCII
SerialPort1.Write(mBuffer, 0, mBuffer.Length)
End Sub
Private Sub Button_D_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_D.Click
Dim mBuffer As Byte() = New Byte(0) {}
mBuffer(0) = &H44 'D en ascii
SerialPort1.Write(mBuffer, 0, mBuffer.Length)
End Sub
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
If SerialPor1.readexisting.contains(61) Then
texbox1.text.backcolor = Red
End If
End
Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
End Sub
Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged
End Sub
Private Sub TextBox4_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox4.TextChanged
End Sub
Private Sub Form_Principal_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
End Class
-
copia todo el contenido interno y lo pegas dentro de un boton deveria quedar algo asi pero que diga boton 1 o 2 lo que sea yo use el _ A _ de tu ejemplo
como sabes que la respuesta es 41 o puede ser 65 voy a estar en linea como 6 horas
Private Sub Button_A_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_A.Click
Dim mBuffer As Byte() = New Byte(0) {}
mBuffer(0) = &H41 ' A en ASCII
SerialPort1.Write(mBuffer, 0, mBuffer.Length)serialport1.readexisting()
If SerialPor1.readexisting.contains(41) then'("41")
texbox1.text.backcolor = Red
End If
End Sub
-
Hola Smithjhon,Eso es precisamente que cuando se reciba 41 ò 61 que seria "A" ò "a" se aloje en el texbox1 cuando reciba 42 ò 62 que es "B" ò "b" se aloje en el texbox 2 y asis con todos los demas,gracias por tu ayuda saludos pepe
PD yo tambien boy ha estar un buen rato
-
De lo que me dices de como se si es 41 ò 65 poes no se sabe.Te explico se trata de gobernar varios micros estos micros tienen un pulsador,igual que el interfaz que tiena 4 pulsadores,si tu pulsa indistintamente del pulsador del micro ò del pulsador del interfaz el micro invierte la posicion de como esta y te manda el dato de como esta, si por ejem pulsas el 1º pulsador que manda el dato "A" lo recibe el 1º micro, y te responde de como esta su salida si esta en alto te manda "A" si en bajo "a"pero si pulsas el pulsador del micro hace lo mismo asis con todos los micros cada uno con su dato el 2º micro responde con "B" ò "b" el 3º con "C" ò "c" el 4º con "D" ò "d" el saunto en que los texbox cambien de color al recibir el dato 1ºtexbox "A" rojo "a" blanco 2º texbox "B" rojo "b" blanco 3º texbox "C"rojo "c" blanco 4º texbox "D Rojo "d" blanco.Uno so sabe porque se puede pulsar desde los micros y estos no se ven fisicamente,gracias pepe
-
-
Me explicare mejo en realidad esto es para encender luces de unas aulas,se tienen que encender y apagar indistintamente desde el interfaz ò desde el mismo aula eso me funciona a la perfeccion desde el interfaz y desde las aulas lo que pasa es que si desde una aula enciende ò apagan en el interfaz no se como estan si encendidas ò apagada por eso es inportante que los texbox sean gobernador por el dato que recibe el PC ò interfaz que por supuesto no se sabe,lo que si se es que si recibo 41 tengo que poner el 1º texbox en rojo si es 42 2ª texbox en rojo en definitiva que con los datos recibidos en el interfaz enciendan y apagen los texbox
-
Por el momento yo me olvidaria de los pulsadores de interfaz y me centraria unicamente es que cuando en el PC reciba 41 encienda el 1º texbox con 61 lo page cuando reciba 42 encienda el 2º texbox 62 lo apage 43 encienda 3º texbox 63 lo apague 44 encienda el 4º texbo 64 lo apague hay que sentrarse en eso unicamente porque como te he dicho antes lo demas me funciona bien.Te dire que en esto de visual soy nuevo,con los micros me defiendo,te lo digo por si necesitas algo gracias pepe
-
el codigo que esta escrito en el post de hace un rato es el que te va a servir para que los textbox cambien de color pero solo te va a servir si de verdad el puerto resive el caracter 41,42,43,44 y si el puerto resive otro carcater por ejemplo 50 entonces no te sirve de nada por que ese caracter no esta en la condicion if contains. voy a hacer un ejemplo muy basico de lo que creo que estas haciendo
41,42,43,44 con estos enciende
61,62,63,64 con estos apaga
ya regreso con el ejemplo
ya lo probe con un dispositivo aca y funcionaSP.WriteLine(
"AT" & Chr(13))SP.ReadExisting()
TextBox1.BackColor = Color.Red
TextBox2.BackColor = Color.Black
-
Smithjhon he estado esperando tengo que irme a dormir aqui son las 3.30 PM cuando me mandes el codigo lo probare fisicamente y te dire como va, te dejo mi mail por si necesitas algo,gracias pepe. depepees@hotmail.com
-
-
Hola Smithjhon he estado probando de varias maneras y no hayo como,te dije que soy mas que nuevo en enero pasado me matricule en el curso y ya no habian plazas hasta septiembre no empiezo en una academia mientras tanto me gutaria progresar en lo que sea,te he puesto el codigo que he echo para que te des cuenta lo torpe que soy,si me lo puedes correjir te lo agradezco infinitamente.Gracias pepe
Imports System.IO.Ports
Public Class Form_Principal
Public Sub New()
InitializeComponent()
If Not SerialPort1.IsOpen Then
Try
SerialPort1.Open()
Catch ex As Exception
MessageBox.Show(ex.ToString())
End Try
End If
End Sub
Private Sub Button_A_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_A.Click
Dim mBuffer As Byte() = New Byte(0) {}
mBuffer(0) = &H41 ' A en ASCII
SerialPort1.Write(mBuffer, 0, mBuffer.Length)
End Sub
Private Sub Button_B_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_B.Click
Dim mBuffer As Byte() = New Byte(0) {}
mBuffer(0) = &H42 'B en ASCII
SerialPort1.Write(mBuffer, 0, mBuffer.Length)
End Sub
Private Sub Button_C_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_C.Click
Dim mBuffer As Byte() = New Byte(0) {}
mBuffer(0) = &H43 'C en ASCII
SerialPort1.Write(mBuffer, 0, mBuffer.Length)
End Sub
Private Sub Button_D_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_D.Click
Dim mBuffer As Byte() = New Byte(0) {}
mBuffer(0) = &H44 'D en ascii
SerialPort1.Write(mBuffer, 0, mBuffer.Length)
End Sub
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
SerialPort1.WriteLine(
"AT" & Chr(13)
SerialPort1.ReadExisting()
If SerialPort1.ReadExisting.Contains("41") Then
TextBox1.BackColor = Color.Red
ElseIf SerialPort1.ReadExisting.Contains("61") Then
TextBox1.BackColor = Color.GreenYellow
End If
End Sub
Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
End Sub
Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged
End Sub
Private Sub TextBox4_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox4.TextChanged
End Sub
Private Sub Form_Principal_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
End Class
-
-
-
-
-
-
-
-
ya regrese en el boton 5 de mi ejemplo mandaba el dato a todos los pulsadores al mismo tiempo y resivia el dato de todos los pusadores si quieres hacerlo boton por boton tienes que hacerlo asi
a cada boton le agregas el codigo de abir el puerto y configurar los bautate,bit pariedad ,etc ,abrir puerto y despues agregas esto
Dim mBuffer As Byte() = New Byte(0) {}
mBuffer(0) = &H44 'D en ascii
SerialPort1.Write(mBuffer, 0, mBuffer.Length)
if mbuffer.readexisting.contains(64) thentextbox4.backcolor=color.blanco
if end
si no me avisas y hacemos el teamviwier de nuevo pero boton por boton
-
-
-
-
en el lado izquierdo de la pantalla donde sale el boton,textbox,combobox,etc hay un icono de puerto com agregalo a la aplicacion y dale el valor de com 2 o de com 1 el que vos quieras tengo que salir chao como en 12 horas me puedo conectar
creo que dice cuadro de herramientas -
-
eso se hacerlo pero no quiero tocar nada porque ayer la le pose el codigo de un interruptor y lo he borrado esta mañana porque da error. dejo el ordenador abierto con la ultima clave que hew puesto tengo que salir ha comprar algo de comida pero ya estoy aqui
-
-
-
-
-
-
-
-
-
-
-
Hola Smithjhon en estaso repasando lo que icimos.ayer deje el ordenasor prendido todo el dia tambien estube pendiente por si te conectabas cunando depuro el codico por un instante me sale al conectarme en con 3 me sae EL PUESTO IS OPEN Y a continuacion me sale EL PUERTO IN CLOSE. Smothjhon ten presente que la mitad del codigo la hiciste con VB 2008 y la otra mitad con el 2010.Otra cosa en un instante y por una sola vez se me encendio el texbox.Yo estoy pendiente por si te conectas,ya tengo presente el cambio horario,saludos pepe
-
-
-
Sabes que esta pasando,cuando lo conecto el manda A;B;C;D; pues como el conecto RS232 tengo puenteadas las salidas 2y3 que la emision y recepcion pues que los datos que salen me entran otra vez como heco pro solo da tiempo ha que me entre el 1 dato porque se cierrar el port al segundo de todas formas algo funciona porque el 1º texbos se me pone rojo.Antes se me ponia el 2º texbox porque habia un error al enviar la "A" te espero pepe
-
-
-
Hola Smithjhon,Disculpa he estado fuera y no he podido conectarme,con respecto a lo que me pusiste pues no se que pasa,al pricipio funcionaba solo el 1 caracter y por lo tanto el 1 textbox, entonces estube pensando en lo que dice PepLuis en un enunciado anterior en esta misma pagina que habia que borrar el buffer Recibidos.Claro como tu pusiste en el mismo pulsador de conectar tambien pusiste enviar A;B;C;D en asunto es que no me funciona y he provado de todas formas
saludos y gracias por tu atencion pepe
-
-
-
Se me olvido decirte algo habiamos quedado que el 1ºtextbox se enciende con A y apaga con a el segundo con B y b y asis todos los demas pues aunque dispongo de microcontroladores yo hago lo siguiente :el 1º pulsador me manda A en 2º pulsador B el 3º pulsador a y el 4º pulsador b entonces puenteo lo pines 2y 3 del RG9 que corresponden a emision y recepcion de datos asi los datos que yo saco me entran como eco.asi me quito sospechas de si el micro funciona bien ò no y asis deberian funcionar los dos primeros textbox,saludos pepe
-
Hola Smithjhon yo estare esperando todo el dia aunque tengo que ausentarme despues para salir a comprar comida, Te dire que en el ordenador en el DB9 tengo hecho un puente entre el pin 2 y 3 para el dato que salga entre como eco.
dejo habierto 2 aplicaciones una la que tu hiciste en visual 2010, cuando abres sale el interfaz pero cuando te conectas, en un segundo desaparece.
Tambien tengo una que estoy haciendo yo en vb 2008 con cuatro pulsadores con las letras 1ºA 2ºB 3ºa 4ºb,los caracteres que salen escritos en el textbox 1 y ha continuacion le tengo puesto la instruccion que tu me dijiste,pues bien si en ("A") ò ("41") el caracter no pasa pero si dejo vacio ("") pasa cualquier caracter y enciende el textbox´Bueno Smithkhon te dejo la ID es 687 086 116 contraseña 3867 si hay algun problema cos comunicamos aqui saludos pepe
-
-
-