Мосты USB-UART дешевы и легко доступны, но имеют очень плохие временные характеристики. Newark продает плату «Embedded Pi» с процессором STM32F ARM, на котором вы можете писать голый код. На этом чипе три UART, и я думаю, что они могут работать довольно быстро; если бы вы использовали один для связи с Raspberry Pi, который оставил бы два доступных для других целей. Отказ от ответственности: я купил одну из этих плат, но до сих пор просто использовал сам Raspberry Pi для непосредственной обработки потребностей ввода / вывода.
Если вы хотите много более медленных UART, STM32F на плате Embedded 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, используя этот подход, не добавляя никакой дополнительной работы в «общий» случай.