TODOPIC
Lenguajes de programación para PC => Visual Basic => Mensaje iniciado por: literatronic en 20 de Abril de 2009, 14:30:55
-
Un saludo a todos.
Quiero comunicar el PC con un PIC a través de un programa en Visual Basic utilizando MSComm pero por lo que veo todo lo que se copie en los TextBox sale como ASCII y lo necesito es decimal, es decir, no quiero restarle 48 a los datos que me lleguen al PIC. ¿Es posible enviar estos enteros con alguna función?
Lo que he visto hasta el momento es que si pongo Chr$(TextBox) el envía el valor equivalente en decimal a lo que haya en la caja, entonces si quiero enviar un 1 decimal el envía un caracter raro (SOH según la tabla ASCII), si pongo 49 el me envía el valor equivalente que es 1 en ASCII.
Muchas gracias.
-
OK, voy a trabajar con Chr(TextBox). Ahora tengo otra duda, si yo quiero mandar un número de dos cifras, por ejemplo 12, entonces el programa en Visual me los toma como un 1 y un 2, como hago para que el 12 que mando sea un sólo byte.
Gracias.
-
usa el convertidor Val("número")
-
Gracias PalitroqueZ. Ahora el problema es en la recepción de Visual Basic, me explico, como estoy esperando que me lleguen 8 bytes desde el PIC entonces configuro RThreshold = 8, pero si envío desde el PIC una cadena que contiene números con dos cifras me los toma por separado, por ejemplo: 10 1 2 3 4 5 6 7 me llega al TextBox de recepción como: 1 0 1 2 3 4 5 6 y se pierde el último número.
Muchas gracias.
-
Eso tiene que ver con el tamaño del buffer, y si estas usando el evento on comm, cuantos caracteres esperas recibir para que se active dicho evento.
Lo mejor es que lo hagas de a un carácter por vez y enviando un *eco para controlar el flujo de datos.
*eco: enviar un carácter que sea reconocido por el receptor como señal de validación para enviar el siguiente dato.
-
PalitroqueZ no tengo ni idea de como implementar lo que me decís. Esta es la rutina que tengo para recibir:
Public Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive
txtDatosIn.Text = MSComm1.Input + vbNewLine + txtDatosIn.Text
Exit Sub
End Select
End Sub
Te agradecería que me pudieras ayudar con un ejemplo.
Gracias.
-
yo cuando quiero fijar el size del dato que quiero recibir, pongo a RThreshold y a InBufferSize del mismo size, luego en el evento on comm, si llegaron todos los datos que esperaba, entonces se cumple comEvReceive
posteriormente le aplico un tratamiento a esos datos. a mi me gusta manejar los datos como cadenas, (porque en C para pic se usa printf que le cae muy bien).
ese tratamiento al que me refiero es como organizaré los datos en la cadena a enviar, en un proyecto que hice en su tiempo, necesitaba enviar el resultado de una conversión analógica digital mas su signo, lo que hice fué:
los primeros n caracteres en llegar, eran los datos de la conversión y el último cáracter, correspondía al signo.
¿y como se hace eso en visual basic?
bien, con Mid(), separaba ciertos caracteres dentro de la cadena recibida, luego al final guardaba en otra variable, no sin antes usar el Val()
-
PalitroqueZ no doy con lo que me decís. La función Mid() sirve para "separar" una parte definida de una cadena, pero si no se de cuantos caracteres es la cadena que recibo como hago para utilizar Mid(), es decir, normalmente espero: 1 2 3 4 5 6 7 8, entonces Mid(string, 2, 1) = 2, pero si me envían: 10 2 3 4 5 6 7 8, me llega: 1 0 2 3 4 5 6 7, entonces Mid(string, 2, 1) = 0, y no el 2.
No se si me estoy enrollando, muchas gracias por tu ayuda.
-
Si te negás a restarle los 48 para convertilos, estás usando 1 byte por cada digito. Porque estás enviando cada número con su codigo ASCII correspondiente, entonces cada uno ocupa 1 byte.La cadena 12345678 tiene 8 digitos mientras que el 102345678 tiene 9. Obviamente vas a tener que cambiar algo. Recomiendo que envíes cada dígito como un byte. Es decir, si tenés un 10 enviarlo como chr(10) para que ocupe 1 byte. luego en el uC tenés que separarlo usando un algoritmo BCD.
otra opción es enviar al principio de cada msj un caracter especial seguido de la cantidad de bytes que pensas transmitir:
ejemplos: %08 1 2 3 4 5 6 7 8
%11 1 2 3 4 5 6 7 8 9 11
O bien, usar dos bytes por cada valor si trabajas con digitos entre 0 y 99 y hacer que el uC espere el doble de la cantidad que espera ahora:
01 02 03 04 05 06 07 08
10 02 03 04 05 06 07 08
-
... pero si me envían: 10 2 3 4 5 6 7 8, me llega: 1 0 2 3 4 5 6 7, entonces Mid(string, 2, 1) = 0, y no el 2.
entonces ese e el problema que tienes que resolver, tratar de enviar los datos de manera que no te llegue un 10, la respuesta es la que dá Bruno.
...Recomiendo que envíes cada dígito como un byte.
...
-
Joer Palitro..jaja es medio redundante lo que dije...Quise decir que envíe cada Numero como un byte...:D
-
Gracias BrunoF y PalitroqueZ, voy a intentar combinar la ayuda de los dos para solucionar mi problema, pero como conclusión, me parece que lo más fácil es cambiar el modo en que envío los datos desde el PIC. Por otro lado, encontré está página con unas explicaciones muy buenas sobre algunos de los comandos de VB que me pueden servir:
http://www.recursosvisualbasic.com.ar/htm/tutoriales/tutorial-basico5.htm#instr
Espero que a alguien más le sirva.