viernes, 8 de septiembre de 2017

¿Cómo me conecto a través de puerto serial o UART TTL con Ubuntu?

¡Mis queridos descamisados!
Cuando un hombre llega a un gobierno se le presenta una disyuntiva que es muy grave y tiene que resolverla antes.
O usted se dedica a apoyar las fuerzas ya colocadas, en cuyo caso marcha por una carretera de dos direcciones, al final usted ya está viendo el monumento que le van a levantar; pero de noche no duerme porque su conciencia tiene el hambre y la miseria de su pueblo. El otro camino es la selva, en la que hay que entrar a machete, abriendo la senda. En ella todo son acechanzas, pero usted duerme tranquilo porque sabe que está trabajando para esos que tienen miseria y dolor.

Los hombres que suben al gobierno tienen dos misiones bien claras, hacer la felicidad de su pueblo y labrar la grandeza de la Nación. Muchos por labrar la grandeza de la Nación sacrifican a su Pueblo, y otros por excederse en el beneficios, sacrifican la Nación. El secreto está en equilibrar perfectamente las dos misiones, pensando siempre que es mejor un país pequeño de hombres felices que una gran potencia de individuos desgraciados.

Pues bien, este equilibrio solo puede lograrse sabiendo, y el conocimiento es algo que no todos tienen, ha de adquirirse. Siempre he dicho que el software no es otra cosa que Conocimiento en Acción, y como tal ha de difundirse y propagarse libremente en una Comunidad Organizada que busca la Justicia Social. Esta idea fundamental la hemos seguido siempre en el Justicialismo, y hoy mas que nunca depende de nosotros ampliar la Lucha por la Liberación al Software.
No podemos cesar nuestro Movimiento en pos de la Liberación, pues oscuras ideas salidas de una sinarquía internacional sin Patria ni Bandera osan - sin embargo - encadenar el conocimiento sin otro ánimo que el lucro y la especulación. El conocimiento no ha de usarse en procura de lujos, sino para el avance espiritual y cultural de la Nación. Nuestros enemigos en cambio no sólo desean implementar el oscurantismo en el software, sino que han pretendido lucrar con él bajo la falsa excusa de la calidad.

Es por ello que hemos de estar especialmente prevenidos contra el uso de herramientas tecnológicas privativas para la acción del voto, el temerariamente llamado "voto electrónico". Este cometido absolutamente pernicioso, presentado como un alarde de calidad y modernidad, no tendrá otro objetivo que robarle al Pueblo sus votos. La acción democrática fundamental - individual, secreto, y universal - pretenderá ser sometida a las digitales discreciones técnicas de un software privativo de origen barroso.

Esto no es una teoría, sino que por inacción, desaprensión e ignorancia de los Pueblos, se ha llevado a cabo ya en varias partes del globo.
Nosotros llevamos el voto a nuestras mujeres bajo premisas universales que a nadie han de negarse, pero parece que ahora se pretende reemplazar al género humano por una máquina integrada por vaya a saber quién, en ánimo de lucro y  con inconfesables intenciones. El voto no puede estar sometido a la discrecionalidad de un lenguaje de programación, pues jamás ha podido garantizarse la inexistencia de errores de cualquier tipo - y mucho menos intencionalidades perniciosas tan fáciles de ocultar - como tampoco puede asegurarse ningún software contra ello. 
El software no tiene procedencia divina, ni está entregado por Dioses a los hombres en la cima de un monte, está engendrado por hombres, que tienen sus motivaciones pero también con sus intereses. Todos los países del mundo que cayeron en el engaño no tardaron en volver sobre sus pasos asintiendo en los métodos universales.

Sin embargo, el hombre es propenso a dejar dominar su vida por sistemas que no domina. El conformismo a veces lo torna en peligro, y la veleidad del desconocimiento pende sobre los hombres como una eterna espada de Damocles. Es por ello que el Justicialismo debe estar atento y dispuesto a enfrentar con todos los medios a quienes promueven las ideas dañosas. En tal caso no sólo el valor de la verdad debe ser empleado, pues en los intereses no hay veleidad: quien promueva el uso de sistemas electrónicos programables para el voto ha de ser perseguido y castigado por Ley, sus empresas desarmadas y sus capitales naturalmente diseminados.

Naturalmente, ha sido sencillo violar y vulnerar un sistema basado en radiofrecuencias RFID como lo es el Vot.AR, que emplea código libre bajo Ubuntu y código privativo bajo hashes de encriptación poco seguras. Este equipo puede ser empleado como un aparato para reproducir música a demanda, pero no para votar, pues es propenso a ser falsificado, modificado, victimizable con técnica de suplantación de identidad en el servidor, acceso remoto por red ethernet y por comunicación serial.

Indudablemente, la acción de hacking defensivo nunca debe hacerse de forma ética. Quien así lo crea no es más que un iluso, y en este caso particular, uno muy peligroso. La misma ha de conformarse de forma malévola e inequívoca, en forma individual o en equipo, y en este caso declaro contar con herramientas, tanto libres como privativas probadas y testeadas capaces de vulnerar tal sistema Vot.AR y accionar sobre el en base a los intereses del Pueblo Justicialista.
Ahora bien, una de las herramientas más útiles para comenzar proyectos de hackeo o lo que llamamos "ingeniería inversa" es la antigua y universalizada interfaz de entrada y salida en serie.

Vean señores, antiguamente era común emplear uno o más puertos seriales (denominados COM1, COM2, etc) como interfaz de control con módems telefónicos externos, ratones seriales, lectores de barras, instrumental científico y con toda una miríada de máquinas-herramientas y controladores antiguos.  En la PC estos se constituían usualmente en un puerto tipo DB9 macho, y más raramente el DB25 macho, ambos siguiendo el estándar de comunicación "RS-232" ("estándar recomendado 232".

La comunicación serial es de implementación muy sencilla desde lo computacional, y nos permite enviar y recibir cualquier información que necesitemos entre puertos seriales de una computadora y otro dispositivo, de forma que pueda ser visualizada empleando nuestro emulador de terminal.


Antiguamente, antes que se fuesen comunes las redes Ethernet, incluso se podían conectar dos coimputadoras en un enlace punto a punto a través del protocolo RS-232 usando un cable serial cruzado, o directamente empleando un cruzador macho DB9.




Las señales bajo el estándar RS-232 representan su lógica alta (el "1") en base a un voltaje negativo - que puede ir desde los -3 voltios a los -25 voltios), y la lógica baja ("0") se transmite en el cable a través de un voltaje positivo, que nuevamente puede ir entre los +3 y +25 voltios. En los papeles, en la mayoría de las PC se toma como referencia el voltaje de la fuente conmutada y se suma un voltio por seguridad, por lo cual la señal suele oscilar entre -13 voltios hasta los +13 voltios. Cuanto mas extremos sean los voltajes empleados para la señal transmitida bajo RS-232, menor será la suceptibilidad de que se encuentre ruido, interferencia o degradación en la señal. Esto significa que una señal RS-232 generalmente puede viajar a mayores distancias, y no son raros usar cables de 30 o 50 metros para PC, o mayores para otros dispositivos antiguos con voltajes mayores.

Con los enlaces seriales, hay cinco aspectos que debemos conocer y configurar para poder conectarnos a un dispositivo (configurables en nuestro emulador de terminal o programa de comunicaciones):
  1. Velocidad de Línea: Indica la velocidad a la cual el host nos enviará los datos. Normalmente se puede establecer las siguientes velocidades en baudios: 110, 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600 y 115200.
  2. Tamaño del Byte: cuán grande es el byte. Normalmente se acepta un byte compuesto por 8 bits, pero antiguamente podía usarse uno de 7 bits.
  3. Paridad: Determina si el host nos envia información de paridad para combatir los errores inducidos por ruido de línea, o al menos si la espera, puede ser par (E), impar (O) o no haber ninguna (N). 
  4. Bit de Parada (stop): ¿Cuantos son?
  5. Control de Flujo (flow control). ¿Hay alguno? Se hace a nivel hardware (CTS+RTS o DTR+DSR), a nivel software, o con ninguno.

La combinación de tamaño de Byte, paridad y nombre de bits de parada se abrevia en una designación de tres caracteres, como 8N1. La primera posición indica el tamaño de byte. Podríamos encontrar en los manuales técnicos referencias a 7N1, que es similar a 8N1 sólo que con un byte de 7 bits. La segunda posición indica la paridad, y puede ser par ("even", E), impar ("odd", O), o más comúnmente ninguna ("none", N). La tercer posición identifica el número de bits de parada, que en este caso es 1.

Progresivamente los puertos COMM han ido quedando en desuso y actualmente los fabricantes suelen omitirlos en sus placas madre. Afortunadamente, para suplirlos existen adaptadores USB a Serial, o más correctamente, USB a RS-232, que nos permiten restituir un puerto de estas características compatibilizándolo a través del sencillo puerto USB.
Comunicación serial RS232 en Ubuntu
Si disponemos de un puerto serial COMM o de un adaptador USB a serial, bien podremos usar nuestro sistema para establecer una comunicación con otro equipo o dispositivo, siempre que le indiquemos los parámetros específicos.

La manera mas sencilla es utilizar el viejo programa GNU Screen, que se ejecuta directamente en nuestro emulador de terminal, y muestra en pantalla los resultados de la comunicación. La sintaxis de dicho comando es:

sudo screen dispositivo velocidad parámetros

En el caso de los adaptadores USB a serial, dicho dispositivo suele tener asignado una nomenclatura de dispositivo de sistema, normalmente /dev/ttyUSB0 (el 0 representa al primer dispositivo, si hubiese varios se los designa /dev/ttyUSB1, /dev/ttyUSB2, etc). En cambio, los puertos COMM tradicionales reciben un nombre ligeramente diferente, ya que suelen ser /dev/ttyS0 (y en dispositivos embebidos puede usarse el identificador de consola por defecto, /dev/tty0).

Para conocer nuestro dispositivo, bien podremos conectar el adaptador USB a Serial a un puerto USB del equipo y utilizar el comando:

dmesg | grep tty

...y el sistema debería devolvernos algo como:

[... ...] USB 2-2.1 pl2303 converter now attached to ttyUSB0.

Suponiendo que queremos conectar nuestro sistema a un viejo router Cisco con interfaz serial RS232, usando un adaptador USB a serial (identificado como vimos con /dev/ttyUSB0), y en el manual del mismo se identifica la velocidad de conexión serial en 9600 baudios por segundo, y los parámetros de conexión en 8 bits por byte, sin paridad (N), y 1 bit de parada, debemos usar:

sudo screen /dev/ttyUSB0 9600 8N1

Y esto establecerá la comunicación propiamente dicha.
Screen es ampliamente compatible con hardware viejo (incluyendo aquellos anteriores al primer peronismo, como por ejemplo máquinas teletipo). No obstante su condición de "menor común denominador" lo hace ideal para probar, actualmente podríamos querer una solución mejor para operar desde nuestra terminal, empleando un programa capaz de almacenar los logs de comunicación serial, establecer y memorizar parámetros de conexión, y distintos aspectos que hasta el viejo HyperTerminal era capaz de proveer. En este caso encontraremos tales facilidades en el excelente Minicom, un programa de terminal de comunicación apto para interfaces seriales y de otro tipo.

Para instalarlo desde nuestra terminal emulada en GNU con Linux, ingresamos el siguiente Comando de organización:

sudo apt install minicom

Una vez instalado, podremos proceder a configurarlo. Para ello ingresamo:

sudo minicom -s

En el menú que se abra, vamos a Configuración de la Puerta Serial:

Presionamos a pàra configurar un puerto serial. Aquí borraremos el nombre de dispositivo original e indicaremos el nuestro, en mi caso /dev/ttyUSB0. Luego presionamos Enter.

Luego presionamos e para modificar los parámetros de la conexión. En el menú resultante presionamos c para elegir la velocidad de 9600 baudios, y presionamos q para establecer la configuración 8N1 (8 bits por byte, paridad ninguna, 1 bit de parada). Luego presionamos Enter.

En el caso particular de este router Cisco, debemos usar control de flujo por hardware, el cual activamos con la tecla f.

Una vez que volvemos al menú principal, podremos grabar estas opciones como opciones por defecto, o ponerle un nombre de perfil (en el ejemplo, router-cisco):
Ahora podremos conectarnos utilizando dicho perfil desde nuestra terminal, con:

sudo minicom  router-cisco

Y establecerá la comunicación con los parámetros deseados.

Comunicación serial UART TTL en Ubuntu


Ahora bien, la mayoría de los microcontroladores actuales no son como el viejo router Cisco, sino que tienen incorporada una interfaz UARTs (Transmisor/receptor universalmente asíncrono), que puede ser empleados para recibir y transmitir datos en serie. Esté método de comunicación serial directa a menudo recibe el nombre de lógica serial TTL ("transistor a transitor").

Las interfaces UART TTL pueden venir de perillas para transmitir archivos, corregir o realizar flasheos de firmware a diferentes aparatos, reestablecer routers o mothers a través de una consola UART, programar distintos dispositivos modernos a través de una consola serial, trabajar con placas de desarrollo, hacer ingeniería inversa, etc.

Muchos fabricantes e integradores de dispositivos disponen de estas terminales de entrada/salida en sus placas para tareas de control o de programación para su hardware. No es extraño que las placas madre lo permitan para escribir a través de ellos firmware en su memoria EEPROM, o podamos modificar el funcionamiento de determinado hardware. La comodidad está dada para el fabricante, pues en no pocas ocasiones estos puertos vienen de a pares nomenclados como RX (recepción) y TX (transimisión), mas un pin de tierra (GND o G), y vienen dispuestos en formas de pines simples o triples, o al menos figuran como contactos no poblados ("pelados") pensados para soldarle los pines a la plaqueta.



Los dispositivos UART TTL son compatibles con los RS232 sólo desde la perspectiva del software, ya que ambas interfaces transmiten con la metodología de un bit por vez (serialmente), a una velocidad de baudios específica, con/sin bits de paridad y con/sin bits de parada. Sin embargo, ambas interfaces difieren fundamentalmente a nivel hardware (eléctrico). La comunicación serial UART TTL transmitirá con bajos voltajes continuos, operando entre los límites de 0 voltios y el Voltaje de alimentación Vcc (el cual puede tomar el valor de 3,3 voltios o de 5 voltios). Su lógica eléctrica también es opuesta al RS-232 ya que el valor activo ("1") queda representado por el pico de tensión continua, mientras que la baja de la lógica ("0") es 0 voltios. Esto hace que no podamos enlazar directamente un microcontrolador UART TTL a un puerto serial COMM de nuestra computadora pues las interfaces a nivel hardware son incompatibles.

Para establecer comunicación debemos usar un adaptador correspondiente, siendo los más simples y confiables los de tipo USB a UART TLL

En el caso de la UART TTL, al ser lógica de transistor a transistor, debemos buscar específicamente el voltaje operativo. Os recomiendo contar con ambos modelos: USB a TLL de 3.3 voltios y USB a TLL de 5 voltios. También pueden contar con un modelo multivoltaje como el ilustrado (son muy comunes y operan simultáneamente; en tal caso, sólo hemos de conectar la línea que corresponde al voltaje indicado, y omitir el otro). Normalmente el voltaje del UART del host suele indicarse en la misma placa o en el manual del dispositivo, pero no siempre es el caso. Otros adaptadores utilizan el estándar FTDI, cuyos pines vienen armados en un bloque específico para trabajar con Arduino y dispositivos similares.

Ya que a diferencia del RS232 o FTDI, el UART TTL no tiene un conector normalizado sino simples pines, el adaptador USB a TTL UART debe conectarse siguiendo las siguientes indicaciones pertinentes. Normalmente la interfaz viene con tres o cuatro pines de conexión. Siempre debemos conectar primero la línea GND (o G que es la conexión a tierra) al pin correspondiente. Luego debemos conectar las lineas de datos RX (o R, Recepción) del adaptador USB a UART TTL a la linea TX del dispositivo, y la línea TX (o T, Transmisión) del adaptador UART TTL a la linea RX del dispositivo .
El esquema sería el siguiente:
Finalmente hacemos lo propio con la línea que corresponda al voltaje (VCC), que en los dispositivos multivoltaje puede ser la línea de 3,3 voltios o la línea de 5 voltios, pero jamás deben usarse al unísono. Si desconociéramos cuál es voltaje utilizar, siempre debemos probar primero con el USB a TTL de 3,3 voltios, pues es mucho más común y con ello no correremos riesgo de sobrevoltar al dispositivo (a lo sumo, no podremos establecer comunicación alguna, pero nunca quemaremos por sobrevoltaje al controlador). Sólo en el caso de estar seguros de emplear 5 voltios, directamente conectamos el mismo y omitimos el de 3.3 voltios. Cumplida la etapa de conectar las líneas, conectamos el adaptador al puerto USB del nuestro equipo.

Para establecer la comunicación a través de UART TTL debemos seguir los mismos pasos que para un adaptador USB a serial convencional. Es cierto que bien podremos emplear directamente nuestra terminal con screen o minicom si la configuramos apropiadamente, pero en este caso usaremos un emulador de terminal gráfico específicamente pensado para estos menesteres.
Se trata de CuteCom, un programa de comunicaciones para este tipo de terminal serial. Lo instalamos abriendo una terminal con Ctrl+Alt+T e ingresamos el siguiente Comando de Organización:
sudo apt install cutecom

Una vez instalado, lo lanzamos desde Aplicaciones / Otras / CuteCom.


Nuevamente, las variaciones de comunicación deben buscarse en el manual del dispositivo si es posible, o investigarse. Sin embargo, os indicaré las respuestas mas comunes en los dispositivos modernos UART TTL:
  1. Velocidad de línea: 115200, casi siempre. Estos 115,2 kilobits por segundo equivalen a unos 14,4 kilobaudios (como un modem de la época del primer peronismo!).
  2. Paridad: ninguna.
  3. Bits de parada: siempre 1. Algunos sistemas más antiguos que emplean partes electromecánicas a veces empleaban 2 bits de parada para enlentecer la respuesta de la línea de comunicación en tanto las distintas piezas se acomodaban, ya no suele ser el caso.
  4. Tamaño de Byte: 8 bits por Byte.
  5. Control de Flujo: Por software únicamente. Los dispositivos de consola muy raramente usan control de flujo por hardware pues era complicado de implementar. Sólo algunos aparatos de uso crítico preferían emplearlo.

Armados con todo este conocimiento que como Conductor he puesto a vuestra disposición, podrán configurar el protocolos de comunicación serial tanto para equipos antiquísimos o modernos, y establecer la misma a través de un puerto serial siguiendo tanto RS232 como TTL.


Finalmente, debemos saber que en caso de necesidad, existen adaptadores que llevan la lógica UART TTL a la RS232 que podremos utilizar si es necesario para compatibilizar dispositivos dotados de interfaz UART TTL a otros con interfaz serial que sigue el estándar RS232.

5 comentarios:

  1. Hola buenas como le va Gereral, muy buena la explicación, Estoy tratando de resusitar un Router TP-Link 941Nd que se reinicia todo el tiempo,pero no logro poder ingresar el primer comando (TPL) para que se detenga el reinicio automatico, Alguna idea ? que puedo hacer.

    ResponderEliminar
    Respuestas
    1. Estimado MTK:

      En el caso del TP-Link 941ND puede entrar a la terminal cuando la LED "Sys" parpadea rápido (tiene 2 segundos para loguearse a través de telnet).
      Sin embargo, el hecho de que se reinicie podría deberse a un error de memoria, en cuyo caso se reinicia ad infinitum. Normalmente se pueden recambiar las memorias por un chip SDRam de 32mb, pero ello requiere un conocimiento y herramental de desoldadura, además de contar con una memoria compatible. No suele ser demasiado recomendable salvo que tenga el repuesto de la memoria y el herramental "para ver que resulta".

      Atte.

      Juan Perón

      Eliminar
  2. Buenas tardes compañero ! , Le hago una consulta que es muy popular por mis pagos y en estas fechas. Quisiera enviar bytes al puerto popular y serial al dispositivo de arduino conectado en /dev/ttyACM0. Hice un intento de programa en C con geany y como la unica verdad es la realidad le cuento que no encuentro la direccion en hexadecimal para poder habilitarlo con ioperm(0x.....) y poder manejarlo tranquilo y en paz sin necesidad de abrir el "serial monitor" de arduino . Como no hay nada mejor que otro peronista para estas consultas , se la despacho por esos foros. Como usted dice "donde hay una necesidad nace un derecho" , se lo vengo a manguear modestamente. Le agradezco mucho

    ResponderEliminar
  3. Buenas tardes compañero ! , Le hago una consulta que es muy popular por mis pagos y en estas fechas. Quisiera enviar bytes al puerto popular y serial al dispositivo de arduino conectado en /dev/ttyACM0. Hice un intento de programa en C con geany y como la unica verdad es la realidad le cuento que no encuentro la direccion en hexadecimal para poder habilitarlo con ioperm(0x.....) y poder manejarlo tranquilo y en paz sin necesidad de abrir el "serial monitor" de arduino . Como no hay nada mejor que otro peronista para estas consultas , se la despacho por esos foros. Como usted dice "donde hay una necesidad nace un derecho" , se lo vengo a manguear modestamente. Le agradezco mucho

    ResponderEliminar
  4. Estimado Carlitos Cook:

    Desconocemos específicamnete la dirección de memoria que nos solicita. En Linux puede escribir a los dispositivos /dev/ directamente, como si se trataran de un programa o arachivo.

    Los direccionados de memoria directa eran algo de MS-DOS, y en tal caso debía escribir al puerto COM1 o COM2 que usaban las estándares direcciones
    COM1 - 3F8 por la interrupción IRQ4 y COM2: 2F8 por la interrupción IRQ3.

    Las COM3 y COM4 no se usaban mucho y eran mas bien referenciales, pero se solían usar COM3 - 3E8 IRQ4 y COM4 - 2E8 IRQ3.

    En cuanto a direccionamiento a través del BIOS se utilizaba un rango de memoria de datos en la BIOS compuesto a dos bytes, que eran:

    0000:0400 COM1
    0000:0402 COM2
    0000:0404 COM3
    0000:0406 COM4

    Desconocemos si esta información le podrá servir en su proyecto.

    Atte.

    Juan Perón

    ResponderEliminar