Autor Tema: Perdida de datos PIC a PC por puerto serie y visual basic  (Leído 2612 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado NeKrOsCeNtS

  • PIC10
  • *
  • Mensajes: 1
Perdida de datos PIC a PC por puerto serie y visual basic
« en: 05 de Diciembre de 2010, 14:33:54 »
Saludos, estube buscando algun problema similar pero no encontre alguna ayuda, mi proyecto es un control de temperatura, por el momento esoty haciendo lo de la comunicación, lo que tengo hasta ahorita es esto:

(NOTA: Hasta ahorita todo es simulado con Proteus, Visual Basic 2010 Express, Virtual Serial Port Kit)

Por medio del PIC 16F887 hago la conversion de la entrada analogica del sensor por medio del pin a0 del PIC, y el resultado de eso lo paso a la PC por medio de Tx, hasta ahi no hay problema, en Visual Basic recibo los datos y los muestro, la primera vez si llega el dato completo(la resolucion del ADC es de 0-255), por ejemplo: el resultado de la conversion fue 255, ahora en Visual Basic muestro en una Label el 255, cada 1 segundo se hace el envio del resultado del ADC, y la siguiente vez que se muestre el resultado del ADC en Visual Basic siendo el mismo por ejemplo 255, en Visual Basic muestra: 55 o 5.

Ahora la cuestion que tengo es: alguna idea sobre por que sucede esto?, y/o como se podría arreglar?

Adjunto archivos del proyecto y codigo.

Aqui el código del programa del PIC en C usando CCS:


#include <16F887.h>
#device adc=8
#FUSES XT,NOWDT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)

void main() {
   int q;
   setup_adc_ports(sAN0);
   setup_adc(ADC_CLOCK_INTERNAL);
   for (;; ) {
      set_adc_channel(0);
      delay_us(20);
      q = read_adc();
      //p = 5.0 * q / 1024.0; 4ld
      printf("%u", q);
      delay_ms(2000);
      }
}


Y aqui el codigo del programa en Visual Basic:

Public Class Form1
    Delegate Sub delegado(ByVal data As String)
    Dim resultadoADC As Integer
    Dim temperatura As Double
    Const TMAXIMA As Integer = 65
    Const RESOLUCION As Integer = 255

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

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

        Private Sub ListBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
            Try
                sp.Close()
                sp.PortName = ListBox1.SelectedItem
                sp.Open()
                Label1.ForeColor = Color.Green
                Label1.Text = "Puerto: " & sp.PortName & " abierto" & vbCrLf
            Catch ex As System.ArgumentException
                'MessageBox.Show(ex.ToString, "", _
                'MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try

        End Sub

    Private Sub sp_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles sp.DataReceived
        Dim s As String = sp.ReadExisting
        Dim escribeport3 As New delegado(AddressOf Me.mostrar)
        Me.Invoke(escribeport3, s)
    End Sub

    Sub mostrar(ByVal d As String)
        resultadoADC = CInt(d)
        Label1.Text = resultadoADC
        temperatura = resultadoADC * TMAXIMA / RESOLUCION
        Label2.Text = temperatura
    End Sub




 

anything