Esto se publicó anteriormente en el foro de Stack Exchange y me refirieron aquí.
Actualmente estoy tratando de conectar un Honeywell DRM4000L a un módulo GPS. El DRM es un dispositivo de navegación a estima que toma una entrada de GPS y emite la ubicación en serie. Actualmente, tengo un módulo GPS GS407 conectado al DRM. Cada vez que pruebo la función de paso de GPS en el DRM, obtengo un resultado incomprensible.
También tengo un cable FTDI conectado al GPS y obtengo los datos NMEA correctos. Los datos que provienen del GPS tienen el formato correcto cuando se conectan directamente a la computadora. Los datos DRM también ingresan correctamente, pero no ven un flujo de datos NMEA y, por lo tanto, no se inicializa con los datos GPS. Solo tiene información de seguimiento basada en los sensores de inercia (INS).
El GPS está configurado en 9600 baudios y el puerto de host DRM está configurado en 9600, por lo que DRM debería ver todos los datos GPS correctos. La velocidad en baudios del DRM a la computadora también es 9600.
¿Alguien está viendo algo que yo no estoy viendo? ¡Gracias!
Parece que la solución se ha encontrado prácticamente en los comentarios, pero la repetiré aquí para la posteridad.
El problema es que uno de los dispositivos es un dispositivo serial de nivel de voltaje TTL y el otro es un dispositivo serial de nivel de voltaje RS-232. Los niveles de voltaje TTL son (esencialmente) 0V para un '0' y 5V para un '1'. Esto es sencillo de entender para la mayoría de la gente: bajo es bajo y alto es alto.
Los niveles de voltaje RS-232 son diferentes. Donde TTL tiene '0' y '1', RS-232 tiene (respectivamente) 'espacio' y 'marca'. 'Marca' se define como un voltaje entre +3V y +15V y 'espacio' se define como un voltaje entre -3V y -15V. Notará que estos son los inversos de los niveles TTL: una señal '1' o verdadera es un voltaje negativo y la señal '0' o falsa es un voltaje positivo.
KK6FSL notó (correctamente) que los datos en serie que estaba recibiendo parecían ser una inversión de los datos en serie adecuados. Dada la discrepancia de los dos niveles de voltaje, es sorprendente que este sea el caso: ¡los niveles de voltaje no deberían ser muy compatibles en absoluto! Estrictamente hablando, esto sería cierto, pero en el mundo real hay una cantidad sorprendente de compatibilidad en los niveles de voltaje entre TTL y RS-232.
Por ejemplo, si un chip de nivel TTL intenta leer una señal RS-232, los niveles de voltaje funcionan bastante bien (aparte del hecho de que los niveles están invertidos de lo que espera TTL). Suponiendo que la entrada TTL esté protegida de modo que no pueda superar los 5 V ni bajar los 0 V (¡lo cual puede no ser siempre el caso! ¡El chip TTL puede estar en peligro!), una 'Marca' será 0 V y un 'Espacio' será 5V. Estos son niveles TTL perfectamente válidos y el chip podrá interpretarlos, ¡pero no reproducirá los datos originales!
Para el caso inverso, un receptor RS-232 que lee señales de nivel TTL, un '1' sería 5 V, que está por encima del umbral de +3 V para un 'Espacio' que se registraría como un '0' lógico. Una señal de 0V no debería registrarse como nada porque está fuera del rango RS-232 válido: no está por encima de +3V ni por debajo de -3V. No está definido según el estándar y no debería ser nada en absoluto. Lamentablemente, muchos dispositivos de nivel de voltaje RS-232 son muy indulgentes con los voltajes fuera de rango y con gusto asumirán que 0V es un valor válido. Creo que una razón anterior para esto fue que puede ahorrar dinero conectando directamente una línea de transmisión serial TTL a una línea de recepción RS-232 sin un chip especial en el medio. Un grupo de ingenieros perezosos y baratos pensaron que sonaba como una buena idea y la mantuvieron, así que ahora tenemos RS-232 'estándar'
Hay otra arruga aquí que es confusa. En RS-232, cuando no pasa nada, el estado de la línea se llama Idle. RS-232 define Inactivo como un 'Espacio'; este es un voltaje positivo. Cuando comienza un mensaje, el bit de inicio es una 'Marca' que es un voltaje negativo; por lo tanto, se produce una transición descendente y esto se usa para identificar cuándo comienza un mensaje. Se supondría que dado que los niveles de voltaje están invertidos para los mensajes seriales de nivel TTL, la línea estaría inactiva a 0 V y el bit de inicio sería de 5 V. Eso sería coherente y tendría sentido, así que, por supuesto, no se hace de esa manera. La serie de nivel TTL también (generalmente) está inactiva a 5V y el bit de inicio es un '0' que es 0V. Por lo tanto, tiene la misma transición de flanco descendente para marcar el inicio del mensaje y luegotodos los bits de datos están correctamente invertidos. Si Idle for TTL simplemente se invirtiera desde RS-232, los datos no se invertirían simplemente, sino que también se retrasarían un bit o más (ya que la primera transición de flanco descendente sería un tiempo después del bit de inicio). Gracias a esta característica, hay una simple inversión entre el nivel RS-232 y el nivel TTL en serie que tiene mucho sentido al principio, pierde sentido después de un rato y luego te rindes y lo aceptas.
Sin embargo, no asuma que el párrafo anterior es definitivo. Los protocolos en serie son como opiniones: todos tienen una y nadie está realmente de acuerdo. Hay dispositivos que tendrán Idle en '0' lógico en lugar de '1'. Las razones relacionadas con el diseño de esto se pierden en el tiempo, pero al final la razón es la misma: hacer su trabajo más difícil.
joe hass
KK6FSL
KK6FSL
q_qgg............c.............Q...........}.w.....}
que parecen ser datos en serie invertidos. Espero que el código NMEA estándar se parezca a algo$GPGGA,024542.00,3417.37510,N,11834.07255,W,2,10,1.16,449.6,M,-32.6,M,,0000*61
, pero de alguna manera cuando pasa a través del módulo de cálculo de muertos, se invierte.KK6FSL
DoxyLover
KK6FSL
KK6FSL
KK6FSL
DoxyLover