Cita:
Originalmente publicado por jarmisen
Como habéis dicho lo ideal seria no necesitar ningún circuito externo. ¿Nadie entiende de C?, entre los cofrades, pues en el código fuente que esta grabado en el micro, esta la clave de la conversión, y estoy seguro que esa conversión se puede programar en Linux.
|
El tema es un poco complejo pero intento explicarlo y así me sirve de cuaderno de apuntes
Seatalk usa 9 bits mientras que NMEA 0183 usa la estándar de 8 bits para trasmitir los "caracteres" que forman las "palabras" que forman sus "frases".
Esto seria una "frase" NMEA 0183 formada por "palabras":
$GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,1 30998,011.3,E*62
donde la palabra $GPRMC nos dice que tipo de información contiene y de donde viene y el resto de palabras contienen los valores de esa información. En este caso es una frase que viene del GPS con información de posición, velocidad, rumbo, etc.
Cada letra o caracter de esta frase es transmitida usando 8 bits en el numero binario que corresponde a cada carácter por ejem. 10110111. Cuando recibimos el caracter $ sabemos que empieza una nueva frase.
En el caso de seatalk esta seria una frase:
52 01 B4 00
Donde cada par de caracteres es una "palabra" y segun su posicion en la frase y su valor tendrá un significado. El primer par nos dice que tipo de informacion contiene, en este caso 52 significa que es informacion sobre velocidad sobre el fondo. El segundo par nos dice cuantos pares de infoemación vienen a continuación que contienen los valores, En este caso 01 nos dice que vienen dos pares (el cero cuenta como el primer par). El resto de pares son datos y puede haber hasta 18 pares con datos. Estos datos están en hexadecimal (base 16).
Ahora viene lo bueno. Electricamente esto se transmite usando 9 bits donde los 8 primeros funcinan igual que el NMEA y el noveno bit solo será 1 cuando se este transmitiendo el primer par que nos indica que es el principio de una frase.
Cuando leemos desde un ordenador datos de 8 bits existe la posibilidad de añadir un noveno bit que sirve para comprobar la integridad de los datos recibidos y que se llama bit de paridad. Será 1 si la suma de los bits que tienen un 1 es impar o 0 si es par (tambien se puede configurar al reves). De esta manera si trasmitimos el caracter 10110111, el bit de paridad será 0 porque tiene seis 1 que es numero par. Si fuera impar, el bit de paridad seria 1.
Ahora viene el problema,
los ordenadores actuales NO pueden leer caracteres de mas de 8 bits. Solo pueden leer como maximo 8 bits mas 1 bit de paridad. Por eso cuando intentamos leer un carácter seatalk de 9 bits en un ordenador de 8 bits tendremos que activar la paridad para poder tener acceso al noveno bit pero resulta que ese bit en seatalk no funciona como bit de paridad sino como una marca que nos dice que cuando es 1 significa que estamos recibiendo el principio de una frase.
Tampoco podemos leer bit a bit por software porque es un trabajo que se hace en la capa de hardware y lo único que podemos hacer es esperar la traducción de los bits que hace el hardware según las normas que le damos en referencia a numero de bits, paridad, etc de la información que se va a encontrar.
Los únicos que si pueden leer bit a bit son los microcontroladores y podemos programarlos por software para gestionar estos bits.
vaya lio eh?
Resumen
Un ordenador actual no puede leer los datos de seatalk directamente (circuito de Thomas) por una incompatibilidad fisica. Por eso el circuito de Yapp añade un microcontrolador con un software al circuito.
El software en C que hay en la pagina de Thomas no es para un ordenador, es para un microcontrolador.
Posibles soluciones
Podemos leer una señal seatalk desde un ordenador como si fuera una señal de 8 bits y configurando el bit de paridad como SPACE que es una opción en la que le avisas de que el bit de paridad siempre será 0 independientemente de los datos que tenga delante. De esta manera cuando se encuentra el 1 que define la primera palabra de la frase dará un error.
A partir de aquí hay una diferencia entre windows y linux. Linux detecta el error, te avisa y te pasa igualmente los datos pero marcados como erroneos, de esta manera sabemos que es la primera palabra y tenemos su valor. En windows detecta el error pero te devuelve el valor 0.
Esto solo funcionará con una entrada serie de las antiguas de un ordenador normal o la entrada serie del GPIO de la raspberry y no funcionará con adaptadores serie-USB porque la mayoria no gestionan bien el bit de paridad y ninguno puede definirlo como SPACE.
Experimientos a realizar
Comprobar si python te devuelve el error junto a los datos.


