Мости через USB до UART є дешевими та легко доступними, але мають дійсно хиткі характеристики часу. Ньюарк продає плату "Embedded Pi", на якій є процесор ARM STM32F, на який можна писати голий метал. Цей чіп має три UART на ньому, і я думаю, що вони можуть пройти досить швидко; якби ви використовували один для спілкування з Raspberry Pi, це дозволить залишити два доступних для інших цілей. Відмова: Я купив одну з цих дощок, але поки що просто використовував Raspberry Pi сам для обробки потреб вводу / виводу безпосередньо.
Якщо ви хочете багато повільніших UART, STM32F на вбудованій дошці Pi, ймовірно, може справляти неабияку кількість, особливо якщо ви готові написати якусь мову складання Arm. Якщо на одній платі доступні дві групи з 16 штифтів вводу / виводу, можливо, буде 16 одночасних програмних UART, які працюють одразу з досить пристойною швидкістю передачі даних (мати періодичне переривання в 3x або 5x швидкості передачі даних, яке зберігається 16-розрядні значення, що замикаються з порту прийому в буфер, і виводять 16-бітові попередньо обчислені значення з буфера в порт передачі; якщо ви це зробите, то за умови, що середній час обслуговування програмного забезпечення UART не надто великий, це не має значення, якщо трапляються випадкові випадки найгіршого випадку (наприклад, всі шістнадцять портів, що одночасно отримують байт).
Цей підхід насправді може бути надзвичайно ефективним для отримання, оскільки "загальний випадок" код навіть не повинен дивитися на окремі UART. Припустимо, ви відбираєте дані в 5x, а останні 47 байт буфера дублюються безпосередньо перед цим. Якщо припустити, що дані записуються в буфер у порядку зростання, то ви можете перевірити, чи будь-який байт був повністю отриманий на будь-якому з 16 каналів, просто сказавши:
bytes_ready = (armed_flag & data[rxptr] & ~data[rxptr-47] & ~data[rxptr-46] & ~data[rxptr-45] & ~data[rx_ptr-44]);
Якщо bytes_ready
нуль, даних не надходило. В іншому випадку, якщо встановлено, наприклад, біт 2 bytes_ready
, це означає, що отриманий байт даних може бути знайдений у біті 2 даних [rx_ptr-40], даних [rx_ptr-35], даних [rx_ptr-30] тощо. Після того, як один захопить дані, очистіть біт 2 arm_flag та організуйте їх повторне встановлення приблизно через 44 вибірки.
Цей підхід вимагає трохи попрацювати над тими зразками, де байт даних отримано повністю (і, можливо, буде багато роботи, якщо всі 16 каналів мають байт даних одразу), але для більшості зразків обсяг роботи буде дуже великим незначний. Якщо у вас було 64 штифта вводу / виводу, за цим підходом можна було обробити до 32 UART, не додаючи додаткових робіт до "звичайного" випадку.