¿Datos de puerto serie de 9 bits verdaderos?

10

Tengo un proyecto de máquina expendedora existente, medio completo, que se ejecuta en un Atmel UTC, que quiero portar al Pi.

Para comunicarse con los periféricos, como el aceptador de monedas, debe admitir el bus multipunto que tiene una interfaz de puerto serie de 9 bits de datos (además de bits de inicio, parada y paridad).

Aprendí de la manera difícil con la placa Atmel que piratea lo que uno encuentra sugerido en la red, que depende del uso del bit de paridad, ya que el noveno bit de datos puede causar problemas de temporización difíciles de detectar y corregir (así que, por favor, no referirme a esto , o similar. Gracias).

¿Alguien sabe si / dónde puedo comprar un verdadero puerto serie de 9 bits para el Pi (puntos de bonificación si de alguna manera puede funcionar con el Pi cero).

¿Hay, tal vez, un sombrero disponible? ¿O podría fácilmente (tengo un tipo / w, con poco conocimiento de h / w) usar otra placa para manejar el UART de 9 bits de datos y controlarlo desde un Pi?

Mawg dice que reinstalar a Mónica
fuente
1
Hay una interfaz en serie en el GPIO: en las imágenes de Raspbian, etc., se ha configurado para proporcionar salida desde el Pi, por lo que debe deshabilitar eso primero, pero aún tendrá un problema con los bits que no están en el rango estándar. Esta publicación en los foros también puede ayudar.
Wilf
1
¿Se puede agregar hardware al proyecto? Un escudo con un UART no sería demasiado difícil de fabricar, y le daría exactamente lo que necesita, aunque podría usar más E / S de lo que vale. Una CPU PIC de gama baja probablemente podría programarse rápidamente para traducir entre 8 y 9 bits en serie sin costar demasiado o ser una cantidad excesiva de trabajo para usted.
Michael Kohne
¿Sabes dónde podría comprar uno?
Mawg dice que reinstalar a Monica el

Respuestas:

7

Mi biblioteca pigpio admite la lectura y escritura de datos en serie de 9 bits. Utiliza bit banging para que pueda usar cualquier GPIO disponible.

Si no recuerdo mal, cualquier velocidad de 19.2 kbps o más lenta fue bastante estable.

¿Qué bits por segundo necesitas?

Leer ( C , Python ) es un poco más fácil que escribir ( C , Python ).

joan
fuente
1
¿Estás 100 * seguro? Cuando comencé a desarrollarme, me advirtieron de tales "hacks" y me dijeron que habría problemas de tiempo. ¿Sabes si alguien lo intentó con una máquina expendedora? en.wikipedia.org/wiki/Multidrop_bus y coin-acceptor.com.cn/Upload/EditorFiles/technicalfile/… (lo siento, no puedo dar un número de sección ya que estoy detrás del firewall de una empresa)
Mawg dice que reinstalar a Monica
3
La única experiencia que tengo es usar la biblioteca entre el Pi y una computadora portátil con un dongle serial USB. Las pruebas que hice están documentadas en raspberrypi.stackexchange.com/questions/27488/… . Mi software solo usa RX / TX y tierra, por lo que si hace algo elegante con las otras señales seriales, puede tener problemas.
juan
Suena bien. : Déjame verificar las especificaciones y
responderte
2
@Mawg: has aceptado esto. ¿Significa que la solución propuesta funcionó de manera confiable?
Thomas Weller
3

Me asignaron un proyecto para ejecutar una máquina expendedora de bocadillos que utiliza el protocolo MDB para el pago y he completado el proyecto con Pi Zero (naranja).

He intentado bibliotecas de serie de hardware y software de 9 bits y tuve problemas de sincronización en Pi Zero. La comunicación serial de 9 bits de MDB se convirtió en una molestia. El protocolo MDB dice que los periféricos deben tener un% 5 de tolerancia para el tiempo de comunicación en serie, sin embargo, los diferentes proveedores de periféricos tienen diferentes tolerancias, no cumplen con el protocolo MDB. Cuando cree que ha logrado la comunicación en serie pero prueba con un periférico de pago de otro proveedor, simplemente no funciona. Por lo tanto, no confíe en la hoja de datos del protocolo MDB. Me cansé y cansé de implementar el controlador MDB para vendedores con errores. Además, algunos periféricos pueden drenar cantidades excesivas de corriente de los pines uart durante su proceso de arranque interno y pueden dañar su capa de comunicación en serie. Entonces, es mejor que uses una abstracción. Los optoacopladores están bien, pero aún así no lo haría No recomiendo manejar la comunicación serial MDB usando Pi Zero. La mejor manera es usar un enfoque de capa media usando un AVR.

En lugar de usar Uart en Pi Zero para la comunicación MDB, utilicé un AVR Atmega328 para el manejo, sondeo, etc. de Atmga328. Atmega328 controla los periféricos MDB usando la biblioteca de serie de software y envía datos legibles por humanos a Pi Zero en serie de hardware. Todos los esquemas electrónicos, las fuentes y la imagen Pi Zero Armbian, el código Python para las operaciones de Vending están disponibles aquí:

http://eliverse.com/content/vendiverse/

Puede consultar la página wiki para obtener más detalles sobre el control de motores, sensores de entrega de productos, refrigeradores y pantallas LCD de caracteres. Es un proyecto completo de controlador de máquinas expendedoras y está siendo utilizado por un par de productores de máquinas expendedoras.

El universo
fuente
Esta es una respuesta fantástica, especialmente porque es la primera respuesta. Anteriormente tuve éxito con una placa Atmel con un verdadero UART de 9 bits y esperaba ahorrar dinero usando una Raspberry Pi, pero su solución es tan completa que sería una tontería no usarla. Por desgracia, solo soy un chico de software, por lo que para un prototipo preferiría una solución requerida sin soldadura. ¿Me puede recomendar una tabla COTS?
Mawg dice que reinstalar a Monica el
Esta página de su sitio web dice "Si ha completado los pasos para hacer una placa VMC Vendiverse o si ha obtenido una placa VMC Vendiverse". ¿Puedo comprarte uno? ¿Cuánto costaría? Además, si recomienda algún periférico MDB en particular, ¿podría agregarlo a su sitio? Gracias
Mawg dice que reinstale a Monica el
Parece que mis correos electrónicos se estancan en su correo no deseado. ¿Puedes ponerte en contacto conmigo? Tienes mi dirección de correo electrónico y todavía estoy en Bremen
Mawg dice que reinstalaré a Monica
Ahora parece que la página está muerta y el proyecto abandonado :-(
Mawg dice que reinstale a Monica el
1

Todos los datos en serie son, por definición, 1 bit. Depende de las interfaces leer y escribir esos datos cómo acordar cómo interpretan los bits hacia y desde datos significativos.
Si desea 9 bits de datos, y un bit de paridad, y un bit de parada y un bit de inicio. Luego, depende de usted convertir sus datos a ese formato e interpretar los datos que lee en ese formato. El módulo pigpio mencionado en otra respuesta le dará la interfaz de hardware que necesita, o puede escribir la suya propia. Si está desarrollando en Python, le sugiero que eche un vistazo al módulo bitString.py de Scott Griffiths como una biblioteca que hace que sea bastante fácil manipular datos basados ​​en bits.

Paul Smith
fuente
55
El problema con la transmisión de datos en serie está en el tiempo. Los datos no se sincronizan automáticamente y la única transición de nivel garantizada está en los bits de parada / inicio. Ambos extremos tienen que mantener un tiempo apretado y sin interrupciones para determinar dónde están los bits. Es por eso que generalmente se usa hardware dedicado para transmitir y recibir los datos. Hay poco margen de tiempo.
Jan
1

Definitivamente prefiero UART de hardware sobre la implementación de software como lo hace pigpio.

Puede usar el bit de paridad para la comunicación de 9 bits. Hay un pequeño problema: el núcleo actual no tiene soporte CMSPAR (paridad de espacio / marca).
Pero podría cambiar la paridad par / impar para obtener el valor de noveno bit deseado incluso con el núcleo actual, por ejemplo:

unsigned char check_parity(unsigned char v)
{
    v ^= v >> 4;
    v &= 0xf;
    return (0x6996 >> ((v ^ (v >> 4)) & 0xf)) & 1;
}

/* send 9 bits - 8 bits of byte + 1 bit of parity */
send_byte_with_parity(unsigned char byte, unsigned char parity)
{
    if (check_parity(byte) == parity) {
        options.c_cflag &= ~PARODD;
    } else {
        options.c_cflag |= PARODD;
    }
    tcsetattr(fd, 0, &options);
    write(fd, &byte, 1);
}


Un mejor enfoque en mi humilde opinión es utilizar un parche de kernel pequeño para el soporte CMSPAR:
http://marc.info/?l=linux-serial&m=145706834101241&w=2
Agrega soporte de paridad de marca / espacio, lo que permite que el código sea un poco más simple.

PD: implementé MDB en serie con este enfoque. Funciona en Pi sin problemas.
El parche PPS ha sido aprobado y CMSPAR funcionará de manera inmediata comenzando con el kernel 4.6.

edo1
fuente
Sin el parche o al menos un enlace, y detalles más completos, esto no es una respuesta, ni siquiera es un comentario útil, aparte de que dice que es teóricamente posible.
Steve Robillard
Todavía deja más preguntas que respuestas: ¿Cómo implemento MDB, cómo aplico el parche del kernel, funcionará en todos los Pi o solo en algunos? ¿Qué más podría romper esto? ¿Cómo puedo deshacer esto si es necesario? ¿Es seguro este parche? Recuerde que sabe esto porque lo implementó, el OP no.
Steve Robillard
1
He recuperado su respuesta, ya que admite que su respuesta podría ser mejor. Espero que aproveches la oportunidad para mejorarlo.
Steve Robillard
¿Qué más necesito agregar? Implementación de MDB? No obtuve permiso de código abierto de mi empleador.
edo1
Vea mi comentario anterior y recuerde que el usuario final no sabe todo lo que hace.
Steve Robillard
1

No es CONFIABLE conectar la serie RPi directamente al bus MDB debido al formato de 9 bits y a los estrictos tiempos de MDB. Los mensajes entre el periférico MDB y RPi deben convertirse sobre la marcha y en tiempo real. Consulte este enlace que ayudará: Convertidor DIY MDB-UART

ivan ivanov
fuente