TODOPIC
Lenguajes de programación para PC => Visual Basic => Mensaje iniciado por: kriskmilo en 02 de Enero de 2009, 13:23:02
-
:)
HOLA!!!, creo este tema por que necesito un poco de asesoria, realize un codigo para visualizar una señal a 19200 baudios proveniente de el puerto serial y funciona en parte, sin embargo me sale un errorcito que no se a que se deba los datos llegan en ascii, agradezco de antemano cualquier ayuda, en cuanto al circuito es un conversor analogo digital que toma los datos y los envia en ascii de modo serial al computador por usb. la parte referente a excel muestra como estoy intentando exportar y almacenar los datos en un xls.
en realidad no recuerdo la velocidad maxima de 232 pero este codigo creo que funciona igual para transmision rs 232 a 19200 baudios, si no me equivoco el 232 llega hasta 115200 baudios
el codigo funciona, muestra los datos tomados del puerto hasta cierto punto y entonces aparece el errorcito
se crea el archivo en excel exitosamente pero solo logra enviar uno de los datos
Option Explicit
Dim ejex As Integer
Dim ejey As Integer
Dim acum As Double
Dim x As Integer
Dim y As Integer
Dim dato As Integer
Dim i As Integer
Dim a As Integer
Dim Buffer As String
Dim Bufferfinal As String
Private Sub Command1_Click()
'MSComm1.setting="19200,N,8,1"
'MSComm1.CommPort = 6 ' selecciona el Com1
'MSComm1.InputLen=0 ' pone buffer a cero (opcional)
'MSComm1.PortOpen = True
'MSComm1.Output = "Texto a enviar"
'MSComm1.PortOpen = False ' para cerrar
'Text1.Text = MSComm1.Input
'c = Asc(g)
'---------------------- en ascii
'g = MSComm1.Input
'Text1.Text = g
'--------------------
Buffer = MSComm1.Input
For i = 1 To Len(Buffer)
Bufferfinal = Bufferfinal & Format(Asc(Mid(Buffer, i, 1)), "00") & " "
Next
'Bufferfinal = Bufferfinal & Format(Asc(Buffer), "00") & " "' SELECCIONO PARA UNO A UNO
Text1.Text = Bufferfinal
'------------------------------
'Private Function a2d(ByVal asci As String) As Integer
'a2d = Asc(asci)
'End Function
'USO DE FUNCIONES O RUTINAS
'-------------------------
'Private Sub Command2_Click()
'Textbox2.Text = a2d(Textbox1.Text)
'End Sub
'-------------------------
End Sub
Private Sub Command3_Click()
'esto te guarda el grafico en el directorio que quieras
SavePicture Picture1.Image, "C:grafico.jpeg" 'le puse .bmp porque asi me dijiste
'pero puede ser tambien .jpeg
End Sub
--------------------------------PARTE EXCEL SI DESEAN OMITANLA DEBO MODIFICARLA AUN----------------------------
Private Sub Command4_Click()
Dim oExcel As Object
Dim oBook As Object
Dim oSheet As Object
'Start a new workbook in Excel
Set oExcel = CreateObject("Excel.Application")
Set oBook = oExcel.Workbooks.Add 'Este codigo lo modifique tratando de que salgan los datos en una columna
Dim DataArray(1 To 100) As Variant
Dim r, k As Integer
Buffer = MSComm1.Input
For k = 1 To Len(Buffer)
Bufferfinal = Asc(Buffer)
Next 'Add headers to the worksheet on row 1
Set oSheet = oBook.Worksheets(1)
oSheet.Range("A1:C1").Value = Array("Order ID") 'Transfer the array to the worksheet starting at cell A2
oSheet.Range("A2").Resize(100, 3).Value = DataArray
'Save the Workbook and Quit Excel
oBook.SaveAs "C:Book1.xls"
oExcel.Quit
End Sub
Private Sub Form_Load()
MSComm1.InputLen = 1
'MSComm1.InputMode = comInputModeText
MSComm1.PortOpen = True
'MSComm.Output = hex2ascii
'Buffer = MSComm.Input
End Sub
'--------------------------PARTE DE GRAFICACION TENGO UN ERRORCITO QUE NO SE QUE ES...
Private Sub Command2_Click()
ejex = 0
ejey = Picture1.Height 'inicializo los puntos del grafico
otro:
'--------------------------------------------------
'For acum = 0 To 100 Step 0.15 'aqui genero la onda, en tu caso aqui seria
'DoEvents 'leer los datos del puerto serial y guardarlos
'dato = Sin(acum) * 10 'en dato, a veces es necesario multiplicarlos para
'---------------funciona----------------------
Buffer = MSComm1.Input
dato = Asc(Buffer) / 5 ' SELECCIONO PARA UNO A UNO
'---------------------funciona-----------------
Call dibujar
For i = 0 To (100) Step 1 'este es un retraso que se le pone para que el
For a = 0 To (10) Step 1 'usuario pueda apreciar la onda
Next a 'si se le quita la onda se dibuja muy rapido
Next i 'Next acum
GoTo otro
End Sub
Public Sub dibujar()
x = ejex + (10) 'defino el valor de x que son los datos del eje x, ejex
'es el dato anterior inicialmente cero ese 10 es para que se aprecie mejor la señal
y = ((Picture1.Height / 2) - ((dato) * 20)) 'tomo el valor del alto del cuadro '
'entre dos y se le resta el valor que me va dando el valor de la función
'este valor lo multiplico por 20 para que se vea la gráfica
Picture1.Line ((ejex * 3), ejey)-((x * 3), y) 'dibujo una linea con los valores anteriores
ejex = x
ejey = y
If ejex > Picture1.Width Then 'si el valor de ejex es mayor que el ancho del cuadro
ejex = 0 'que ponga a ejex a cero
Picture1.Cls 'y que borre pantalla.
'esta parte la hago para que cuando llegue al final del cuadro inicie de nuevo
'del lado izquierdo del cuadro.
End If
End Sub
-
unas humildes sugerencias de mi parte es que trates de hacer funcionar las cosas por separado, para evaluar y corregir los errores eventuales. Por ejemplo, podrias hacer unicamente la parte de graficas, simulando el envío de datos hasta que logres hacerlo funcionar a conveniencia.
en cuanto a la transmisión sería mejor (desde mi punto de vista) que usaras el evento on_comm y manejar las transmisiones por "interrupcion", asi tienes mayor control sobre los datos.
en cuanto a las velocidad de transmisión, tienes que checar en las estructuras del código fuente del pic, que efectivamente se encuentre configurado al baudaje que quieres.
-
Mil gracias palitroquez, de casualidad tienes un ejemplo de como manejar el evento On comm, Una pregunta ¿con este evento tambien debo convertir los datos de ASCII a decimal?
-
mira un ejemplo en este enlace:
http://www.todopic.com.ar/foros/index.php?topic=15208.msg98489#msg98489
...¿con este evento tambien debo convertir los datos de ASCII a decimal?
depende de como envies los datos al pc, generalmente se usan caracteres ascii
-
Pedro Mil gracias, me parece que el error esta precisamente en la conversion de ASCII a decimal estoy utilizando la instruccion ASC() el codigo que tengo crea una señal diente de sierra que cambia valores de 0 a 255
Estuve revisando el interesantisimo tema de graficacion en visual basic y encontre el codigo que generosamente nos compartio con el que a traves de un scroll se cambia el valor de la grafica entre 0 y 255, mi pregunta es: ¿como tomar los datos en ascii procedentes del puerto y convertirlos a decimal para graficarlos en el picture box?
-
con Val()
ejemplo:
Val("5") -> devuelve el número 5
mira este post, aquí se hace una especie de datalogger usando la clase CDC (emulación serial + mscomm)
http://www.todopic.com.ar/foros/index.php?topic=15208.msg104184#msg104184
-
Hola: una sugerencia, eso de querer pasar los datos que recibes a exel, creo que te va a dar problemas, si estas tratando de acercarte a un osciloscopio de seguro que tendras que hacerlo a la mayor velocidad que en CAD y USART te lo permitan, para comenzar el CAD de un PIC es mucho mas lento que si usas un CAD externo. si intentas esto y pasar estos datos a digamos un memo...ummm que......unos 200, 300... byte por segundo, todo tu programa se pondra tan lento que aun desconectando el PIC veras que como 10 minutos se sigue llenando el Memo(no quiero ni imaginar el tiempo que tardaria en pasar a exel),
asi que la alternativa es almacenar los datos en otro formato como un archibo binario,etc.
-
Si le paso a la grafica
Decidí que para almacenar los datos lo haré en una base de datos sql, mejor q en excel.
Adjunto el código que contiene el problema, Creo que la función val toma una cadena y me devuelve un numero; si uso Val, me retornara el numero equivalente al caracter ASCII?
Private Sub Command2_Click()
ejex = 0
ejey = Picture1.Height 'inicializo los puntos del grafico
otro:
Buffer = MSComm1.Input
'dato = Asc(Buffer) / 10 ' SELECCIONO PARA UNO A UNO
dato = Val(Buffer) / 10
'---------------------funciona-----------------
Call dibujar
For i = 0 To (100) Step 1 'este es un retraso que se le pone para que el
For a = 0 To (10) Step 1 'usuario pueda apreciar la onda
Next a 'si se le quita la onda se dibuja muy rapido
Next i
'Next acum
GoTo otro
End Sub
Public Sub dibujar()
x = ejex + (10) 'defino el valor de x que son los datos del eje x, ejex es el dato anterior inicialmente cero ese 10 es para que se aprecie mejor la señal
y = ((Picture1.Height / 2) - ((dato) * 20)) 'tomo el valor del alto del cuadro entre dos y se le resta el valor que me va dando el valor de la función
'este valor lo multiplico por 20 para que se vea la gráfica
Picture1.Line ((ejex * 3), ejey)-((x * 3), y) 'dibujo una linea con los valores anteriores
ejex = x
ejey = y
If ejex > Picture1.Width Then 'si el valor de ejex es mayor que el ancho del cuadro
ejex = 0 'que ponga a ejex a cero
Picture1.Cls 'y que borre pantalla.'esta parte la hago para que cuando llegue al final del cuadro inicie de nuevo
'del lado izquierdo del cuadro.
End If
End Sub
-
...
dato = Val(Buffer) / 10
...
umm no se, esta línea no me convence, hay que manejar la separación de los datos, como string, luego al final lo llevas a tipos numéricos.
además no entiendo bien que pretendes almacenar, ¿podrías colocar un ejemplo de un dato que llega al buffer y lo que tu quieres guardar en dato?
hay que resolver esto primero para poder avanzar a la siguiente sección del programa.
-
Hay unos componentes que hace tiempo estoy usando bastante y bueno no se si alguien puede mencionar algunos mejores, exclusivamente para este tipo de tareas y mucho mucho mas:
segun su creador solo para fines no comerciales
http://www.mitov.com/html/signallab.html