Mostki USB na UART są tanie i łatwo dostępne, ale mają naprawdę kiepską charakterystykę czasową. Newark sprzedaje płytę „Embedded Pi”, która ma procesor ARM STM32F, na którym można pisać kod od zera. Ten układ ma trzy UART i myślę, że mogą iść dość szybko; jeśli użyjesz jednego z nich do komunikacji z Raspberry Pi, pozostawi dwa z nich do innych celów. Oświadczenie: Kupiłem jedną z tych kart, ale jak dotąd po prostu użyłem samego Raspberry Pi do bezpośredniego obsługi potrzeb I / O.
Jeśli chcesz mieć dużo wolniejszych UART, STM32F na płycie Embedded Pi prawdopodobnie poradziłby sobie z niezłą liczbą, szczególnie jeśli chcesz napisać jakiś język asemblera Arm. Jeśli na jednej płycie dostępne są dwie grupy 16 pinów I / O, może być możliwe jednoczesne działanie 16 jednoczesnych UART oprogramowania z całkiem przyzwoitą szybkością transmisji (okresowe przerwanie z prędkością 3 lub 5 razy większą niż prędkość przechowywania 16-bitowe zatrzaśnięte wartości z portu odbiorczego do bufora, i wysyła 16-bitowe wstępnie obliczone wartości z bufora do portu nadawczego; jeśli to zrobisz, to pod warunkiem, że średni czas obsługi oprogramowania UART nie jest zbyt wielki, to nie będzie miało znaczenia, czy zdarzają się najgorsze trafienia (np. wszystkie szesnaście portów jednocześnie otrzymuje bajt).
Takie podejście może faktycznie zadziałać niezwykle wydajnie w przypadku odbierania, ponieważ kod „zwykłego przypadku” nie musi nawet patrzeć na poszczególne UART. Załóżmy, że próbkujesz dane 5 razy, a ostatnie 47 bajtów bufora jest duplikowanych bezpośrednio przed nim. Zakładając, że dane są zapisywane w buforze w porządku rosnącym, możesz następnie sprawdzić, czy któryś z bajtów został w pełni odebrany na jednym z 16 kanałów, po prostu mówiąc:
bytes_ready = (armed_flag & data[rxptr] & ~data[rxptr-47] & ~data[rxptr-46] & ~data[rxptr-45] & ~data[rx_ptr-44]);
Jeśli bytes_ready
wynosi zero, nie otrzymano żadnych danych. W przeciwnym razie, jeśli np. bytes_ready
Ustawiony jest bit 2 , oznacza to, że odebrany bajt danych można znaleźć w bicie 2 danych [rx_ptr-40], danych [rx_ptr-35], danych [rx_ptr-30] itp. dane, wyczyść bit 2 z armed_flag i ustaw, aby został zresetowany po około 44 próbkach.
Podejście to będzie wymagało trochę pracy na tych próbkach, w których bajt danych jest w pełni odebrany (i potencjalnie dużo pracy, jeśli wszystkie 16 kanałów ma bajt danych docierających jednocześnie), ale w większości próbek ilość pracy będzie bardzo niewielki. Gdyby ktoś miał 64 piny I / O, można by obsłużyć do 32 UART za pomocą tego podejścia bez dodawania dodatkowej pracy do „zwykłego” przypadku.