Autor Tema: Visual Basic y PICs  (Leído 9722 veces)

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

Desconectado FJPPitta

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
    • Mi pagina personal
Visual Basic y PICs
« en: 31 de Enero de 2007, 13:04:13 »
Un saludo, Espero hacer la pregunta en el lugar adecuado.

Lo que deseo es comunicarme con el micro por medio del puerto serie, ya he utilizado el puerto serie con visual basic para comunicarme con circuitos, bueno fue un circuito convertidor de rs232 a rs485 para comunicarme con otra computadora por medio de una especie de chat. Tambien e utilizado el puerto del pic para enviar datos por hyperterminal pero solo de recepcion. Lo que no me queda claro es la forma en como envia los datos el pic por el puerto serie, tengo entendido que lo hace como caracteres y no como numeros. ¿Hay que hacer alguna conversión dentro del VB? si hice la aplicacion pero no se mucho de VB ya que la otra fue muy sencilla y use la ayuda.

Si alguien tiene alguna referencia de como hacer esa comunicacion, tambien encontre un programa de ejemplo en el foro pero el link es de cuando estaban con la otra direccion y no puedo descargarlo para examinarlo si alguien lo tiene y puede proporcionamelo seria de gran ayuda para resolver mis dudas.

Les agradesco la atencion
Saludos
FJPPitta
Que la fuerza te acompañe

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Visual Basic y PICs
« Respuesta #1 en: 01 de Febrero de 2007, 15:15:16 »
Hola FJPPitta.

¿Que es un caracter? ¿Que es un numero?

Creo que todos sabemos(en terminos informaticos) que un numero es un caracter, pero no todo caracter es un numero.

Por lo tanto, los numeros son solo una parte de un conjunto de caracteres.
Podríamos separar básicamente a los caracteres en tres grupos: números, letras y caracteres especiales.

En un principio(en informática) se seleccionó(los yanquees) un determinado grupo de caracteres intentando una estandarización internacional. A este grupo de caracteres se lo llamó ASCII(hoy en dia es llamado US-ASCII).
Este grupo es de 8 bits. significa que hay un total de 256 caracteres ASCII.

Luego, por necesidad, obviamente debido a que se necesitaban muchas veces más de 256 caracteres en ciertos lenguajes, se extendió el grupo a 16 bits, y nacieron códigos ASCII muy variados.

Entonces, volviendo a tu pregunta específica:

Siempre se intenta lograr la mayor compatibilidad posible a la hora de realizar algo.

Vos podes enviar 8 bits por vez(suponiendo que no usas el noveno bit del RS-232).
¿Cuántos numeros entran en 8 bits?¿y cuántos caracteres ASCII?

Si hablamos de números puros, podrías enviar hasta 2 números por cada byte(4 bits =16 combinaciones.por lo tanto alcanza y sobra para nuestro sistema decimal).

Pero si un caracter ASCII tiene una longitud de 8 bits, significa que solo podrias enviar un caracter ASCII por cada 8 bits.

Entonces, excepto que requieras de EXTREMA velocidad, te recomiendo que te ajustes a la tabla de valores ASCII a la hora de enviar números también.

¿Cómo envía un PIC un caracter o un numero?

Para el PIC no existe caracter o numero. No hay ninguna diferencia entre ambos. Sea texto, sea numero, sea simbolo, sea lo que sea. El PIC solo distingue distintos niveles de tension(lo que solemos llamar "ceros y unos").

Si mandas por puerto serie el caracter "A". En realidad, el VB lo pasa a su codigo ASCII, que es el 65(podes comprobarlo haciendo ALT+65 en tu pc).

El 65 es en binario: "01000001"

Entonces, por el puerto serie, el PC enviará primero el bit de inicio, luego iran los 8 bits mencionados, y luego el bit de stop(suponiendo que no hay bit de paridad/9no bit).


El VB permite configurar el control MSComm en 2 maneras: como texto o binario.
Mentira. El VB miente en este caso. El VB no permite variables de tipo binary. Por lo que el modo binario no es mas que una cadena de texto de ceros y unos.

Supongamos que quiero enviar una "A" por puerto serie:

Si lo configuré en modo texto enviaré el string: "A"
Si lo configuré en modo binario deberé enviar el string: "01000001".

Entonces, te recomiendo que dos cosas:

Primero: que tengas cuidado con las funciones Chr() y Asc() del VB que se utilizan para pasar de ASCII a decimal y viceversa. La tabla ASCII del VB no es la tabla ASCII estandar. Posee ciertas diferencias bastante significativas, pero si no envias caracteres especiales o nacionales(me refiero a los acentos, la ñ, etc)no hay problemas en usar dichas funciones.

Segundo:
En este caso lo mejor probablemente es usar el VB en modo texto.
Entonces, para respetar la tabla ASCII, lo que haces desde el PIC para eviar numeros es sumarle a cada digito que envias el valor .48

Esto significa que si tenes que enviar un 9, deberás enviar:

.57

Si debes enviar el numero 123

entonces, deberas enviar 3 bytes por puerto serie y serán:

.49 .50 .51

Si tenes el VB configurado en modo texto, entonces te van a llegar como STRING y exactamente con su caracter representativo.

En el primer caso tendras en el buffer de entrada del puerto serie: "9"
En el segundo tendras: "123"

Los lees y haces con ellos lo que quieras.

Ahora, para enviar del VB al PIC en modo texto harias:

Supongamos que envias el valor "54" desde el VB al PIC.

Al PIC llegaran dos bytes:

primero llegara el valor binario '00110101'(que corresponde al 5) y luego llegara el valor '00110100'(que corresponde al 4)

O lo que es lo mismo: llegara primero el valor .53 y luego el .52.
Podes manipularlo como quieras, pero si queres transformar este valor a un numero de 0 al 9,lo unico que debes hacer es restarle .48 y lo obtendras.

Saludos.

"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado FJPPitta

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
    • Mi pagina personal
Re: Visual Basic y PICs
« Respuesta #2 en: 01 de Febrero de 2007, 15:53:07 »
BrunoF gracias por tu respuesta, me ha quedado mas claro la comunicacion entre el PIC y la PC, supongo que eso aplica cuando se realiza la programación en ensamblador ya que con lo que llevo muestro la informacion en hyperterminal en CCS utilizo:

Código: [Seleccionar]
printf("Sensor --> Rojo: %LU Verde %LU Azul %LU \r\n",R,G,B);
Con esa instrucción envio los datos y son mostrados correctamente en hyperterminal. El CCS lo hace automaticamente. Como eso puedo tratarlo de una sola cadena, estoy intentando usar la instrucción en VB:

Código: [Seleccionar]
Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived

        Static strData As String = ""

        strData += SerialPort1.ReadExisting()

        If strData.IndexOf(Chr(13)) > 0 Then

            Dim WriteInvoke As New WriteDataDelegate(AddressOf Me.WriteData)

            Me.Invoke(WriteInvoke, strData)

        End If

    End Sub


Pero me marca algunos errores, ahora bien uso el VB Express 2005 ya que es gratuito, me conviene usar ese o la antigua version ya que el MSCOMM ha sido sustituido por SerialPort.

El programa que realize anteriormente de un CHAT por rs485 utilize el 2002 con el MSCOMM.
Que la fuerza te acompañe