31 may 2010

COMUNICACION SERIAL - SERIN

          Una de las formas más populares de la comunicación entre dispositivos electrónicos es la comunicación serial. Hay dos tipos principales de comunicación  serial; síncrona y asíncrona. El HRSin, HRSOut, HSerIn, HSerOut, RSin, RSOut, Serín y comandos SerOut se usan para enviar y recibir datos en serie asíncronos. Mientras los comandos SHIn y SHOut son para uso exclusivo de comunicación síncrona.

          El término  asincrónico significa "sin ver el reloj" . De una manera mas especifica, "en la comunicación serial asincrona lo datos son transmitidos y recibidos sin el uso de un reloj. Los datos pueden ser enviados usando tan sólo dos cables, uno para datos y otra para tierra. Los puertos serie del PC (también llamados puertos COM o RS232) utilizan la comunicación serial asíncrona. Nota: el otro tipo de comunicación serial,  síncrona, utiliza por lo menos tres cables, uno para el reloj, una para datos y otra para tierra.

        El RS232 es la especificación eléctrica para las señales que usa el puerto serie del PC. A diferencia de las lógicas TTL, donde 5 voltios es un 1 lógico y 0 voltios es la lógica 0, RS232 utiliza -12 voltios para la lógica 1 y  +12 voltios para la lógica 0. Esta especificación permite comunicación a través de longitudes de cable más largo sin amplificación. La mayoría de los circuitos que trabajan con RS232 utiliza un controlador de línea /receptor (transceptor), o adaptador de niveles.  Este componente hace dos cosas: - 


  1. Convierte los ± 12 voltios de RS-232 a TTL compatible 0 a 5 voltios niveles.

  2. Invierte los niveles de tensión, de modo que la lógica de 5 voltios = 1 y 0 voltios lógica = 0.
          Debido a las capacidades de E/S, excelente para la  gama de dispositivos PICmicro, y la adopción de niveles TTL en la mayoría de los puertos serie de los PC modernos, un conductor de línea es a menudo innecesaria a menos que las largas distancias están involucrados entre el transmisor y el receptor. En su lugar  una simple resistencia de limitación de corriente es todo lo que se requiere.

        Usted debe recordar que cuando se utiliza un circuito adpatador de niveles transmisor-receptor, tal como el MAX232, la polaridad del modo serial se invierte en el proceso de convertir los niveles de señal, sin embargo, si se utiliza la conexión directa, el modo es virgen. Esta es la causa más común de errores al conectar dispositivos en serie, por lo tanto usted debe hacer provisiones por este dentro de su software.
       
        La comunicación asíncrona en serie se basa en la sincronización exacta. Tanto el emisor como el receptor deben ajustarse para medir el tiempo idéntico, lo que comúnmente se expresa en bits por segundo (bps) llamada baudios. Serín requiere un valor llamado Baudmode que informa de las características relevantes de los datos en serie que se  reciben, el período de bit, el número de datos , el   bit de paridad, y la polaridad.

        El argumento de Serín Baudmode acepta un valor de 16-bit que determina sus características: 1-bit de parada, los bits 8-datos / sin paridad o bits de datos 7-/ paridad par- y prácticamente cualquier velocidad a partir de tan 300 baudios a una mayor de 38K baudios (dependiendo de la frecuencia del cristal utilizado).  La lista a continuación muestra cómo se calcula Baudmode, consulte el manual para algunos baudmodes norma común para velocidades de serie.
       
        Si las comunicaciones son con software o hardware existente, su velocidad y modo determinará la elección de la velocidad de transmisión y el modo. En general, 7-bit /paridad-par (7E) se utiliza el modo de texto, y 8-bit/no-parity (8N) para los datos orentados a byte. Nota: el modo más común es 8-bit/sin-paridad, incluso cuando los datos transmitidos es sólo texto. La mayoría de los dispositivos que utilizan un modo de 7-bit de datos, lo hacen para aprovechar la función de la paridad. La paridad puede detectar algunos errores de comunicación, sino que en  su uso se pierde un bit de datos. Esto significa que los datos de entrada de bytes transferidosen el  modo 7E (paridad-par) sólo puede representar valores de 0 a 127, en vez de la 0 a la 255 del 8N (sin paridad) de modo.

         Los comandos  seriales del compilador "Serín" y "SerOut", todavia tienen la opción de utilizar un bit de paridad con desde 4 hasta 8 bit de datos. Esto es mediante el uso de las declaraciones: -


Con la paridad desactivada: -


DECLARE SERIAL_DATA 4 ' Configura SERIN y SEROUT para 4 bit de datos
DECLARE SERIAL_DATA 5 'Configura SERIN y SEROUT para 5 bit de datos
DECLARE SERIAL_DATA 6 ' Configura SERIN y SEROUT para 6 bit de datos
DECLARE SERIAL_DATA 7 ' Configura SERIN y SEROUT para 7 bit de datos
DECLARE SERIAL_DATA 8 ' Configura SERIN y SEROUT para 8 bit de datos (POR DEFECTO)



Con paridad Activada: -



DECLARE SERIAL_DATA 5 ' Configura SERIN y SEROUT para 4 bit de datos
DECLARE SERIAL_DATA 6 ' Configura SERIN y SEROUT para 5 bit de datos
DECLARE SERIAL_DATA 7 ' Configura SERIN y SEROUT para 6 bit de datos
DECLARE SERIAL_DATA 8 ' Configura SERIN y SEROUT para 7 bit de datos (POR DEFECTO)
DECLARE SERIAL_DATA 9 ' Configura SERIN y SEROUT para 8 bit de datos


        Los bit de datos de la declaracion SERIAL_DATA puede variar de 4 a 8 bits (el valor predeterminado si no se declara es el POR DEFECTO). La Habilitación de paridad utiliza uno de los número de bits especificado.

DECLARE SERIAL_PARITY ODD o EVEN

        Establece el tipo de paridad de Serín y SerOut. Si la paridad es permitidA pero el DECLARE SERIAL_PARITY no se emite en el programa, la configuración predeterminada es paridad par.

        DECLARE SERIAL_PARITY = EVEN 'si se desea paridad par
        DECLARE SERIAL_PARITY = ODD 'si se desea paridad impar

        DECLARE SERIAL_DATA 9 : Permite 8 bits de datos, junto con un noveno bit de paridad.

        La paridad es una característica simple de comprobación de errores. Cuando un remitente de datos serie está previsto para paridad par (el modo compatible con el compilador), este cuenta el número de unos en el byte de salida y utiliza el bit de paridad para hacer este numero de unos sea par. Por ejemplo, si se está enviando el valor de 7-bit: "0011010", establece el bit de paridad de 1 a fin de hacer un número par de unos (cuatro), es decir, como el datos tiene tres unos, el bit de paridad se hace uno para dar cuatro unos.

       El receptor cuenta también con los bits de datos para calcular lo que el bit de paridad debe ser. Si coincide con el bit de paridad, el receptor serial supone que los datos se recibieron correctamente. Por supuesto, esto no es necesariamente cierto, ya que dos bits de forma incorrecta podrían hacer parecer correcto la recepcion, o el bit de paridad en sí mismo podría ser malo cuando el resto de los datos es correcta.

       Muchos sistemas funcionan exclusivamente con el uso de texto de 7-bit / modo de paridad-par. Por ejemplo, para recibir un byte de datos a través de bits de PORTA-0 a 9600 baudios, 7E, invertido:


        SERIN PORTA.0, 24660, [SerData]

       En el ejemplo anterior funcionará correctamente, sin embargo, no informa al programa qué hacer en caso de un error de paridad. A continuación, es una versión mejorada que utiliza el argumento opcional que proporciona una etiqueta que a la cual se direccionara en caso de que se produzca un error de paridad en la recepcion:

        SERIN PORTA.0, 24660, P_ERROR, [SerData]
        PRINT @SerData
        STOP

 P_ERROR:
        PRINT "Error de paridad"

        Si coincide con la paridad, el programa continúa en la instrucción de PRINT después de SERIN. Si la paridad no coincide, el programa salta a la etiqueta P_ERROR. Tenga en cuenta que un error de paridad tiene prioridad sobre otras especificaciones InputData (tan pronto como se detecta un error, Serín aborta y salta a la rutina Plabel).

        En los ejemplos anteriores, la única manera de poner fin a la instrucción de Serín (que no sea reiniciar o de apagado) es dar a Serin los datos en serie que necesita. Si no hay datos de serie recibidos, el programa se queda atascado en un bucle sin fin. Sin embargo, se puede forzar a Serin a abortar si no recibe datos en un número especificado de milisegundos. Por ejemplo, para recibir un valor a través de PORTA-0 a 9600 baudios, 8N, invertido y Serín abortar después de 2 segundos (2000 ms) si no llegan datos: -

        SERIN PORTA.0 , 16468 , 2000 , TO_ERROR , [SerData]
        PRINT CLS , @Result
        STOP

TO_ERROR:
        PRINT CLS , "Timed Out"

        Si no se reciben datos serie en 2 segundos, Serín aborta y salta hasta la etiqueta TO_ERROR. Ambos argumentos, de Espera y de la Paridad se pueden combinar. A continuación se muestra un ejemplo para recibir un de valor a través de PORTA-0 a 2400 baudios, 7E, invertida con un tiempo de espera de 10 segundos:

        DIM SerData AS BYTE

Again:
        SERIN PORTA.0 , 24660 , P_ERROR , 10000 , TO_ERROR , [SerData]
        PRINT CLS , @SerData

        GOTO Again 

TO_ERROR:
        PRINT CLS , "Timed Out"
       GOTO Again

P_ERROR:
        PRINT CLS , "Parity Error"
        GOTO Again

        Al diseñar una aplicación que requiere la comunicación serie entre PICmicros, usted debe recordar a trabajar dentro de estos límites: -

1. Cuando el PICmicro está enviando o recibiendo datos, no puede ejecutar otras instrucciones.
2. Cuando el PICmicro está ejecutando otras instrucciones, no se puede enviar o recibir datos.
3. El compilador no ofrece un buffer de orden que hay en un PC. A bajas frecuencias del cristal oscilador, y las mayores tasas de datos serie, el PICmicro no puede recibir datos a través de Serín, procesarlo, y ejecutar otro Serín a tiempo para tomar la siguiente parte de los datos, a menos que existan importantes pausas entre las transmisiones de datos.



SERIN Modificadores

        Como ya sabemos, Serin va a esperar y recibir un solo byte de datos, y almacenarlo en una variable. Si el PICmicro esta conectado a un PC que ejecuta un programa de terminal y el usuario pulsa la tecla "A" en el teclado, después de ejecutado el comando Serin, la variable contendra el valor 65, que es el código ASCII de la letra "A".

         ¿Qué pasaría si el usuario pulsa la tecla "1"? El resultado sería que la variable que contendrá el valor 49 (el código ASCII para el caracter "1"). Este es un punto importante a recordar: cada vez que se pulsa una letra en el teclado, el ordenador recibe el valor ASCII de ese carácter. Corresponde a la parte receptora de interpretar los valores según sea necesario. En este caso, tal vez en realidad quería que la variable terminara con el valor 1, en lugar del código ASCII 49. El comando Serin proporciona un modificador, el modificador llamado decimal, que interpretará esto para nosotros. Mira el siguiente código: -

        DIM SERDATA AS BYTE
        SERIN PORTA.1, 16780, [DEC SERDATA]

         Observe el modificador de decimales en el comando SERIN que aparece justo a la izquierda de la variable SERDATA. Esto le dice a Serín para convertir texto entrantes representar los números decimales en forma decimal verdadera y guardar el resultado en SERDATA. Si el usuario que ejecuta el software de terminal pulsa el "1", "2" y luego "3" claves seguido de un espacio u otro texto no numérico, el valor 123 se almacenará en la variable SERDATA, permitiendo que el resto del programa para realizar cualquier operación sobre la variable numérica.

        Sin el modificador decimales, sin embargo, habría sido obligado a recibir cada personaje ("1", "2" y "3") por separado, y aún así tendría que hacer alguna conversión manual para llegar al número 123 (cien veintitrés) antes de poder hacer los cálculos que desee sobre el mismo.

         El modificador decimal está diseñado para buscar texto que representa los números decimales. Los caracteres que representan números decimales son los caracteres "0" a "9". Una vez que el comando Serin se le pide que utilice el modificador decimal de una variable en particular, sigue de cerca los datos serie entrantes, buscando el primer carácter decimal. Una vez que encuentra el carácter primera cifra decimal, seguirá buscando más (la acumulación de todo el número de varios dígitos) hasta que se encuentra un carácter numérico no decimales. Recuerde que no terminará hasta que encuentra al menos un carácter decimal seguido por al menos un carácter no decimales. Para ilustrar esto aún más, examine los siguientes ejemplos (suponiendo que estamos usando el ejemplo de código igual al anterior): -

 Entrada serial : "ABC"

 Resultado: El programa se detiene en el símbolo del Serín, continua en espera para el texto decimal.

Entrada Serial : "123" (sin caracteres siguientes ella)

Resultado: El programa se detiene en el símbolo del Serín. Se reconoce los caracteres "1", "2" y "3" como el número ciento veintitrés, pero como no no hay datos siguientes al "3", espera de forma continua, ya que no hay manera de saber si 123 es el número entero o no.

Entrada serial : "123 " (seguido por un carácter de espacio)

Resultados: Al igual que el ejemplo anterior, excepto una vez que el carácter de espacio se recibe, el programa sabe el número completo es 123, y almacena este valor en SERDATA. El comando Serin luego termina, permitiendo a la siguiente línea de código se ejecute.

Entrada  serial: "123A"

Resultados: Igual que el ejemplo de arriba. La "A" carácter, como el carácter de espacio, es el primer texto no decimales después del número 123, que indica al programa que ha recibido todo el número.

Entrada Serial: "ABCD123EFGH"

Resultados: Al igual que los ejemplos anteriores. Los caracteres "ABCD" se pasan por alto (ya que no son decimales, los caracteres 123  son evaluados para ser el número 123 y el siguiente carácter, "E", indica al programa que ha recibido todo el número.

        El resultado final del modificador de DEC está limitado a 16 bits (hasta el valor de 65535). Si un valor mayor que este valor recibido por el modificador de decimales, el resultado final será incorrecto porque el resultado se extiende el plazo del valor máximo de 16-bit. Por lo tanto, los modificadores de Serín no puede (en este momento) se utiliza para cargar DWORD (32 bits) variables.

        El modificador DEC es sólo uno de una familia de modificadores de conversión disponibles con Serin Más abajo encontrará una lista de modificadores de conversión disponibles. Todos los modificadores de la conversión de trabajan similar al modificador decimal (como se describió anteriormente). Los modificadores de recibir bytes de datos, a la espera para el primer byte que está comprendida en el rango de caracteres que aceptan (por ejemplo, "0" o "1" para binario, "0" a "9" para decimal, "0" a "9 "y" A "a" F "para hexadecimal. Una vez que reciben un carácter numérico, siguen aceptando la entrada hasta que un carácter no numérico llega, o en el caso de los modificadores de longitud fija, hasta que el número máximo de dígitos especificados es recibido.

        Aunque es muy eficaz en el filtrado y conversión de texto de entrada, los modificadores no son totalmente infalibles. Como se mencionó anteriormente, los modificadores conversión podrian seguir aceptando texto, hasta que el primer texto no numérico llege, incluso si el valor resultante supere el tamaño de la variable.Usted puede controlar esto hasta cierto punto mediante el uso de un modificador que especifica el número de dígitos, como DEC2, que aceptaría los únicos valores en el rango de 0 a 99.

        Los caracteres de conversión de tipos de modificadores numéricos Número aceptadas

        DEC (1 .. 5) decimal, opcionalmente limitada del 0 al 9 de 1 a 5 dígitos
        HEX (1 .. 4) Hexadecimal, opcionalmente limitada del 0 al 9, de 1 a 4 dígitos de la A a F
        BIN (1 .. 16) binario, opcionalmente limitada 0 y 1 de 1 a 16 dígitos

Una variable precedida por BIN va a recibir la representación ASCII de su valor binario.

Por ejemplo, si se especifica BIN VAR1 y "1000" se recibe, VAR1 se establecerá en 8.

Una variable precedida de SWX recibirá la representación ASCII de su valor decimal.

Por ejemplo, si se especifica DEX VAR1 y "123" es recibido, VAR1 se establecerá en 123.

Una variable precedida por HEX recibirá la representación ASCII de su valor hexadecimal.

Por ejemplo, si se especifica HEX VAR1 y "FE" se recibe, VAR1 se establecerá en 254.

        El comando Serin se puede configurar para esperar a una secuencia de caracteres antes de que se recuva cualquier entrada adicional. Por ejemplo, supongamos que un dispositivo conectado al PICmicro envia muchas secuencias diferentes de datos, pero los únicos datos que desea observar sean solo justo después de los caracteres únicos, "XYZ". El modificador WAIT  puede ser utilizado para este propósito: -

        SERIN PORTA.0, 16468, [WAIT ("XYZ"), SERDATA]

       El código de arriba espera a que los caracteres "X", "S" y "Z" sean recibidos, en ese orden, entonces recibe el byte de datos que viene y lo coloca en la variable SERDATA.


STR Modificador

        El compilador también tiene un modificador para el manejo de una cadena de caracteres, denominado STR. El modificador STR se utiliza para recibir una cadena de caracteres en una variable de matriz de bytes.

        Una cadena es un conjunto de caracteres que se disponen o acceden  en un cierto orden. Los caracteres "ABC" se almacena en una cadena con la "A", seguido por el "B" y luego seguido por el "C". Una matriz de bytes es un concepto similar al de una cadena, sino que contiene datos que se disponen en un orden determinado. Cada uno de los elementos de una matriz es del mismo tamaño. La cadena "ABC" se almacenaría en una matriz de bytes que contiene tres bytes (elementos). A continuación se muestra un ejemplo que recibe diez bytes a través de bits de PORTA-0 a 9600 bps, N81/inverted, y los almacena en la matriz de 10 bytes, SERSTRING: -

        DIM SerString [10] AS BYTE                                   'Crear una matriz de 10 bytes.
        SERIN PORTA.0, 16468, Relleno [STR SerString]   'la matriz con los datos recibidos.
        PRINT SerString                                         'Mostrar la cadena.

        Si la cantidad de caracteres recibidos no es suficiente para llenar toda la matriz, a continuación, un formateador puede ser colocado después del nombre de la matriz, que sólo recibirá caracteres hasta la longitud especificada. Por ejemplo: -

        DIM SerString [10] AS BYTE 'Crear una matriz de 10 bytes.
        SERIN PORTA.0, 16468, [STR SerString \ 5] 'Rellenar los primeros 5 bytes de la matriz
        PRINT STR SerString \ 5 'Mostrar la cadena de 5 caracteres.
        
        El ejemplo anterior ilustra cómo llenar sólo los primeros n bytes de una matriz y, a continuación, cómo mostrar sólo los primeros n bytes de la matriz. n se refiere al valor que se da después de la barra invertida.



Consideraciones Generales

Preste atención a cableado

        Tome más tiempo para estudiar y verificar los diagramas de cableado de  comunicación serial. Un error en el cableado puede causar problemas en la comunicación, o la no comunicación. Asegúrese de conectar las clavijas de tierra (Vss) entre los dispositivos que se comunican en serie.

        Compruebe configuración de puerto en el PC y en los comandos de la serie


        Una configuración desigual entre el emisor y el  receptor hará que las transferencias de datos sean  ilegibles o no exista transferencias de datos. 

         Recuerde siempre que un transmisor-receptor de línea invierte la polaridad de serie. Si los datos recibidos de serie no se puede leer, lo más probable es causado por un error de velocidad de transmisión , error de posición, o un error de polaridad. Si recibe datos de otro dispositivo que no es un PICmicro, trate de usar velocidades de transferencia de 9600 y por debajo, o como alternativa, utilize un cristal de frecuencia más alta. Debido a los gastos generales adicionales en el PICmicro, y el hecho de que el comando Serin no ofrece algún tipo de bufer de hardware de recepción para la comunicación serial, po rl oque recepciones consecuentes, pueden ser perdidas o ilegibles. Si esto ocurre, intente reducir la velocidad de transmisión, o aumentar la frecuencia del cristal. Uso de variables simples (no matrices) también aumentará la probabilidad de que el PICmicro recibirá los datos correctamente.

Vea Tambien:
                         SEROUT

HARDWARD






      Si deseamos conectar el micro al PC, debemos utilizar un circuito adaptador como el MAX232;  en la figura se muestran conectados los pines, 8 y 9, los cuales son opcionales en caso de que se quiera programar el micro con el Microcode Loader de Proton.
     Si queremos comunicar dos micros que estan en el mismo PCB, no hace falta utilizar este circuito, mas bien si, cuando estos estan conectados en PCB distintas y a distancias considerables.


2 comentarios:

  1. excelente su explicacion ingeniero, pero tengo una duda a ver si me puede ayudar. Desarrolle una aplicacion en java que me envia datos numericor a traves del puerto serial, pero el problema es que me los envia en string y despues en el microcontrolador necesito transformar estos string a datos numericos o decimales pero no se que funcion del proton ide permite hacer esto. Le agradeceria cualquier ayuda que me pueda brindar.

    ResponderEliminar
  2. tengo un problema y era para saber si me puedes ayudar?

    ResponderEliminar