Comunicación en serie en Netduino – Parte 2  


En esta segunda parte de la comunicación en serie en Netduino la  intención es  estudiar el control de flujo en RS-232, que se recomienda  debido a que muchos entusiastas de la electrónica simplemente deciden no utilizar esta parte importante de la comunicación.

Varios factores pueden influir en la transmisión de datos entre dos aplicaciones, pero en el ejemplo se va poner  a prueba la comunicación serie TTL utilizando directamente los pins del Netduino 3.3V

En este  caso  utilizamos 2 tarjetas Netduino para establecer la comunicación entre ellos y realizar alguna prueba en el canal con interconexión eléctrica entre la comunicación de dos placas.

Paso 1 – Comprobación de la sincronización de conexión

Para simplificar un poco más ponemos una placa simplemente transmitiendo  y recibiendo en otra. El código siguiente es la placa de transmisión que envía los datos periódicamente a poco más de un segundo entre los paquetes de información. El mensaje es el mismo » Netduino! \ n »

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
using System;
using System.IO.Ports;
using System.Threading; using Microsoft.SPOT;
using Microsoft.SPOT.Hardware; using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.NetduinoPlus;
using System.Text; namespace NetduinoPlusSerialExample
{
    public class Program
    {
        static de serie SerialPort;
        static Led OutputPort;        
  
  public static void Principal ()
        {
            / / Inicializa el puerto serie es COM1 (usando D0 y D1)      
            serial = nuevo SerialPort ( "COM1" , 56000,
                                    Parity.None, 8, StopBits.One);
            / / Abrir el puerto serie, así que podemos enviar y recibir datos      
            serial.Open ();
            / / Añadir una-controlador de eventos para el manejo de datos de entrada      
         
            Led = new OutputPort (Pins.ONBOARD_LED, false);
            while do ( true )
            {
                Led.Write ( true );
                Thread.Sleep (1000);
                Led.Write ( false );
                byte [] msg =
                 Encoding.UTF8.GetBytes ( "Netduino \ n" );
                serial.Write (msg, 0, msg.Length);
            }
        }
    }
}

El código de recepción es sólo una interrupción de recepción casi igual a la que se muestra en la parte 1 de esta serie de la comunicación en serie.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using System;
using System.IO.Ports;
using System.Threading; using Microsoft.SPOT;
using Microsoft.SPOT.Hardware; using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.NetduinoPlus;
using System.Text; namespace NetduinoPlusSerialExample
{
    public class Program
    {
        estaticde serie SerialPort;
        estatic  Led OutputPort;        
  
  public static void Principal ()
        {
        
   / / Inicializa el puerto serie es COM1 (usando D0 y D1)      
            serial = new SerialPort ( "COM1" , 56000,
                                    Parity.None, 8, StopBits.One);
            / / Abrir el puerto serie, así que podemos enviar y recibir datos      
            serial.Open ();
            / / Añadir una-controlador de eventos para el manejo de datos de entrada      
            serial.DataReceived + =
                New SerialDataReceivedEventHandler (serial_DataReceived);
    Led = new OutputPort (Pins.ONBOARD_LED, false );            
    Thread.Sleep (Timeout.Infinite);        
     }
  
  
        private estatic empty serial_DataReceived (Object sender,
            Y SerialDataReceivedEventArgs)
        {
            Thread.Sleep (100);           
   
   int = BytesToRead serial.BytesToRead;
            
   / / Empieza a leer la corriente
            si (BytesToRead> 0)
            {
                / / Obtener el tiempo de espera
                byte [] = tampón new byte [BytesToRead];
                Serial.read (tampón, 0, buffer.length);
                cadena = restoredText
                  new cadena (Encoding.UTF8.GetChars (buffer));
                Debug.Print (restoredText);                
    
    / / Volver a enviar
                serial.Write (tampón, 0, buffer.length); Led.Write ( true );
            }
            Led.Write ( false );
        }    
 }
}

Recuerde que debe depurar sólo la placa que recibe los datos, y conectar el adaptador que transmite los datos más tarde. Hecho esto, recibirá los mensajes de » Netduino! » en su resultado de la depuración de la consola.

Se puede usar  la salida 3.3V de la placa receptora para alimentar la placa de transmisión de la nota de la foto que llevó PWR , ya que es el nivel de procesador.

Ahora podemos hacer las tres pruebas en el canal: la primera es tratar de enviar un gran mensaje como: » El euskera es vice siglos de los siglos ! \ n «. Hasta aquí todo bien, si se repite el procedimiento para volver a programar el código de la tarjeta que transmite, la depuración de la placa receptora y luego conecte el adaptador que transmite.

Después de repetir el procedimiento antes de retirar los 100 ms de pausa en la interrupciónserial_DataReceived () .

1
/ / Thread.Sleep (100);

Se produce un error en la placa al recibir algunos mensajes en la ventana de salida de depuración y luego un error: » Excepción no controlada del tipo ‘System.Exception’ en mscorlib.dll «. A modo de curiosidad de la salida de depuración se veía así:

Los diamantes son uno de esos olores nocturnos y leñosas que hace que cualquier mujer p
supuesto Erder. No
ocurre los li
mites en un plazo
de amadeir
ado y no ab
usos del olfato
ajeno. Diamo NDS es una d esas perfusión mes nocturnos  y Woody  haciendo lo que quieren las mujeres p supuesto Erder.  , no se d los límites en  términos de amEl primera oportunidad del tipo ‘System.Exception’ en mscorlib.dll Excepción no controlada del tipo ‘System.Exception’ en mscorlib.dll

 

La pregunta ahora es, ¿por qué sucede?. Esto sucede debido a que en comunicación  serie no existe un buen control de los mensajes de flujo, a diferencia de los protocolos de red , Ethernet y USB ,el protocolo  serie es sólo para los medios de comunicación y  depende de usted para hacer una capa de código para controlar posibles problemas de comunicación.

Con el fin de que el hardware (procesador) controle  cuando se envíe un mensaje de 8 bits (1 caracteres ) a la vez, y el primer recibo (el primer bloque ) no encienda la función de recepción,debe sospesar que  se está enviando y el tiempo que se necesita para realizar la función:

1
Serial.read (tampón, 0, buffer.length);

Otros datos se reciben, pero sin control alrededor de 12 caracteres como vemos por el mensaje anterior. El retardo fijo hace que se reciba el mensaje completo antes de la lectura de modo que cuando se ejecuta la lectura de serie de un mensaje completo se puede interpretar. El error en el extremo es causado por esta inconsistencia  entre los bloques de mensajes y la interpretación del código.

Etapa 2 – Prueba del byte dañado

Una prueba que puede hacer es encender la placa de transmisión antes de depurar el código de recepción de mensajes en otro plato . Un error también,pues  este error se debe a la entrada de un paquete con un carácter que no puede ser interpretada por el código ASCII para una cadena y se produce un error en la línea:

1
2
cadena = restoredText
                   nueva cadena (Encoding.UTF8.GetChars (buffer));

Este carácter es el resultado de una oscilación causada o en el momento en el poder estaba conectado a una condición de plato o timeout que el resto del byte leído como nivel lógico alto cuando la lectura es común recibir algo cercano a 0xFF estos casos.

La practica  habitual entre los programadores es deshacerse de estos errores y buscar el mensaje hacia adelante, por lo que puede resolver estos dos problemas con una fecha de entrega y bloque un try {} {} cach e ignorar los errores que perjudiquen su código.

3 ª Fase – Comprobación de la longitud de la conexión

La tercera prueba, es más una continuación de la anterior, es la prueba de longitud de cable, aquí se he probado con un cable de 60 pies para ver la alteración en la señal,siendo los resultados no demasiados buenos como se puede ver las imágenes obtenidas con el osciloscopio. Tenga en cuenta que la señal de salida (señal obtenida desde el extremo amarillo del receptor pin) y la señal oscila en una placa que transmite recibe picos que el cambio puede incluso dañar la placaa.

Lógicamente el signo ni fue interpretada por el receptor, las oscilaciones en los niveles exagerados causan ​​ruido de conmutación generando  mala interpretación del byte.
La conclusión es de esta prueba es que debe  tener en cuenta que la comunicación en serie (TTL) sea  mala para el logro de las transmisiones más largas.

Soluciones

Se puede ver que el autor sufrió un montón de problemas, pero vamos a ver soluciones a los problemas identificados anteriormente. El tercero punto es el más complejo de resolver, se refiere a la vía de comunicación, lo que hace que la compensación capacitiva sea más conocida por el personal de radio y televisión como la «adaptación de impedancia». La protección se pone en algunos diodos Zener 3.3V para limitar una posible alta tensión sostenida.

Para resolver el problema de la entrada de señal equivocada se puede utilizar el control de flujo, es decir, usando las señales RTS y CTS . Su uso es bueno, pero no resuelve el problema por completo, sobre todo en el caso de prueba  pues  por lo general el control de flujo evita problemas relacionados, en particular, la velocidad de transmisión.

Para entender cómo esto sucede la  primera necesidad es una revisión  en la transmisión de la señal de disparo; la señal que desencadena la transmisión es un reloj en el interior del dispositivo transmisor que por lo general se comparte con otros periféricos y a través de una lógica de ganancia ajusta al valor deseado. La unión perfecta entre el valor exacto de la velocidad de transmisión y el reloj utilizado puede causar la pérdida de sincronización en paquetes muy grandes. Cuando el mensaje tiene que enviar muchos bytes este control RTS y CTS hace que el reloj de transmisión está «sincronizado» con el reloj del receptor cada 9 bytes transmitidos causando un pequeño error en cada transmisión se acumula causando problemas la distorsión de los paquetes.

Volviendo al problema 2, el pin RTS actúa como un disparador de prevención de la transmisión, es decir, si la estrategia en tiempo real no se ha establecido por el receptor como «estoy disponible para recibir un dado» los datos no se enviarán de manera la placa de transmisión sólo almacena los datos en su búfer interno para enviar cuando esté disponible. En caso de falta de conexión entre los dispositivos de resistencia que se requiere de pull-up manteniendo el RTS para el momento en que se desconecta de la pin se mantiene a un nivel lógico alto.

Es más complicado de resolver, ya que es la primera necesidad de un tratamiento términos de protocolo. Todas las pruebas que hizo  el autor  implican el envío de información a través de cadenas de texto, pero, de hecho, cualquier tipo de información empaquetada puede ser enviado.Ver el ejemplo de control electrónico del proyecto RogerCom , él utiliza un protocolo único, donde cada mensaje no 8bits significa una letra más fue un mensaje en sí mismo.

Para lograr la comunicación  lo que se puede hacer es empaquetar los mensajes con un terminador y promotor,como por ejemplo <>.Cuando este es leído por el dispositivo receptor a través del software para reconocer que el mensaje es completa, iniciador tiene un carácter «<» y un terminador «>» y una variable de tipo de mensaje = valor numérico. Mucho más allá del transmisor no necesita enviar deliberadamente a sus mensajes, se puede esperar a que el receptor para informarle algo para transmitir su mensaje (ya de ver el punto de vista bidireccional),.

De este modo, con su propio código puede realizar una comunicación más estable y segura sabiendo que el receptor le pide algo al transmisor que contienen los datos, y espera, comprobando si la respuesta  ha concluido , no ha respondido o el mensaje esta dañado por si  se realiza una nueva petición al transmisor.