Los puentes USB a UART son baratos y fácilmente disponibles, pero tienen características de temporización realmente pésimas. Newark vende una placa "Embedded Pi" que tiene un procesador ARM STM32F en el que puede escribir código simple. Ese chip tiene tres UART y creo que pueden ir bastante rápido; si usara uno para comunicarse con Raspberry Pi, dejaría dos disponibles para otros fines. Descargo de responsabilidad: he comprado una de estas placas, pero todavía he utilizado la Raspberry Pi para manejar las necesidades de E / S directamente.
Si desea muchos UART más lentos, el STM32F en la placa Embedded Pi probablemente podría manejar un número justo, especialmente si está dispuesto a escribir algo de lenguaje ensamblador Arm. Si hay dos grupos de 16 pines de E / S disponibles en una sola placa, es posible tener 16 UART de software simultáneos trabajando todos a la vez a una velocidad de transmisión bastante buena (tenga una interrupción periódica a 3x o 5x la velocidad de transmisión que almacena Valores bloqueados de 16 bits desde el puerto de recepción a un búfer, y genera valores precalculados de 16 bits desde un búfer al puerto de transmisión; si hace esto, el tiempo promedio de servicio para los UART de software no es demasiado grande, no importará si hay un golpe ocasional en el peor de los casos (por ejemplo, los dieciséis puertos que reciben un byte simultáneamente).
Este enfoque en realidad puede funcionar de manera notablemente eficiente para recibir, ya que el código de "caso común" ni siquiera tiene que mirar los UART individuales. Suponga que está muestreando datos a 5x, y los últimos 47 bytes del búfer se duplican inmediatamente antes. Suponiendo que los datos se escriben en el búfer en orden ascendente, puede verificar si algún byte se ha recibido completamente en cualquiera de los 16 canales simplemente diciendo:
bytes_ready = (armed_flag & data[rxptr] & ~data[rxptr-47] & ~data[rxptr-46] & ~data[rxptr-45] & ~data[rx_ptr-44]);
Si bytes_ready
es cero, no se han recibido datos. De lo contrario, si, por ejemplo, se establece el bit 2 de bytes_ready
, eso significa que se puede encontrar un byte de datos recibido en el bit 2 de datos [rx_ptr-40], datos [rx_ptr-35], datos [rx_ptr-30], etc. Una vez que uno toma los datos, borre el bit 2 de arm_flag y haga arreglos para que se restablezca después de aproximadamente 44 muestras.
Este enfoque requerirá un poco de trabajo en aquellas muestras en las que se recibe un byte de datos (y potencialmente mucho trabajo si los 16 canales tienen un byte de datos que llegan de una vez), pero en la mayoría de las muestras la cantidad de trabajo será muy leve. Si uno tuviera 64 pines de E / S, uno podría manejar hasta 32 UART usando este enfoque sin agregar ningún trabajo adicional al caso "común".