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