Servo controlado por RS-232 C#

hola que tal, espero y me puedan ayudar como hacerle para que el pic que programe pueda leer datos mayores a 9 enviados por un texbox deesde visual c#

por ejemplo tengo este codigo en mi pic

dato1 var word

portb=0

inicio:
serin portc.7,2,18,seguir,dato1
seguir:
PulsOut portc.0, dato1

goto inicio
end

al introducir numeros del 0 al 9 en el textbox y enviarlos, el pic si los recive (lo comprobe porque puse un lcd para que visualizara el valor dato1) ejemplo en vio el 1 en el texbox y en el pic me muestra el numero 49 (decimal ) pero al enviar por ejemplo el 12, solo me lee el digito 1 (49 decimal) y el digito dos (50 decimal) lo descarta. que esta pasando? porque no me lee el pic completamente el numero 12 enviado y que en el lcd me aparesca 4950 (transformacion del ascii a decimal) obviamente que se guarde en la variable dato1.

puse 3 serin consecutivos con 3 variables para que me guardara 3 digitos y si me guarda valores de 3 digitos pero uno en cada variable y no se como unificar esas 3 variables para hacer solo una y ponerlo en el PUSOUT.

el codigo del c# es muy sensillo, solo tengo un texbox y un boton que envia lo que tiene texbox por el puerto serial.

AYUDENME PORFAVOR !!!!!!!!
 
Si puedes recibir valores superiores a 9 por RS-232, lo que no puedes es recibir valores superiores a un byte (255)
Tampoco debes recibir los datos con una variable del tipo Word.
Cambia el tipo de la variable dato1 por Byte
 
Entonces nada_mas cambiando el tipo de dato o_sea de word a byte?? si_no te entendi por_favor explicame con manzanas, soy algo nuevo con respecto al rs232 en c#... de antemano te agradezco tu respuesta amigo
 
Última edición por un moderador:
¿Entonces nada más cambiando el tipo de dato osea de word a byte?
Soy algo nuevo con respecto al rs232 en c#
El protocolo RS-232 funciona enviando y recibiendo 5, 6, 7 u 8 bits pero lo que el PIC recibe y envía es en formato ASCII.
Oséa que si quieres enviar el número 10, lo que debes enviar es su valor en formato ASCII.
Entonces teniendo esto en consideración, para enviar el número 255 lo que debes enviarle al PIC es el caracter ÿ (8 bits) que en su conversión equivalente será 255 (1 Byte).
Igualmente esto lo tienes que tener en cuenta al recibir datos del PIC y realizar la conversión para obtener el valor decimal.

Busca en la ayuda de PIC Basic Pro, información sobre la función SerIn.

¿Ya hiciste una prueba realizando el cambio que te mencioné?
 
Última edición:
Fíjate que eso de lo del ascii ya sabía, lo que no he podido hacer es como guardar un numero de 3 dígitos en una variable, se supone que si envío por ejemplo el número 123 desde el textbox, al llegar al pic me debe de guardar en una variable el 123 pero en decimal, osea 495051 ya que el 123 es enviado en ascii pero solo me guarda el 49 (en ascii es el primer dígito del número 123 )
Ya cheque en serin del manual pbp pero solo me da la opción del serin guardar en 1,2,3,4... variables pero quedaría cada dígito en cada variable y no sé como unificarlos.
 
Última edición por un moderador:
¿Y si nos explicas mejor qué es lo que quieres hacer?
Por lo que veo quieres controlar un servo motor usando la instrucción PulsOut.

Si eso es lo que quieres hacer, eso que propones no es la forma correcta de hacerlo.
Envía el 123 en ASCII, osea el caracter {
Si envías el número 123 a través de un TextBox todo se complica, por eso te digo que no es la forma de hacerlo.

Debes crear una función que convierta el número 123 del TextBox a código ASCII y luego enviarlo al PIC.
 
mira lo que quiero es introducir por ejemplo el numero 180 (grados) en el texbox y que al recivirlo el pic este me guarde ese numero obviamente no me va a guardar el numero 180 tal como lo escribien el texbox porque se que al llegar al pic, el pic me lo va a guardar en decimal osea 495648 (ascii 1 en decimal es 49, ascii 8 en decimal es 56, ascii 0 en decimal es 48) pero que todo ese numero (495648) me lo guarde en una sola variable (((cosa que cuando lo hago solo me guarda el 49 osea el 1 en ascii y los otros dos digito me los descarta))) para que despues pueda comparar todo ese numero con un while x=495648 osea con el mismo valor y que al cumplirse, dentro del while tenga otravariable pero con el dato correcto ((250)) que voy a cargar en pulsout y el servo gire a 180 grados . no quiero introducir caracteres como este "{" sino puros numeros. espero y me allas entendido sino pues hasmelo saber ya que es algo muy complicado de explicar
 
mira, lo que quiero es introducir por ejemplo el numero 180 (grados) en el texbox y que al recibirlo el pic este me guarde ese número, obviamente no me va a guardar el número 180 tal como lo escribí en el texbox porque se que al llegar al pic, el pic me lo va a guardar en decimal osea 495648 (ascii 1 en decimal es 49, ascii 8 en decimal es 56, ascii 0 en decimal es 48) pero que todo ese número (495648) me lo guarde en una sola variable (((cosa que cuando lo hago solo me guarda el 49 osea el 1 en ascii y los otros dos dígito me los descarta))) para que después pueda comparar todo ese numero con un while x=495648 osea con el mismo valor y que al cumplirse, dentro del while tenga otra variable pero con el dato correcto ((250)) que voy a cargar en pulsout y el servo gire a 180 grados . no quiero introducir caracteres como este "{" sino puros números. espero y me hayas entendido si no pues házmelo saber ya que es algo muy complicado de explicar
Ok, si te entiendo, pero en PIC Basic Pro no se puede hacer lo que deseas, al menos no se me ocurre como lograrlo,
porque en PBP no se pueden concatenar las variables que quieres para luego obtener 495648
Con el hecho de sobrepasar 65535 lo máximo en PBP para una variable del tipo Word en un PIC16, no se puede.

Por eso eso te decía que usarás una función para convertir el número del TextBox a ASCII y lo enviaras, no que en el TextBox escribieras caracteres del código ASCII.

En otro lenguaje como el PICC de CCS si se puede lograr lo que quieres de forma sencilla,
porque si cuenta con funciones de conversión entre formatos y variables de 32 bits para PIC16.

Una forma algo diferente para lograrlo de la forma que quieres, sería de esta manera:

Declaras por ejemplo estas variables.
Datos Var Byte[3]
X Var Byte

Recibes los datos del TextBox de esta forma que solo permite 3 dígitos...
SerIn2 PORTC.7,84,500,Etiqueta_De_Salto,[Str Datos\3] ; Recibes a 9600bps P.E.

Luego sumas los datos que recibes en la variable tipo array Datos[]
X = Datos[0] + Datos[1] + Datos[2]

Si por ejemplo envías 180 directamente del TextBox, entonces X será: 49+56+48 = 153
Pero si quieres enviar por ejemplo el número 3, tendrías que escribir 003 y X será: 48+48+51 = 147

Eso te podría funcionar y tal vez se pueda lograr en PBP lo que requieres, pero no se me ocurre como.

Suerte.
 
Última edición:
Olvidate de enviar los números en ASCII, envialo directamente en bytes. Primero saber hasta cuantos grados vas a enviar, si el máximo es 180º o menos de 255, lo podrás enviar en un solo byte, si es mayor ya tendrán que ser 2 bytes.

La idea es un bit por grado, es decir, si envias 123, enviar realmente 0x7B = b1111011 = 123.

Por lo que tendrás que pasar ese 123 ASCII a 123 binario. Hay muchas maneras de hacerlo, una manera sencilla, que para nada es la mejor manera de hacerlo, pero al ser números pequeños puede servir es esta:

Código:
int variable = Int32.Parse(tutexbox.text);
byte dato=0;

for(int i= 0; i< variable; i++) dato++;

Un saludo.
 
Realmente estoy agradecido con sus respuestas.
De antemano se los agradezco por darse el tiempo de responderme.
Voy a checar los dos puntos que me aconsejaron, de hecho más o menos tenía pensado hacerlo como dice D@rkbytes, es parecido a lo que ahorita estoy programando, pero no descarto para nada lo que me aconsejo tannke, veré y checaré esos dos puntos.
Les agradezco mucho sus respuestas.
 
Última edición por un moderador:
hola que tal mi duda o mi obstaculo para continuar con un proyecto es el siguiente:

tengo este codigo en c#:

private void button1_Click(object sender, EventArgs e)
{

serialPort1.Write(textBox1.Text.ToString());

}

se supone que el numero que escriba en texbox1 se va a enviar por el puerto serial. todo eso va a llegar a mi microcontrolador para poder mover un servo(servo1). pero yo quiero agregarle un numero a esta parte del codigo: (obviamente con el mismo puerto) -.............serialPort1.Write(textBox1.Text.ToString());...........-
para que cuando lo lea el pic identifique que servo va a controlar y a cuantos grados (los grados pues yo se los introducire en el texbox). see podra??
o alguna sugerencia para que el pic identifique que servo va a mover
yo programo el pic 16f877a en pic basic pro

de antemano se los agradesco ...
 
Hola.
ToString() sobra, igual con solo Text ya está enviando datos en ascii.

Quieres enviar más datos en una sola instrucción?, entonces:
serialPort1.Write(textBox1.Text + "-" + TextBox2.text);

Ahora el PIC, cuando reciva toda la cadena tiene que separar el Text1 y Text2 para determinar que hacer...
 
Atrás
Arriba