USB-zu-UART-Bridges sind billig und leicht verfügbar, weisen jedoch ein sehr schlechtes Timing auf. Newark verkauft eine "Embedded Pi" -Platine mit einem STM32F-ARM-Prozessor, auf den Sie Bare-Metal-Code schreiben können. Auf diesem Chip befinden sich drei UARTs, und ich denke, sie können ziemlich schnell gehen. Wenn Sie einen verwenden, um mit dem Raspberry Pi zu kommunizieren, bleiben zwei für andere Zwecke verfügbar. Haftungsausschluss: Ich habe eines dieser Boards gekauft, aber bisher nur den Raspberry Pi selbst verwendet, um die E / A-Anforderungen direkt zu erfüllen.
Wenn Sie viele langsamere UARTs benötigen, kann der STM32F auf der Embedded Pi-Platine möglicherweise eine angemessene Anzahl verarbeiten, insbesondere wenn Sie bereit sind, eine Assemblersprache für Arm zu schreiben. Wenn auf einer Karte zwei Gruppen von 16 E / A-Pins verfügbar sind, können möglicherweise 16 Software-UARTs gleichzeitig mit einer annehmbaren Baudrate arbeiten (ein periodischer Interrupt mit der 3-fachen oder 5-fachen der gespeicherten Baudrate) 16-Bit-Latch-Werte vom Empfangsport an einen Puffer und Ausgabe von 16-Bit-Vorberechnungswerten von einem Puffer an den Sendeport. Wenn Sie dies tun, ist die durchschnittliche Wartungszeit für die Software-UARTs nicht zu groß Es spielt keine Rolle, ob es gelegentlich zu einem Worst-Case-Treffer kommt (z. B. wenn alle 16 Ports gleichzeitig ein Byte empfangen).
Dieser Ansatz kann für den Empfang tatsächlich bemerkenswert effizient sein, da der "Common Case" -Code nicht einmal einzelne UARTs betrachten muss. Angenommen, Sie erfassen Daten mit der fünffachen Abtastrate und die letzten 47 Byte des Puffers werden unmittelbar davor dupliziert. Unter der Annahme, dass die Daten in aufsteigender Reihenfolge in den Puffer geschrieben werden, können Sie dann überprüfen, ob ein Byte auf einem der 16 Kanäle vollständig empfangen wurde, indem Sie einfach sagen:
bytes_ready = (armed_flag & data[rxptr] & ~data[rxptr-47] & ~data[rxptr-46] & ~data[rxptr-45] & ~data[rx_ptr-44]);
Wenn bytes_ready
Null ist, wurden keine Daten empfangen. Wenn andernfalls z. B. Bit 2 von bytes_ready
gesetzt ist, bedeutet dies, dass ein empfangenes Datenbyte in Bit 2 von Daten [rx_ptr-40], Daten [rx_ptr-35], Daten [rx_ptr-30] usw. gefunden werden kann Löschen Sie das Bit 2 von armed_flag und sorgen Sie dafür, dass es nach etwa 44 Abtastungen zurückgesetzt wird.
Dieser Ansatz erfordert ein wenig Arbeit bei den Samples, bei denen ein Datenbyte vollständig empfangen wird (und möglicherweise viel Arbeit, wenn alle 16 Kanäle ein Datenbyte auf einmal empfangen), aber bei den meisten Samples ist der Arbeitsaufwand sehr hoch leicht. Wenn man 64 I / O-Pins hätte, könnte man mit diesem Ansatz bis zu 32 UARTs handhaben, ohne dem "allgemeinen" Fall zusätzliche Arbeit hinzuzufügen.