Android y comunicación de puerto serie: conceptos básicos

prefacio

Android no es solo un sistema operativo para teléfonos móviles, se puede ver en muchos campos.

Ya sea un sistema de vehículo, un sistema de control industrial, un sistema de control de pantalla o un dispositivo de Internet de las cosas, básicamente hay un lugar para Android.

Bajo el llamado invierno frío, el desarrollo de Android puro parece que ya no es popular, por lo que cada vez más desarrolladores de Android se han dirigido a los campos del control automotriz e industrial.

En estos campos, no se puede pasar por alto el conocimiento relacionado con la comunicación del puerto serie. Ya sea la comunicación entre el sistema del vehículo y varios sensores de la carrocería del vehículo o la ECU o la interacción entre el sistema de control industrial y el PLC, el puerto serie es inseparable. .

Me avergüenza decir que aunque apenas puedo ser considerado como un controlador industrial de Android, el trabajo real que hago es ajustar las ruedas y los parámetros, y siempre he tenido un conocimiento a medias de los principios básicos.

Dio la casualidad de que estaba libre recientemente, así que decidí aprender primero de la comunicación en serie y consolidar lentamente mis conocimientos básicos.

Durante el proceso de aprendizaje, también compartiré lo que he aprendido con las pocas experiencias que he acumulado en mi trabajo.

Debido a que no sé mucho sobre este aspecto, entonces es inevitable que haya errores, si los hay, espero que me puedan corregir.

Algunas de las tablas de este artículo provienen de las referencias marcadas al final del artículo.

Conceptos básicos del puerto serie

serie frente a paralelo

Si queremos que dos dispositivos (microcomputadora de un solo chip, computadora, etc.) se comuniquen entre sí, generalmente hay dos formas: en serie y en paralelo.

Por ejemplo, queremos enviar datos de 8 bits del dispositivo A al dispositivo B.

Si es un método en serie, se alineará desde el bit 1 al 8 y lo enviará en una línea (tenga en cuenta que una línea aquí no es una línea en el sentido físico, puede entenderse como una línea de datos completa) pasado .

Si se utiliza el método paralelo, puede haber 8 líneas conectadas entre el dispositivo A y el dispositivo B, y los datos de 8 bits se enviarán al dispositivo B desde 8 líneas al mismo tiempo que se envían.

Puede que no sea fácil de entender directamente, pero puedes entenderlo en segundos mirando esta imagen:

serie_paralelo

No es difícil ver en la figura anterior que la transmisión en paralelo es más rápida que la transmisión en serie, pero el costo de la línea correspondiente también es más alto y la capacidad antiinterferencias no es tan fuerte como en serie, por lo que la distancia de comunicación en paralelo no es tan buena como serie Larga distancia.

Al mismo tiempo, debido a que los periféricos del protocolo en serie son simples, el costo es bajo y la distancia de comunicación es larga, por lo que generalmente usamos la transmisión en serie entre microcomputadoras de un solo chip o dispositivos de control industrial.

La transmisión en serie se puede dividir en serie síncrona y serie asíncrona.

Serie síncrona frente a serie asíncrona

La serie síncrona significa que la frecuencia del reloj de las dos partes en la comunicación es consistente, el receptor siempre está listo para recibir datos y solo necesita recibir la señal para comenzar la transmisión para transmitir datos continuamente, no hay brecha entre los datos, no hay inicio bit y End bit, alta eficiencia de transmisión, puede llevar a cabo una comunicación de uno a muchos. Los seriales síncronos de uso común son I2C y SPI.

Serie asíncrona significa que la frecuencia de reloj de las dos partes es inconsistente. Al transmitir datos, el formato de trama se utiliza para la transmisión. Cuando el remitente envía cada trama de datos, necesita agregar un bit de inicio y un bit de finalización. El receptor se da cuenta al leer el bit de inicio y el bit final Sincronizado con la información del remitente, la eficiencia de transmisión es baja y solo es posible la comunicación 1 a 1. Por lo general, una trama de datos consta de un bit de inicio, un bit de datos, un bit de paridad y un bit de parada. El serial asíncrono de uso común tiene UART, que es lo que comúnmente llamamos comunicación serial.

Comunicación serie (UART)

Para lograr la comunicación en serie, necesitamos conectar tres cables entre los dispositivos: TX (enviar), RX (recibir), GND (tierra).

Conecte el TX del dispositivo A al RX del dispositivo B; conecte el RX del dispositivo A al TX del dispositivo B; conecte la GND de los dispositivos A y B.

Dado que hay extremos de envío y recepción entre cada dispositivo, la comunicación del puerto serie es una comunicación full-duplex, es decir, admite el envío y la recepción de datos al mismo tiempo.

Si queremos enviar un carácter "E" desde el dispositivo A al dispositivo B, el efecto de envío es el siguiente:

1

Es decir, se envía un dato desde el extremo de transmisión (TX) del dispositivo A al extremo de recepción (RX) del dispositivo B.

En este momento, si mide el nivel en esta línea al enviar datos, obtendrá un diagrama de forma de onda de este tipo:

2

Es decir, el binario "01000101" se convierte a 69 en decimal, lo que representa la letra "E" en ASCII:

3

¿Y cómo se definen aquí el 0 y el 1 en el nivel? En términos generales, definiremos el nivel alto como 1 y el nivel bajo como 0. Cómo definirlo se discutirá más adelante, pero presiónelo por ahora.

De hecho, el diagrama de forma de onda aquí no está completo, ¿recuerda lo que dijimos anteriormente cuando presentamos la serie asíncrona? Utiliza la transmisión de cuadros para transmitir datos. Es decir, una trama de datos completa debe contener al menos el bit de inicio anterior (1 nivel bajo) y el último bit final (1-2 nivel alto):

4

Además, los bits de datos en un marco de datos pueden ser de 5 a 8 bits, generalmente hablando, se usan 8 bits; también puede haber un bit de verificación después del bit de datos y antes del bit final para verificar si la transmisión de datos es correcta (comprobación de paridad, comprobación de CRC, etc.), cuando está inactiva, la línea de datos genera un nivel alto, que se denomina bit inactivo:

5

Entonces, la pregunta es, ¿cómo sabe el extremo receptor cuántos bits de datos se usan, si se deben usar sumas de verificación y cuántos bits finales hay?

La respuesta es que no lo sé, y no puedo saberlo.

Por lo tanto, generalmente antes de que comience la comunicación en serie, ambas partes deben acordar los bits de datos, los bits de paridad y los bits de parada que se utilizarán.

En uso general, hay 8 bits de datos, sin paridad, y 1 bit de parada, que se conoce comúnmente como "8N1".

Además de los tres parámetros mencionados anteriormente, también hay un parámetro que debe acordarse antes de iniciar la comunicación, que es la "velocidad en baudios".

La tasa de baudios es cuántos bits de datos se transmiten por segundo y la unidad es bps (bits por segundo).

Volviendo al diagrama de transmisión de la letra "E" que mencionamos anteriormente, aunque el cambio de nivel se puede ver intuitivamente en el diagrama, ¿cómo debe saber el receptor que "cuánto tiempo" es un bit? Esto requiere nuestra tasa de baudios.

Por ejemplo, si la tasa de baudios que configuramos arriba es de 9600 bps, significa que se envían 9600 bits por segundo, es decir, el ancho de un bit es de 104 microsegundos.

En este momento, después de que el receptor lea el bit de inicio, comenzará a leer datos cada 104 microsegundos hasta que se lea el bit final.

(De hecho, generalmente hay un retraso de 52 microsegundos después de que se lee el bit de inicio antes de comenzar a leer, y luego cada 104 microsegundos para leer, esto es para evitar la inestabilidad de los datos al comenzar a leer)

Desde entonces, se han explicado todos los principios básicos de la comunicación en serie.

¿Sientes que falta algo?

Sí, todavía queda una pregunta arriba, es decir, ¿cómo definimos alto nivel y bajo nivel?

Esto nos lleva a nuestro próximo protagonista, RS232.

RS232

En términos generales, la comunicación del puerto serie utiliza el nivel TTL.

TTL es lógica de transistor-transistor, lógica de transistor, su circuito está compuesto por transistores bipolares y el voltaje de trabajo es de 5V. Por lo tanto, generalmente consideramos el voltaje de +5 V como nivel alto (1) y 0 V como nivel bajo (0). Sin embargo, la salida de nivel alto mínimo del circuito TTL es de 2,4 V y el nivel bajo máximo es de 0,4 V, lo que conduce a una diferencia mínima entre los niveles alto y bajo de solo 2 V, por lo que es extremadamente susceptible a interferencias al transmitir datos. , como este Cuando se ve perturbado por la electricidad estática, puede cambiar el nivel bajo al nivel alto. Por lo tanto, la distancia de este método de transmisión es muy corta, generalmente dentro de 1 metro, y solo es adecuado para la transmisión de datos entre chips o entre dispositivos y computadoras.

Para mejorar estas deficiencias, la American Electronics Industry Alliance ha desarrollado un estándar: RS232.

La forma de mejorar RS232 es muy simple, es decir, aumentar el nivel.

Para mejorar el nivel de transmisión, solo necesitamos agregar un chip de conversión de nivel entre los dispositivos de transmisión del puerto serie original.

En este momento, si el dispositivo emisor envía un nivel alto de 5 V al chip de conversión, se elevará a -15 V y se enviará al dispositivo receptor; de lo contrario, si el chip recibe un nivel alto de -15 V, se convertirá a 5V enviado al dispositivo.

Esto completa la operación de convertir el nivel TTL al nivel RS232.

6

En RS232, el nivel alto (1) es de -3 V a -15 V; el nivel bajo (0) es de +3 V a +15 V.

7

RS232 solo cambia el nivel, por lo que la diferencia entre los niveles alto y bajo es de casi 20 V, por lo que la capacidad antiinterferencias de RS232 se mejora en gran medida, y la distancia de transmisión ha alcanzado los 15 metros teóricos, mientras que el formato de datos de transmisión tiene sin cambio. Pero esto también lleva a que la velocidad de transmisión máxima de RS232 solo pueda usar 19200 bps, lo que hace que la velocidad de transmisión sea limitada, y la capacidad de resistir la interferencia de modo común aún no mejora.

Por lo tanto, nació el estándar RS485.

RS485

Al igual que RS232, RS485 también se realiza agregando un chip de conversión de nivel sobre la base de la comunicación en serie original.

8

La diferencia es que RS485 ya no usa un método de juicio de nivel fijo, sino que usa señales diferenciales para representar datos.

El cableado RS485 solo necesita dos cables A y B. Un 1 lógico se representa cuando la diferencia de tensión entre A y B está entre 2 V y 6 V; un 0 lógico se representa cuando la diferencia está entre -6 V y -2 V.

Al mismo tiempo, el RS485 generalmente está cableado en forma de par trenzado, lo que mejora en gran medida su capacidad para resistir la interferencia de modo común, porque los voltajes de A y B cambiarán cuando se alteren, y su diferencia de voltaje básicamente no será afectado. .

9

Debido a las características de RS485 que utilizan señales diferenciales, la señal mínima transmisible puede alcanzar los 200 mV, la velocidad máxima de transmisión de datos puede alcanzar los 10 Mbps y la distancia de transmisión puede alcanzar los 1200 metros.

Sin embargo, debido a que RS485 solo usa dos cables, y ambos cables se usan para transmitir los mismos datos, solo admite comunicación semidúplex, es decir, solo puede enviar o recibir datos al mismo tiempo, y no puede enviar ni recibir datos al mismo tiempo. al mismo tiempo; pero también debido a esta característica, RS485 es diferente de RS232, que solo puede comunicarse con dos dispositivos punto a punto, pero puede comunicarse uno a muchos, es decir, un maestro puede comunicarse con múltiples esclavos en al mismo tiempo.

10

Resumir

Desde entonces hemos tenido una comprensión básica de la comunicación serial.

De lo anterior, podemos encontrar que UART define el estándar de formato de transmisión de datos, y RS232 y RS485 definen el método de transmisión de datos y el método de cableado a nivel físico:

11

En otras palabras, ya sea que se trate de comunicación en serie, RS232 o RS485, su formato y contenido de datos son en realidad los mismos.

Para nosotros, los desarrolladores de Android, no importa qué estándar usemos, casi no tiene ningún efecto sobre nosotros. Todo lo que tenemos que hacer es analizar los datos transmitidos a través del puerto serie.

como probar

Después de explicar el principio de comunicación en serie anterior, ¿cómo debemos probarlo?

Por supuesto, la mejor manera es tener una máquina real para las pruebas, pero a veces no tenemos el equipo a mano o es inconveniente usar equipos reales para las pruebas, entonces podemos usar puertos seriales virtuales para las pruebas de simulación.

descripción general

La prueba de simulación en Windows es mucho más sencilla que en MAC.

El proceso general es: use el software para crear un puerto serie virtual; inicie el emulador de Android y conéctese al puerto serie virtual creado; complete la comunicación entre Android y el puerto serie virtual.

Dado que actualmente estoy usando una MAC como mi máquina principal, trato de realizar una prueba de simulación en la MAC de acuerdo con los pasos anteriores.

Pero está atascado en el primer paso, que es crear un puerto serie virtual.

Traté de buscar y descubrí que no hay ningún software de puerto serial virtual disponible en Mac. Finalmente encontré uno, pero el mantenimiento se detuvo porque la nueva versión de MAC tiene permisos más estrictos y ya no puede crear puertos seriales virtuales.

Afortunadamente, todavía tengo dos placas de desarrollo ESP32 a mano, por lo que no necesito usar la simulación del puerto serie virtual. Puedo usar directamente la placa de desarrollo ESP32 para realizar pruebas.

Bueno, ahora el problema viene al segundo paso.

Pero después de mis intentos, MAC aún no puede iniciar el emulador de Android para conectarse con el dispositivo serial.

Sin embargo, aunque no se puede usar, se tropezaron con algunos escollos en el proceso y se encontró una solución, así que aquí hay una introducción general.

MAC inicia el emulador y se conecta al puerto serie

En primer lugar, necesitamos crear un emulador de Android, este paso se puede crear directamente en Android Studio de la forma habitual.

Después de crear el emulador, no podemos iniciarlo directamente en Android Studio, sino que debemos iniciarlo en la terminal, porque necesitamos especificar los parámetros de inicio.

El comando debe ejecutarse para iniciar emulator. El archivo ejecutable de este comando está en AndroidSdk/tools, por ejemplo, mi ruta es /Users/equationl/Library/Android/sdk/tools. Si no sabe dónde está su directorio de AndroidSdk, puede buscar directamente "sdk" en la configuración de Android Studio y ver esta ruta en la opción "Ubicación de SDK de Android":

sdk_ubicación

Después de encontrar su ruta, ejecute el siguiente comando para iniciar el emulador:

cd /Users/equationl/Library/Android/sdk/tools

./emulator -avd Pixel_6_Pro_API_31

"Pixel_6_Pro_API_31" es el nombre del emulador que creó anteriormente.

Por supuesto, el emulador simplemente se inicia aquí y no está conectado al puerto serie, por lo que el emulador que inicia en este momento no puede encontrar el puerto serie que insertó en el dispositivo.

Si necesitamos conectarnos al puerto serie, debemos ejecutar:

./emulator -avd Pixel_6_Pro_API_31 -qemu -serial /dev/tty.wchusbserial544C0047221

Entre ellos /dev/tty.wchusbserial544C0047221se encuentra la ruta del puerto serie.

El comando para ver los puertos seriales disponibles en MAC es:

ls /dev/tty.*

Sin embargo, si su MAC es una CPU ARM, existe una alta probabilidad de que se informe un error al iniciar el emulador:

launcher_emulator_fail

Esto debería ser un pequeño BUG de Google. También se puede ver en el mensaje de error que la causa del error es que darwin-x86_64/qemu-system-aarch64este archivo no existe.

Cuando llegamos a la ruta donde se informa el error, podemos ver que no se darwin-x86_64llama ninguna carpeta, pero hay una darwin-aarch64carpeta llamada , y hay qemu-system-aarch64un archivo en ella.

Jajaja, de hecho, se estima que algunas personas ya han reaccionado aquí, obviamente somos procesadores ARM, entonces, ¿cómo es que hay una carpeta x86?

Entonces simplemente nos darwin-aarch64conectamos suavemente a darwin-x86_64.

Ejecutando una orden:

cd /Users/equationl/Library/Android/sdk/emulator/qemu

ln -s darwin-aarch64 darwin-x86_64

Luego regrese al directorio de herramientas y ejecute el comando para iniciar el emulador, puede ver que el inicio es exitoso.

Sin embargo, la conexión al puerto serie falla y se informa un error:

serial_error

Se puede ver que hay dos errores, uno es que no se puede reconocer el comando serial, el otro es que no se puede conectar al puerto serial que especificamos.

Con respecto a este error, también he buscado durante mucho tiempo y he probado varios métodos, pero ninguno de ellos puede resolverse.

Sin embargo, encontré otro método de implementación, que es usar una máquina virtual separada para iniciar un emulador de Android y luego crear un puerto serie virtual para el emulador de Android mediante esta máquina virtual y conectar este puerto serie virtual al dispositivo físico.

Ah esto? ¿Qué hay de esta muñeca? ¡Demasiado problema! ¡Renunciar con decisión!

Si está interesado, puede probarlo. La dirección del tutorial: [Android] Puerto serie de Android y exploración de depuración de NDK en mac

Resumir

Debido a las razones anteriores, el plan de prueba final que elegí es usar la versión de desarrollo de la máquina real de Android + ESP32 para la prueba.

Para los usuarios que también usan MAC, mi sugerencia es usar directamente la máquina real + la versión de desarrollo ESP32 u otras versiones de desarrollo más económicas para probar y aprender.

Es mucho más conveniente para los usuarios de Windows, no solo puede usar el mismo esquema de prueba de máquina real que MAC, sino que también puede usar fácilmente el puerto serie virtual y el emulador de Android para la prueba.

Resumir

Hoy explicamos principalmente algunos conocimientos básicos del puerto serie y presentamos aproximadamente cómo probar la comunicación del puerto serie.

Todos los puntos de conocimiento son paso a paso. La comunicación entre dispositivos incluye comunicación en serie y comunicación en paralelo. En general, usamos más la comunicación en serie en la práctica, y la serie se divide en serie síncrona y serie asíncrona. La que se usa comúnmente es Serie asíncrona y Los protocolos seriales asíncronos comúnmente utilizados son UART, que a menudo se conoce como puerto serial.Para resolver el problema de la comunicación del puerto serial, se han derivado protocolos como RS232 y RS485.

Referencias

  1. ¿Cómo puedo iniciar Android Emulator sin Android Studio en Mac M1?
  2. ¡Comprenda en 5 minutos la diferencia más esencial entre el puerto serie RS232 y RS485!
  3. RS-232, RS-485 y RS-422 de interfaz de comunicación serie
  4. 3 minutos para entender el puerto serie UART del protocolo de comunicación, ¿qué es exactamente?
  5. Una comunicación ultra simple, 2 minutos para entender, ¡el principio de funcionamiento de la comunicación en serie!
  6. Explicación detallada del protocolo UART
  7. Conocimiento básico detallado de la interfaz UART
  8. Introducción a la Comunicación Serie (UART)
  9. ¿Qué es la comunicación por puerto serie?
  10. Comunicación serial detallada
  11. Comunicación serial detallada

Supongo que te gusta

Origin blog.csdn.net/sinat_17133389/article/details/130788939
Recomendado
Clasificación