Recibir datos desde puerto serial a visual studio 2010

Buenas gente:

Hoy en día desarrollo una aplicación para adquirir tres temperaturas la programcion del pic la hice en mikroC y el pic q uso es el 18f452 para enviar datos asta ahoria va todo bien eh logrado mandar correctamente los datos al programa q cree en vs .net .

El problema esta en que los datos los almaceno en un string q hace la funcion de un buffer y se los pasa a una caja de texto, pero quisiera separar las 3 temperaturas una en cada textbox .. lo cual no consigo asta ahorita solo eh logrado ponerlas y se me añaden en forma de lista en un texbox adjunto la imagen y el codigo para q vean lo q tngo.

si me podrian ayudar se los a gradeceria mucho.

Código:
'Utilizaremos un string como buffer de recepcion
    Dim Recibidos As String
    Private Sub Recepcion(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)
        ' Acumular los carácteres recibidos a nuestro 'buffer' (string)
        Recibidos += PuertoSerial.ReadExisting()
        ' Invocar o llamar al proceso de tramas
        Me.Invoke(New EventHandler(AddressOf Actualizar))
    End Sub

    ' Procesar los datos recibidos en el buffer y extraer tramas completas
    Private Sub Actualizar(ByVal s As Object, ByVal e As EventArgs)
        ' Asignar el valor de la trama al textBox
        TextBox1.Text = Recibidos

    End Sub
 

Adjuntos

  • Sin título.png
    Sin título.png
    30.6 KB · Visitas: 99
Es probable que estes enviando la informacion desde el PIC con un caracter de retorno de carro y alimentacion de linea, por eso te salga uno debajo del otro.

Prueba enviarlos todos separados por un caracter especial como por ejemplo "*" y usa la funcion "split" en VB, asi podras separar las cadenas en una matriz de string y direccionar los datos como quieras.

saludos.

PD.- ayudaria ver como envias los datos desde el pic
 
Recibidos += PuertoSerial.ReadExisting().......

siempre lo trabajo quitandole el + osea lo dejas de esta manera

Recibidos = PuertoSerial.ReadExisting()
 
Es probable que estes enviando la informacion desde el PIC con un caracter de retorno de carro y alimentacion de linea, por eso te salga uno debajo del otro.

Prueba enviarlos todos separados por un caracter especial como por ejemplo "*" y usa la funcion "split" en VB, asi podras separar las cadenas en una matriz de string y direccionar los datos como quieras.

saludos.

PD.- ayudaria ver como envias los datos desde el pic

Oh gracias si los envio asi tal como dices mira
Código:
while(1) //Bucle infinito.
{
                    Lcd_Out(2, 1, "Termometro 1: ");
                   
                       FloatToStr( (adc_read(1)*0.48875),Text);
                       Lcd_Out(2,14,text);
                       uart1_write_text(text);
                       UART1_Write(13); //Se transmite el ASCII del ENTER.
                       UART1_Write(10); //Se transmite el ASCII del retroceso del carro.

                     Lcd_Out(3, 1, "Termometro 2: ");
                    
                       FloatToStr( (adc_read(2)*0.48875),Text);
                       Lcd_Out(3,14,text);
                       uart1_write_text(text);
                       UART1_Write(13); //Se transmite el ASCII del ENTER.
                       UART1_Write(10); //Se transmite el ASCII del retroceso del carro.
                     Lcd_Out(4, 1, "Termometro 3: ");
                    
                       FloatToStr( (adc_read(3)*0.48875),Text);
                       Lcd_Out(4,14,text);
                       uart1_write_text(text);
                       UART1_Write(13); //Se transmite el ASCII del ENTER.
                       UART1_Write(10); //Se transmite el ASCII del retroceso del carro.
                       
                       Delay_ms(1000);
}

Si pudieses darme un pequeño ejemplo de como hacer dicha matriz y redireccionarlo te estaría muy agradecido

Eh intentado haciendo esto pero los datos no se me actualizan cuando cambian las temperaturas.

Código:
 Private Sub Recepcion(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)
        ' Acumular los carácteres recibidos a nuestro 'buffer' (string)
        Recibidos += PuertoSerial.ReadExisting()
        ' Invocar o llamar al proceso de tramas
        Me.Invoke(New EventHandler(AddressOf Actualizar))

    End Sub

    ' Procesar los datos recibidos en el buffer y extraer tramas completas
    Private Sub Actualizar(ByVal s As Object, ByVal e As EventArgs)
        ' Asignar el valor de la trama al textBox
        TextBox1.Text = Recibidos
        Me.Invoke(New EventHandler(AddressOf separar))
    End Sub

Sub separar()

        Dim Array_buffer() As String
        Dim n As Integer

        Array_buffer = Split(Recibidos, vbCr)

        For n = 0 To UBound(Array_buffer)

            If n = 0 Then
                TextBox2.Text = Array_buffer(n)
            End If
            If n = 1 Then
                TextBox3.Text = Array_buffer(n)
            End If
            If n = 2 Then
                TextBox4.Text = Array_buffer(n)
            End If

        Next
    End Sub

Ayudaa T_T
 
Última edición:
Yo lo enviaria de la siguiente manera:

Código:
      printf("%3.1w*",temperatura1);
      printf("%3.1w*",temperatura2);
      printf("%3.1w*",temperatura3);
      printf("%3.1w\r\n",temperatura4);

Ojo con el caracter "*" que es el que une las cadenas. en VB recibirias algo asi por ejemplo:

60.5*22.9*22.3*55.1

estas seria las temperaturas que estas enviando separadas por el caracter especial.

Luego en VB usarias un codigo:

Código:
buffer_in = Serial_1.ReadLine

Ahi tendrias toda la cadena en la variable string buffer_in.

Luego creas una matriz de string:

Código:
Dim tabla() As String
tabla = Split(buffer_in, "*")
temperatura1= Val(tabla(0))
temperatura2 = Val(tabla(1))
temperatura3 = Val(tabla(2))
temperatura4 = Val(tabla(3))

y asi tienes tus 4 temperaturas separadas.

espero te ayude.

saludos
 
Hola.
Ayuda otra vez.

De antemano agradezco la atención prestada, estaba haciendo pruebas a mi dispositivo en conjunto con el programa y me ocurrió en evento accidentalmente el cable se desconecto de la pc y el programa en mi pc no hizo nada solo se quedo en la pantalla con las ultimas temperaturas enviadas, lo cual me hizo pensar en si hay alguna forma en visual de controlar en tiempo de ejecución que el este conectado y mandado señales ya he intentado de varias maneras pero no logro hacerlo.

En resumen ¿Como podría hacer que al momento de qué ocurra una desconexión por parte del dispositivo(pic) ocasionando que este deje de enviar datos el programa se detenga o muestre en pantalla un mensaje de alerta?
 
Última edición por un moderador:
hola compañero.. Yo estoy haciendo casi lo mismo que tú pero con puesto usb. Debes usar en vb el objeto reloj, junto con un Try cash para manejar ese tipo de eventos..
 
Saludos, espero me puedan ayudar ya que he buscado por toda la Web y no encuentro solucion a un pequeño detalle que se me esta escapando y no se cual es.

Hice la programacion del pic16f877a para conectar a través del puerto serial de mi PC.

El circuito tiene un led en el puerto B1 para encender/apagar mediante un 1 o 0 que se envie desde la interfaz en visual Basic 2010.

La conexión se realiza correctamente entre la PC y el Pic (o eso creo :confused:)

El problema radica en que envio y recibo datos erroneos, es decir, mando un 1 a través de la interfaz y me retorna desde el PIC un "L" (estoy mandando desde el pic la misma informacion que recibo de la pc, osea, si mando 1 debe regresarme un 1)

Ya he revisado toda la programacion, como dije la conexion esta bien, el envio de datos lo hace ya que si puenteo o uno los pines 2 y 3 del puerto serial, ahi si recibo los datos correctamente, es decir, si envio un 1 recibo ese mismo 1.

No se en que parte este el error, he estado analizando y creo q puede ser porque no estoy usando un MAX232, puede ser este el error?? o donde puede estarlo??

Espero me entiendan la situación, y ojala alguien pueda ayudarme.


Aqui esta la programación de Visual Basic 2010

Código:
Public Class Form1

    Dim recibe As String = ""

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        For Each PuertoSerial As String In My.Computer.Ports.SerialPortNames
            ComboBox1.Items.Add(PuertoSerial)
        Next

        If ComboBox1.Items.Count > 0 Then
            ComboBox1.Text = ComboBox1.Items(0)
        Else
            ComboBox1.Enabled = False
        End If
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Application.Exit()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Try
            If (Button2.Text = "Conectar") Then
                SerialPort1.PortName = ComboBox1.Text
                SerialPort1.BaudRate = 9600
                SerialPort1.Parity = IO.Ports.Parity.None
                SerialPort1.StopBits = IO.Ports.StopBits.One
                'SerialPort1.Encoding = System.Text.Encoding.Default
                SerialPort1.Open()
                Button2.Text = "Desconectar"
                Label2.Enabled = True
                Label3.Enabled = True
                TextBox1.Enabled = True
                Button3.Enabled = True
                Timer1.Enabled = True
            Else
                SerialPort1.Close()
                Button2.Text = "Conectar"
                Label2.Enabled = False
                Label3.Enabled = False
                TextBox1.Enabled = False
                Button3.Enabled = False
                Timer1.Enabled = False
            End If

        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical)
        End Try
        
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Try
            SerialPort1.DiscardOutBuffer()

            SerialPort1.Write(TextBox1.Text)
            Label4.Text = "Dato enviado correctamente"
            TextBox1.Text = ""
            TextBox1.Focus()
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical)
        End Try
        
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        recibe = SerialPort1.ReadExisting
        If recibe <> "" Then
        TextBox2.Text = recibe
        SerialPort1.DiscardInBuffer()
        End If
    End Sub

End Class

------------------------------------------------------

Programación del PIC16F877A con MikroC

Código:
char uart_rd;

void main() {

  PORTB=0;
  TRISB=0;
  TRISC.F6=0; // configuro como salida el puerto TX
  TRISC.F7=1; // configuro como entrada el puerto RX
  PORTC=0; // configuro como salida todo el puerto C
  
  UART1_Init(9600);              // Inicializar el módulo UART a 9600 bps
  Delay_ms(100);                 // Esperar a que señal de reloj del módulo UART se
                                 // ponga estable
 [B] UART1_Write_Text("Start");[/B]
   UART1_Write(10);                      // Line Feed
  UART1_Write(13);                      // Carriage Return
  delay_ms(1000);
  
  
  while (1) {                    // Bucle infinito
    if (UART1_Data_Ready()) {    // Si el dato se ha recibido,
      uart_rd=UART1_Read();    // lea el dato recibido por la Pc a traves de la interfaz
         if(uart_rd){
                  PORTB=0b00000010;
                  UART1_Write(uart_rd);      // regreso el mismo dato recibido a la Pc
                  delay_ms(1000);
                  break;
         }

    }
  }
}

En la parte del UART1_Write_Text("Start"); supuestamente en la interfaz debe salirme la palabra "Start", sin embargo lo que recibo son signos!!

Adjunto todos los archivos.

Gracias por la ayuda de antemano.
 

Adjuntos

  • comunicacion_serial.rar
    1.3 MB · Visitas: 339
Atrás
Arriba