• Jueves 2 de Mayo de 2024, 14:30

Autor Tema:  Envio De Datos Basic  (Leído 4302 veces)

estebanreinoso83

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Envio De Datos Basic
« en: Sábado 10 de Mayo de 2008, 01:41 »
0
Cree una aplicación en Basic en la cual se comunica con pic. La aplicación envia caracteres ASCII al pic y este responde con caracteres ASCII tambien. Mi problema se da cuando la aplicación le pide medir la temperatura de una habitación, pues el pic usa un ADC para la connversión de datos y debe enviar este dato a la aplicación, el problema es q nose como debe enviarlo si como ASCII o decimal o binario o hexadecimal o como, en todo caso serian 2 numeros los enviados, ademas cual seria la codificacion en basic para poder ver estos valores en la aplicacion?
Gracias por la ayuda, le necesito urgente

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Envio De Datos Basic
« Respuesta #1 en: Sábado 10 de Mayo de 2008, 22:43 »
0
Bueno, en la documentación del aparatito debe indicar el formato .
si careces de la documentación puedes intentar lo siguiente:

crea unas  constantes como las siguientes:
Citar
  const fASCII=0
  const  fHEX=1
  const  fBINARIO=2
  const  fBCD=3     ' octal
  const  fBCD-x3: 4
  const  fOTROS...= 5

public posibleFormato as integer ' acogerá una de las constantes...
public valor as string   ' el valor que se devuelva convertido a cadena
ahora el valor arrojado conviértelo a cada uno de los formatos y envíalo adonde esperas procesarlo... allí usando la misma conversión rellena una tabla, un listbox o lo que sea antecediendo a cada salida el tipo de dato que es, vamos que tendría una salida similar a:
Citar
   ASCII:  256
   HEX: ff
   BINARIO: 100000000
   BCD: 0010 0101 0110
   BCD-x3: 0101 1000 1001
   OTROS..: ?????
´toma 30 ó 40 muestras por espacio de 30sg 1 minuto...
ahora sabiendo que la habitación (tomado aprox. con un termómetro 'normal' ve anotando los registros cada vez que se actualiza el listbox.... finaliza el programa. traduce los valores de la tabla a decimal, y compáralos con los que anotaste manualmente con el 'termómetro en mano',  pueden suceder algunas cosas... las anotaremos:

* las temperaturas de un formato concuerdan casi con lo anotado, perfecto, ya lo tienes...
* concuerdan más de un formato : depende de como hayas hecho la conversión esto no debería ocurrir, revisa el código.
* no coincide ninguno: trata de convertir ahora todos los datos arrojados en el listbox desde centígrados a grados Farenheit, kelvin, Reamur... en la documentación del aparato debería indicar en que tipo devuelve los grados, lo lógico es que pueda darlo al menos tanto en centígrados como en Faenheit. Usa wikipedia para consultar las equivalencias si no las conoces. Una vez convertido a un formato, vuelve a compararlo con tus anotaciones...
* ha fallado todo lo anterior: el formato devuelto sin duda lleva un formato especfico y más complejo´, sin la documentación pertienente, sólo a base de intentos te va a ser difícil resolverlo. Esto es pongamos que la temperatura no se da como un dato específico sino acompañado de hora e indicación de formato, por ejemplo:
001 : hora, minuto, segundo
...
...
101  segundo, minuto, hora
0: grados centígrados
1: grados farenheit
0011
0111  ' 37º  los grados..en BCD

en fin que puede tener varios campos y cada campo con su formato específico, necesitas la documentación...o de otro aparato similar, para ver por donde van los tiros e intentar cosas similares...
«Ma non troppo»
----> ModoVacaciones = False<----

estebanreinoso83

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Envio De Datos Basic
« Respuesta #2 en: Martes 3 de Junio de 2008, 00:43 »
0
Hola amigo Nebire, gracias por interesarte en el tema y por tu ayuda, la verdad ya logre la conversion y tengo el dato en ASCII, el pic me envia dos numeros que envia primero el de decenas y luego el de centenas, con el hiperterminal conectado serialmente logro observar la temperatura correspondiente, pero yo necesito ver el dato en BASIC, tengo una aplicación para el resto de cosas y en ella uso un timer el cual cada milisegundo escanea el com serial y compara lo que le llega almacenandolo en una variable A, hasta ahi todo bien, ahora mi pregunta es como presentar el dato en pantalla, estaba usando un text para que el momento en que lleguen los datos presentarlos en el mismo pero no se si la programación estará bien, el asunto es que tipo debo declarar a la variable para que almacene los 2 numeros enviados y todo eso? El codigo iba mas o menos asi:

para la parte deseada de temperatura:

Private Sub Timer1_Timer()
A = MSComm1.Input
If Len(A) > 3 Then
End If
If A = "f" Then 'La f es solo como comprobacion para saber que es la temperatura
lblResul.Visible = True
cmdAcep.Visible = True
cmdMenu.Visible = True
cmdSal.Visible = True
X = MSComm1.Input   ' asigno los dos numeros que me llegan a la variable
TextResult.Visible = True
TextResult.Text = X  'Supuestamente aqui enseño la temp. pero no se si esta bien
End If
End Sub


Por favor ayúdame en esta parte que ya ees lo ultimo que tengo que hacer para terminar mi proyecto.
Gracias de antemano

PD: djunto como texto la programación completa del formulario
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Envio De Datos Basic
« Respuesta #3 en: Miércoles 4 de Junio de 2008, 00:50 »
0
En principio un textbox irá bien... pero ponle el 'background' de color negro y la fuente en negrita y de color blanco a un tamaño generoso (por lo menos 14-18). Se supone que es el dato relevante dentro del formulario, entonces dale el realce que precisa... debe destacar del resto, incluso  alignement=center y borderstyle=0

La variable si no la declaras es un variant, por defecto, es decir es a la vez un string, un integer, un long,etc.... por lo que el tipo de dato no debería preocuparte.

Luego creo que deberías cambiar el intérvalo del timer. Ignoro cual es la idea final. pero imagina un datro que cambia 1000 veces por sg. ...  alguien será capaz de leerlo ????... sólo si el valor no cambai a esa velocidad, yo te recomendaría por tanto que colocaras algún tipo de 'scroll' para poder modificar el intérvalo, entre ese valor de 1 y 1000 (salvo que deba transmitir el dato para otro objeto un valor de 1sg es más que sufiiente,  y un label que refleje el valor actual. Sin embargo yo te aconsejo modificarlo para usar el evento oncomm si el pic envía info directamente o el 'sondeo' si debes solicitarlo tú directamente... el método conocido como sondeo suele usarse en la forma:

Código: Text
  1.  
  2. ' le envías los datos
  3. MSComm1.Output = &#34;lo que sea que envías '
  4.    ' esperamos respuesta con los datos del puerto serie.
  5.    Do
  6.       DoEvents
  7.        miBuffer&#036; = miBuffer&#036; & MSComm1.Input
  8.    Loop Until InStr(miBuffer&#036;, &#34;lo que espero recibir&#34;) ' ó until len(miBuffer&#036;)=2
  9.     ' ahora validas los datos
  10.  
  11.  
  12.  

El otro método es usar el evento onComm del propio control:

Código: Text
  1.  
  2. Private Sub MSComm1_OnComm()
  3.    ' te pongo las referencias de las constantes para que no tengas que conocerlas de memoria, las aquí usadas deberían ser por ejemplo las de error y las de 'onCom'...  para aprovechando el evento con select case...
  4.     Dim errorCom As ErrorConstants
  5.     Dim eventoCom As CommEventConstants
  6.     Dim tipoCom As InputModeConstants  ' modo binario ó modo texto
  7.     Dim controlCom As HandshakeConstants
  8.     Dim onCom As OnCommConstants  '
  9.  
  10.     Select Case MSComm1.CommEvent
  11.       ' detectar errores
  12.           Case comEventTxFull   ' el buffer está lleno
  13.           Case comReadError   ' error al leer el puerto
  14.             ' ...
  15.             ' ...
  16.           Case comGetNotSupported
  17.              MsgBox &#34;La propiedad es de sólo lectura...&#34;
  18.           Case comPortNotOpen
  19.              MsgBox &#34;El puerto no se ha podido abrir...&#34;
  20.             ' ...
  21.       ' detectar evento esperado
  22.           Case comEvRing   ' el indicador de llamadas ha cambiado
  23.           
  24.           Case comPortOpen   ' el puerto está abierto
  25.               MsgBox &#34;Se ha abierto el puerto exitosamente.&#34;
  26.               
  27.     End Select
  28.  
  29.  
  30.  


Creo que con esto y haciendo las pruebas que creas pertienente acabarás por darle el toque final....
«Ma non troppo»
----> ModoVacaciones = False<----

estebanreinoso83

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Envio De Datos Basic
« Respuesta #4 en: Miércoles 4 de Junio de 2008, 18:52 »
0
Hola Nebire, muchas gracias por tu ayuda, me ha servido de mucho, la verdad acabo de terminar el proyecto y ya tengo el dato de temperatura en pantalla con solo dos timers que envian y reciben la ingo al musmo tiempo: cada 5 seg.
La verdad todo eso esta bien.
Ahora y como punto final quisiera que me ayudes con una duda que tengo hace rato.
Lo que pasa es que necesito que mi aplicación, al ingresar en ella, escanee todos los puertos seriales que puedo usar y crear una opcion para yo escoger que puerto voy a usar para, finalmente, establecer el puerto escogido como predeterminado para el resto de la comunicación.
Eso sería lo único que me falta en si.
Gracias por tu ayuda y disculpa tantas molestias pero soy principiante en esto de BASIC.
Esteban

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Envio De Datos Basic
« Respuesta #5 en: Jueves 5 de Junio de 2008, 15:43 »
0
Bueno eso lo puedes hacer recorriendo todos los puertos y detectando cual te da error para descartarlo, a partir de ello tomas una lista. No obstante tampoco es necesario disponer de la lista si sólo vas a ocupar uno, sin embargo siempre será interesante poder conocer las opciones disponibles...

Un posible código podría ser algo como lo siguiente. Nota que hay cosas sin asignar (por ejemplo Settings) y que hay otras que se pueden suprimir (por ejemplo asignación y reasignación del objeto error), además no lo he probado es un código rápido y pudiera necesitar corregirse, en cualquier caso deberás adaptarlo a tus necesidades. en principio lo pruebas y paso a paso  (tecla f8) para comprobar que funciona correctamente y ya lo modificarás como te parezca conveniente.

Código: Text
  1.  
  2. 'en un módulo coloca esta línea:
  3. Public puertos() As Integer
  4.  
  5. ' en el formulario pondrías esto, que responde a un botón, tu posiblemente deberías ponerlo en el load del formulario o en el main de un módulo si arrancas desde módulo.
  6. Private Sub Command1_Click()
  7.     Call Examinar_Puertos
  8. End Sub
  9.  
  10. ' las siguientes funciones las puedes colocar indistintamente en el formulario o en un módulo, irían mejor en un módulo, separado del código de manejo de los controles, pero si lo cambias a un módulo, está 1ª rutina debes hacerla de pribate a public, para que la llamada: 'call Examinar_Puertos' pueda localizarla.
  11. Private Function Examinar_Puertos()
  12.     puertos = Detectar_Puertos ' contiene la matriz de los 16 puertos con valores true-false (1-0)
  13.     puertos = filtrar_Puertos  ' filtramos para obtener sólo los true
  14.     If puertos(0) &#60;&#62; 0 Then
  15.        ' se podrían poner en un listbox para cambiar si un puerto arrojara problemas
  16.        '   o si eso ocurre se podría volver a ejecutar nuevamente la rutina de detección de puertos
  17.         MSComm1.CommPort = puertos(1) ' tomamos el primero de los hallados, es lo más consecuente
  18.         MSComm1.PortOpen = True
  19.        'MSComm1.Settings= ' establecemos las características que deseemos y qeu sean acorde a nuestro hardware
  20.        ' otras acciones
  21.     Else
  22.         MsgBox &#34;No se encontraron puertos disponibles&#34;
  23.     End If
  24. End Function
  25.  
  26. ' intenta 'ver' que puertos hay disponibles
  27. Private Function Detectar_Puertos() As Integer()
  28.     Dim puertosExistentes(1 To 16) As Integer
  29.     Dim nError As Long
  30.     
  31.     Dim PrevioError As ErrObject
  32.     Set PrevioError = Err   ' guardamos el error previo (si se desea, si no, se puede obviar)
  33.     Err.Number = 0 ' reseteamos cualquier posible error previo...
  34.     
  35.     On Local Error GoTo ErrorPuerto   ' si se encuentra un errror salta a la etiqueta indicada
  36.     
  37.     For k = 1 To 16
  38.         
  39.         MSComm1.CommPort = k     ' aquí esperamos recibir un error
  40.         'MSComm1.PortOpen = False
  41.         If nError = 0 Then
  42.             MSComm1.PortOpen = True   ' aquí esperamos recibir un error
  43.             
  44.             If nError = 0 Then
  45.                 puertosExistentes(k) = 1 ' es ok no generó error
  46.                 MSComm1.PortOpen = False  ' si no se pudo abrir dará error de no está abierto
  47.             Else
  48.                 nError = 0   ' reseteamos error para detedtarlo en el próximo ciclo
  49.             End If
  50.         Else
  51.            nError = 0  ' reseteamos error para detedtarlo en el próximo ciclo
  52.         End If
  53.     Next
  54.     
  55.     Err = PrevioError   ' si asignamos el error previo a la entrada, se lo devolvemos
  56.     
  57.     Detectar_Puertos = puertosExistentes
  58.     Exit Function
  59.     
  60. ErrorPuerto:
  61.     nError = Err.Number
  62.     ' errores 8002, 8005, 8012  ' no está disponible...
  63.         MsgBox &#34;.se detectó otro error en el puerto &#34; & k & &#34; el mensaje devuelto fue: &#34; & Err.Description & vbCrLf & _
  64.         &#34;    ... al cerrar este mensaje se continúa explorando.&#34;, vbExclamation, &#34;Explorando puertos ...&#34;
  65.     
  66.     Resume Next  ' no salgo, contínuo con la sigte. línea que dió error
  67. End Function
  68.  
  69. ' filtra la matriz de puertos ahora sólo contendrá los disponibles.
  70. '  su contenido ahora es el nº de puerto
  71. Private Function filtrar_Puertos() As Integer()
  72.     Dim p() As Integer
  73.     Dim x As Integer  ' contador de puertos 'válidos'
  74.     ReDim p(0 To 0)   ' p(0) se usa para saber cuantos se encontraron... asegura no devolve una matriz vacía
  75.     For k = 1 To 16
  76.         If puertos(k) = 1 Then
  77.             x = x + 1
  78.             ReDim Preserve p(0 To x)
  79.             p(x) = k
  80.         End If
  81.     Next
  82.     
  83.     p(0) = x
  84.     filtrar_Puertos = p
  85. End Function
  86.  
  87.  
  88.  
«Ma non troppo»
----> ModoVacaciones = False<----

estebanreinoso83

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Envio De Datos Basic
« Respuesta #6 en: Viernes 6 de Junio de 2008, 17:30 »
0
Amigo Nebire acabo de probar tu programa y en verdad funciona porque escanea los puertos y solo me da error en los puertos que no estan habilitados, hasta ahi todo bien solo que en la parte:
[CODE] If puertos(0) > 0 Then
      ' se podrían poner en un listbox para cambiar si un puerto arrojara problemas
      '   o si eso ocurre se podría volver a ejecutar nuevamente la rutina de detección de puertos
       MSComm1.CommPort = puertos(1) ' tomamos el primero de los hallados, es lo más consecuente
       MSComm1.PortOpen = True
      'MSComm1.Settings= ' establecemos las características que deseemos y qeu sean acorde a nuestro hardware
      ' otras acciones

Me gustaria que el programa no habilite el primer puerto encontrado sino que me muestre a mi los puertos válidos y me de la posibilidad de escojer el puerto que yo desee.

Perdon la insistencia y las molestias pero soy bastante ignorante en cuanto a basic y me gustaria que me des esta mano final.
Gracias de antemano
Esteban

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Envio De Datos Basic
« Respuesta #7 en: Sábado 7 de Junio de 2008, 14:28 »
0
Citar
Me gustaria que el programa no habilite el primer puerto encontrado sino que me muestre a mi los puertos válidos y me de la posibilidad de escojer el puerto que yo desee.

El código te da una matriz con los puertos 'capaces' , ya te indico que podrías ponerlos en una lista (control listbox o control combobox) y una vez que arranque el programa (o en un formulario aparte) pulsar un botón para activar el puerto que se elija. Yo te he puesto el 1º como un indicativo de que ya está ahí la respuesta, la 'saca' está llena cualquiera en su interior puedes elegirlo.


Bueno compañero, el resto debes hacerlo tú empleando tus conocimientos y esforzándote. De otro modo sería una tarea. Yo ya te he ayudado el resto corre de tu cuenta.

Debes entender que no se puede dar todo mascado, tu debes ser el que se involucre en obtener el resultado, los que respondemos solo hacemos de guía y aunque a veces se den partes de código completo o casi completo y más o menos funcional se hace sólo por que a veces es más sencillo mostrar un código que explicar y redactar que algo se hace de esta o aquella manera si alfinal no estás seguro de que se vaya a entender bien.

En el resto debes poner el esfuerzo de tu parte...
«Ma non troppo»
----> ModoVacaciones = False<----

estebanreinoso83

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Envio De Datos Basic
« Respuesta #8 en: Viernes 20 de Junio de 2008, 20:53 »
0
Amigo Nebire

Perdona que vuelva a molestar pero la verdad e intentado solucionar la parte de codigo que me falta y no he podido, creo q la falta de tiempo tambien me afecta mucho, pues trabajo y viajo bastante y caso no dispongo de tiempo libre, ademas tengo que entregar pronto el proyecto sino me hago pedazos.
Podrias aunq sea darme una pista de como conseguir la ultima parte del codigo? solo eso de presentar los puertos en una listbox y como puedo escojer uno de ellos.

Gracias
Esteban

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Envio De Datos Basic
« Respuesta #9 en: Sábado 21 de Junio de 2008, 01:37 »
0
En el mensaje anterior te puse todo el código, las modificaciones a realizar son mínimas. El siguiente código es una copia de una función que te puse en el mensaje anterior.
Código: Text
  1.  
  2. Private Function Examinar_Puertos()
  3.    puertos = Detectar_Puertos ' contiene la matriz de los 16 puertos con valores true-false (1-0)
  4.    puertos = filtrar_Puertos  ' filtramos para obtener sólo los true
  5.    If puertos(0) &#60;&#62; 0 Then
  6.       ' se podrían poner en un listbox para cambiar si un puerto arrojara problemas
  7.       '   o si eso ocurre se podría volver a ejecutar nuevamente la rutina de detección de puertos
  8.        MSComm1.CommPort = puertos(1) ' tomamos el primero de los hallados, es lo más consecuente
  9.        MSComm1.PortOpen = True
  10.       'MSComm1.Settings= ' establecemos las características que deseemos y qeu sean acorde a nuestro hardware
  11.       ' otras acciones
  12.    Else
  13.        MsgBox &#34;No se encontraron puertos disponibles&#34;
  14.    End If
  15. End Function
  16.  
  17.  

Entonces la parte a retocar es lo que hay dentro de la comprobación de la matriz:
Código: Text
  1.  
  2.     ' se añade esta línea
  3.     list1..clear  ' vaciamos el contenido previo
  4.  
  5.     If puertos(0) &#60;&#62; 0 Then
  6.    '......... aquí van los cambios  
  7.  
  8.     Else
  9.          MsgBox &#34;No se encontraron puertos disponibles&#34;
  10.     End If
  11.  
  12.   '......... se añade esta línea también
  13.    commandConectar.enabled= false  ' de entrada se desactiva hasta que se pulse en el listbox, (si es que hay alguno
  14.    list1.enabled=list1.listcount&#60;&#62;-1 ' el listbox sólo debe estar activado si tiene contenido.
  15.  
  16.  
  17.  

Lo que hay que hacer es poner un bucle que introduzca los puertos de la matriz en el listbox.
Código: Text
  1.  
  2.      
  3.      for k=0 to ubound(puertos)
  4.           list1.additem(puertos(k))  ' se añaden al listbox
  5.      next
  6.  
  7.  

El cambio que hemos hecho hasta el momento,  es llenar el listbox. El código que antes había donde se ha insertado éste es el código que se debe poner en el evento click del botón 'conectar al puerto seleccionado'. El puerto seleccionado será el que esté seleccionado en el listbox, de entrada quedamos sería más correcto dejar el botón desactivado y sólo activarlo en caso de que se seleccione uno en el listbox, esto implica que si no hubiera puertos disponibles el listbox estaría vacío y por tanto no se podría pulsar el botón de 'conectar usando el puerto seleccionado', porque no hay ninguno disponible.

en el evento click del listbox:

Código: Text
  1.  
  2.      commandConectar.enabled= (list1.listindex&#60;&#62; -1)
  3.  
  4.  
y finalmente en el evento click del botón para conectar, se coloca lo que hemos sacado del condicional anterior alterando para usar el puerto seleccionado en el listbox:
Código: Text
  1.  
  2.     '  esta línea es la que era antes, ahora la modificamos para que tome la selección del listbox
  3.      'MSComm1.CommPort = puertos(1) ' tomamos el primero de los hallados, es lo más consecuente
  4.       '.....esta línea siguiente se usa sólo para comprobación, quitar cuando verifiques que funciona bien
  5.       dim usar as vbmsgboxresult
  6.       usar = msgbox (&#34;Seguro que quiere usar el puerto Nº -&#34; & list1.list(list1.listindex) & &#34;- ? &#34;, vbyesno, &#34;Que puero libre usamos...&#34;)
  7.      if usar= vbno then exit sub
  8.  
  9.       ' esta es la línea modificada
  10.       MSComm1.CommPort = list1.list(list1.listindex)
  11.  
  12.        MSComm1.PortOpen = True
  13.       'MSComm1.Settings= ' establecemos las características que deseemos y quu sean acorde a nuestro hardware
  14.       ' otras acciones
  15.  
  16.  
  17.      ' una vez usado el puerto deseado hay que desactivar el listbox y el botón, o no según convenga de acuerdo a lo que vayas  a hacer.... Si vas a tal sitio y has decidido usar la carretera norte, las demás deben quedar desactivadas o puede ocurrir que te pierdas.... por la confusión....
  18.      list1.enabled=false  ' cuando se haga un chequeo de puertos el listbox se activa si hay puertos diponibles.
  19.      commandConectar.enabled=false
  20.  
  21.  




En verdad todo esto es muy sencillo, así no entiendo como puedes entregar un proyecto sin conocer estas simplezas. Si no sabes resolver esto, creo que no mereces lo que sea que esperas obtener al entregar dicho proyecto. Pués que pasará cuando realmente surja algo realmente complejo ???
«Ma non troppo»
----> ModoVacaciones = False<----