TODOPIC

Lenguajes de programación para PC => Visual Basic => Mensaje iniciado por: smartpic1.2 en 12 de Junio de 2013, 19:52:03

Título: Comunicación serial y VB.Net
Publicado por: smartpic1.2 en 12 de Junio de 2013, 19:52:03
Buenas tardes, he realizado una interface muy elemental en VB.Net para probar el funcionamiento del circuito (16F877A y en MikroC)  lo que hace volcar el dato recibido en buffer del PIC al puerto D, lo he probado en la tierra prometida virtual(PROTEUS) y me funciona sin incovenientes pero al implementarlo en fisico funciona bien pero de manera aleatoria la interfaz me envía caracteres que no he programado, es decir si pulso un boton "GIRAR 0°" segun lo  programado debe enviar por el puerto serial el caracter "1" contenida en la variable servo y luego el PIC lo recibe lo compara y ejecuta la acción programada para esto si son iguales , por el momento tengo conectado un LCD para poder visualizar lo que estoy recibiendo y fue ahi donde me di cuenta que la presionar varias veces el boton"GIRAR 0°" recibo en el PIC los valores ASCII 49 (lo que es correcto para el caracter 1 programado en la interfaz) pero tambien recibo 190, 250, 240  de forma aleatoria, lo curioso es que si envio los datos de control "GIRAR 0°" (1), GIRAR 90°(2), GIRAR 180°(3) desde el hyperterminal funciona sin errores de igual manera si lo ejecuto del monitor serial del mismo MikroC, si me pudieran orientar en la resolución de este problema. Adjunto el programa en VB.NET y la programacion en MikroC
PD: La idea es controlar unos 4 servomotores, lo estoy haciendo por partes y verificando el correcto funcionamiento de cada una de ellas y despues agregarle un control por RF.
Por que todo lo referente a VB siempre esta en VB.6 y en .NET

Programacion en VB.NET

Imports System.IO
Imports System.IO.Ports
Imports System.Threading


Public Class Form1
    Dim a As Boolean
    Dim servo As Byte
    Dim manual As Byte

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        SerialPort1.Close()
        SerialPort1.PortName = "com14" ' Cambia el Puerto por que el este disponible según el COM libre
        SerialPort1.BaudRate = 9600
        SerialPort1.DataBits = 8
        SerialPort1.Parity = Parity.None
        SerialPort1.StopBits = StopBits.One
        SerialPort1.Handshake = Handshake.None
        SerialPort1.Encoding = System.Text.Encoding.Default

    End Sub

    Private Sub GroupBox1_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GroupBox1.Enter

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        a = False
        SerialPort1.Open()
        servo = 1
        SerialPort1.Write(servo)
        TextBox1.Text = ("    GIRO A LA IZQUIERDA")
        SerialPort1.Close()
        manual = 7

    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        a = False
        SerialPort1.Open()
        servo = 3
        SerialPort1.Write(servo)
        TextBox1.Text = "     GIRO A LA DERECHA" '
        SerialPort1.Close()
        manual = 25


    End Sub
    Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click

    End Sub

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        If a = True Then
            SerialPort1.Open()
            SerialPort1.Write(manual)
            SerialPort1.Close()
        End If
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        a = False
        SerialPort1.Open()
        servo = 2
        SerialPort1.Write(servo)
        TextBox1.Text = "          EJE EL CENTRO"
        SerialPort1.Close()
        manual = 16


    End Sub

    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged

    End Sub

    Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click


        If manual > 7 Then
            manual = manual - 1
            TextBox1.Text = manual * 10
            a = True

        End If
    End Sub

    Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click


        If manual < 25 Then
            manual = manual + 1
            TextBox1.Text = manual * 10
            a = True
        End If
    End Sub
End Class

programacion en mikroC
//declarar variables del funcionamiento de la LCD
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
 unsigned   DATO_RECIBIDO;    // dimension del variable donde se almacenara lo que lea del puerto serial
 char txt1[] = "DATO RECIBIDO:";
 char txt2[8];

void main() {
portd=0;
trisd= 0;     //puerto D como salida

//delay_ms(500);
portd=0;
Lcd_Init();                               // Inicializo la LCD
  Lcd_Cmd(_LCD_CLEAR);                    // borro la LCD
  Lcd_Cmd(_LCD_CURSOR_OFF);               // apago cursor
  Lcd_Out(1,1, txt1);                     //escribo DATO RECIBIDO
//inicio de la comunicacion serial
UART1_Init(9600);                         // Inicializo la UART  9600 bps
  Delay_ms(100);                          //tiempo de la estabilizacion
  while (1) {                             // ciclo de lectura de datos
    if (UART1_Data_Ready()) {             // si  hay datos en el buffer del pic
      DATO_RECIBIDO = UART1_Read();       // los leeo y los guardo en la variable DATO_RECIBIDO

      }
      switch (DATO_RECIBIDO){
      case 49: portd=60;  break;          //evaluo si el DATO_RECIBIDO es igual a 65 y si es true ejecuto portd=60
      case 50: portd=125; break;          //evaluo si el DATO_RECIBIDO es igual a 66 y si es true ejecuto portd=125
      case 51: portd=255; break;          //evaluo si el DATO_RECIBIDO es igual a 67 y si es true ejecuto portd=255
      }
     
      wordToStr(DATO_RECIBIDO, txt2);      //convierto a string los datos recibidos para mostrarlo en la LCD
      Lcd_Out(2,3,txt2);

      }
}
Título: Re: Comunicación serial y VB.Net
Publicado por: Darkman_A en 12 de Junio de 2013, 21:49:23
Hola Smartpic
¿Podrias poner lo que tenes (codigo del PIC, codigo en Visual Basic, esquema, etc.) en un archivo comprimido (RAR, ZIP) y subirlo?
Fijate tambien que cuando escribis en el editor del site (donde estan los iconos, los tipos de letras, etc) hay un control con un simbolo # que es para insertar codigo (mas o menos debajo de la A roja.
Código: [Seleccionar]
Aca va tu codigo

Yo prefiero bajar los archivos y verlos, en lugar de andar subiendo y bajando (porque si es muy largo el codigo, el control te pone una barra de desplazamiento) ;-)
Antes que te rete algun moderador, te lo cuento yo. :smiley:

Saludos.
Título: Re: Comunicación serial y VB.Net
Publicado por: smartpic1.2 en 13 de Junio de 2013, 02:39:50
Darkman_A , gracias por la recomendación, adjunto los archivos.
Título: Re: Comunicación serial y VB.Net
Publicado por: Darkman_A en 13 de Junio de 2013, 09:52:43
Darkman_A , gracias por la recomendación, adjunto los archivos.

Hola smartpic. Buenos dias.
Estoy mirando los archivos.
Si tengo novedades te aviso.
Saludosl
Título: Re: Comunicación serial y VB.Net
Publicado por: Darkman_A en 13 de Junio de 2013, 10:01:46
Hola smartpic.
Por lo que interprete de tu primer mensaje es que probaste con el hiperterminal, en reemplazo de tu programa, y el PIC. No se si lo hiciste, pero porque no probas con tu programa y el hiperterminal en reemplazo del PIC. O sea:
 "Programa en VB" <-------> "Hiperterminal"
Para ver que recibis. Para esta prueba vas a necesitar un cable null modem (RS232 cruzado).
Saludos.










Título: Re: Comunicación serial y VB.Net
Publicado por: smartpic1.2 en 13 de Junio de 2013, 14:45:19
hola Darkman_A  gracias por el apoyo, he probado lo que me comentas pero de manera virtual, es decir realizo la conexion VB.NET con el HYPERTERMINAL mediante el VSPE (virtual serial) y me funciona  bien, recibo los caracteres programados sin problemas. Lo que no me queda muy claro es si el HYPERTERMINAL tiene predeterminado alguna configuracion que desconzco es decir en mi programa en VB no envio cararteres como CL y CR, la falta de esto afectará en el funcionamiento del circuito otra cosa se me ocurre es cuando lo simulo en PROTEUS tampoco me falla cuando lo pruebo con mi interfaz en VB, en PROTEUS como es que configura por defecto la comunicación con el COMPIM o algún detalle que no logro todavía vislumbrar  :cry:.
 
Título: Re: Comunicación serial y VB.Net
Publicado por: Darkman_A en 13 de Junio de 2013, 15:10:24
hola Darkman_A  gracias por el apoyo, he probado lo que me comentas pero de manera virtual, es decir realizo la conexion VB.NET con el HYPERTERMINAL mediante el VSPE (virtual serial) y me funciona  bien, recibo los caracteres programados sin problemas. Lo que no me queda muy claro es si el HYPERTERMINAL tiene predeterminado alguna configuracion que desconzco es decir en mi programa en VB no envio cararteres como CL y CR, la falta de esto afectará en el funcionamiento del circuito otra cosa se me ocurre es cuando lo simulo en PROTEUS tampoco me falla cuando lo pruebo con mi interfaz en VB, en PROTEUS como es que configura por defecto la comunicación con el COMPIM o algún detalle que no logro todavía vislumbrar  :cry:.

Hola smartpic.
Ya habias comentado que en el simulador te andaba, pero que en "la vida real" no funcionaba, entonces ....... tenes que probar en la "vida real", porque sino siempre vas a estar en la misma. Me a pasado de tirar 2 cables exactamente iguales, uno al lado del otro (para unas terminales que usaban coneccion serie), uno me andaba y el otro no.
Asi que amigo, a arremangarse y a luchar con circuitos y cables, no te queda otra. Por mas que sea un error en tu programa vas a tener que probarlo con el circuito real, salvo que no lo quieras implementar (metes todo en un DVD y a otra cosa).
Te cambio el tema. No creo que sea el LF y CR (salto de line, retorno de carro). Si tu programa no lo envia Hiperterminal no lo interpreta. Por ejemplo, si vos le envias 3 veces seguido la palabra HOLA desde tu programa, Hiperterminal mostraria HOLAHOLAHOLA. Solo eso. No hace el salto de carro.
Yo te dije que probaras con eso y no sabia si contabas con 2 equipos. Luego de postear lo pense. Fijate si algun amigo o familiar te puede prestar alguno para hacer las pruebas. De paso te cuento que hay algunos programas terminales mejor que Hiperterminal porque te muestra mas informacion. Por ejemplo si le mandas caracteres no imprimibles como LF y CR te los muestra con un simbolo o una palabra. No recuerdo el nombre de ninguno, pero si buscas en la red seguro que encontras varios. El ultimo que use era en DOS. Estan buenos para depurar, yo lo he utilizado para ver el protocolo entre 2 equipos series.
Hasta ahora no he visto nada extraño en tu programa. Lo unico que encotre, que no creo que haga nada y es solo un detalle de programacion es que abris el puesto, luego definis variables o generas un mensaje (que no tiene nada que ver con lo que vas a hacer ) y luego seguis con el puerto. Esas cosas las podes hacer antes o despues. Abris el puesto, envias lo que tengas que enviar, cerras el puerto. Hace como mas te guste, es una mania mia. Creo que es mas ordenado.
Saludos.

Edito:

 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        a = False
        servo = 2
        TextBox1.Text = "          EJE EL CENTRO"
        SerialPort1.Open()
        servo = 2
        SerialPort1.Write(servo)
        TextBox1.Text = "          EJE EL CENTRO"
        SerialPort1.Close()
        manual = 16

Es cuestion de gustos.
Título: Re: Comunicación serial y VB.Net
Publicado por: smartpic1.2 en 19 de Junio de 2013, 14:00:28
 Hola Darkman_A, te cuento que realice el mismo programa en VB6.0 y funciono sin problemas, todavía no me queda claro que puede estar fallando en mi programa  en VB.NET, ahora buscando en internet y algunos libros que tengo actuales de programación (2012 y 2011) la interfaz con el micro lo hacen siempre en VB 6.0, mi pregunta es por que no lo hacen en VB.NET si es mas moderno. Gracias por el apoyo.
Título: Re: Comunicación serial y VB.Net
Publicado por: gab163 en 18 de Julio de 2013, 23:40:10
He estado trabajando con Visual Basic .net y va de maravilla mucho mas facil que con VB6 a mi parecer los equipos nuevos ya no corren VB6, saludos