Как получить более одного интерфейса uart

Хорошо, у меня есть один интерфейс uart (TXD GPIO 14, RXD GPIO 15). Я хочу, по крайней мере, еще один интерфейс uart.

Возможные решения:

  • Бит бит: Используйте два несвязанных резервных GPIO. Я понимаю, что синхронизация является проблемой на стандартном Linux. Было бы оно надежным с очень низкой скоростью?

  • Коммутация: RPI решает, когда говорить с каким устройством. Использование, например, CD4066BC .
  • spi до 2 x uart bridge: Не нашли подходящую деталь (наличие, цена, пакет dil)

  • usb to uart: Дорого

Есть ли другие варианты? Я склонен переключиться, если это можно сделать. Что бы вы посоветовали?

27 голосов | спросил tauran 4 72012vEurope/Moscow11bEurope/MoscowSun, 04 Nov 2012 15:54:17 +0400 2012, 15:54:17

8 ответов


9

USB UART, такой как FTDI, не очень дорог. Все ваши другие варианты звучат так, как будто они будут стоить вам больше по частям и времени, чем $ 13, это может стоить вам и быть ненадежным или медленным. Просто пойдите для быстрого и безотказного варианта, например:

http://www.dfrobot.com/index. ? PHP маршрут = продукт /продукт & амп; product_id = 147 # .UOamLG-sh8E

Sparkfun тоже продает. На самом деле, может быть, вы можете просто вытащить один из какого-то старого USB-устройства или купить его у мусорного магазина, который не знает, что он делает.

Я перепутал с адаптером SPI для UART для проекта Arduino, не было существующей библиотеки, поэтому я написал свой собственный. В итоге все получилось нормально, но если бы я мог просто упасть в 15 долларов, я бы это сделал. Фактически, учитывая время, которое мне стоило, я должен был просто получить мегафон с 4 последовательными портами.

В качестве альтернативы, если вы хотите много последовательных портов, вы можете посмотреть серийный RS485, который аналогичен 232 (хотя и несовместим), который поддерживает многократное падение, то есть несколько интерфейсов в одной строке.

ответил jbyrnes 4 Jpm1000000pmFri, 04 Jan 2013 14:14:10 +040013 2013, 14:14:10
5

Если вы решите пропустить добавление дополнительного оборудования и просто пойти по битовому маршруту, это не так сложно, как некоторые изображения.

Во-первых, ваш поток связи должен идти в реальном времени:

#include<sched.h>

struct sched_param param;               
param.sched_priority = sched_get_priority_max(SCHED_FIFO);
if( sched_setscheduler( 0, SCHED_FIFO, &param ) == -1 )
{
        perror("sched_setscheduler");
        return -1;
}

Отныне ваш поток не будет упреждаться за 950 мс из каждой секунды * , если он не возвращает управление охотно (через sched_yield(), или usleep()) своевременно, что не сделает его превентивным. С процессором 850 МГц ваш цикл битовки будет работать в режиме ожидания большую часть времени даже на самых быстрых скоростях.

Теперь, к сожалению, требование возвращать управление время от времени означает, что ваш нить спал, независимо от того, что отправляет ваша «противоположная сторона», будет потеряна навсегда. Но для этого вы можете использовать управление передачей. Либо выделите еще несколько GPIO для линии CTS, которые вы вытаскиваете перед уступкой и резервную копию при восстановлении управления:

  bcm2835_gpio_write(CTS_PIN, LOW);
  usleep(10);
  bcm2835_gpio_write(CTS_PIN, HIGH);

или (IMHO предпочтительно) использовать управление передачей XON /XOFF - отправить символ XOFF по RS232 перед сном, XON после возобновления операции. Коды ASCII по умолчанию для них: '\x13' для XOFF /"stop send" и '\x11' для отправки XON /"возобновления отправки".

Конечно, ваше удаленное устройство должно их соблюдать. Если это не так, некоторые данные будут потеряны.

ответил SF. 11 PM000000100000003631 2013, 22:48:36
4

Я нашел то, что вы ищете: ведомый I2C /SPI для моста UART /IrDA /GPIO.

Они входят в одну и двойную версию (так 1 или 2 дополнительных UART). Они (NXP) также (для другой стороны в случае необходимости) имеют мастер I2C /SPI для мостов UART /IrDA /GPIO.

Более подробную информацию об этих микросхемах можно найти здесь и master .

У Максима также есть чипы , которые делают то же самое.

ответил ikku 6 Jpm1000000pmSun, 06 Jan 2013 16:08:18 +040013 2013, 16:08:18
3

USB-мосты UART дешевы и легко доступны, но имеют очень грязные временные характеристики. Newark продает плату «Embedded Pi», на которой есть процессор STM32F ARM, на который вы можете написать код с открытым кодом. У этого чипа есть три UART, и я думаю, что они могут идти довольно быстро; если бы вы использовали его для общения с малиной Pi, который оставил бы два доступных для других целей. Отказ от ответственности: я купил одну из этих плат, но пока просто использовал сам малиновый Pi для непосредственного обращения с потребностями ввода-вывода.

Если вы хотите много медленных UART, STM32F на плате Embedded Pi, вероятно, справится со значительным числом, особенно если вы захотите написать какой-нибудь язык ассемблера. Если на одной плате имеется две группы из 16 контактов ввода /вывода, возможно, будет иметь 16 одновременных программных UART, которые работают одновременно с довольно приличной скоростью передачи (имеют периодическое прерывание в 3x или 5x скорость передачи, которая хранится 16-разрядные фиксированные значения из порта приема в буфер и выводят 16-разрядные предварительно вычисленные значения из буфера в порт передачи, и если вы это сделаете, то при условии, что среднее время обслуживания программных UART не слишком велико, не имеет значения, случается ли случайный худший случай (например, все шестнадцать портов получают байт одновременно).

Этот подход может действительно эффективно работать для получения, поскольку код «обычного случая» даже не должен смотреть на отдельные UART. Предположим, что вы выполняете выборку данных в 5 раз, а последние 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 от вооруженного_флага и договоритесь о его повторном наборе после примерно 44 образцов.

Этот подход потребует немного работы над этими образцами, где байты данных полностью получены (и, возможно, большая часть работы, если все 16 каналов имеют байты данных, поступают сразу), но на большинстве образцов объем работы будет очень незначительным. Если у вас было 64 вывода ввода /вывода, можно было использовать до 32 UART, используя этот подход, не добавляя дополнительной работы в «общий» случай.

ответил supercat 11 PM00000070000001331 2013, 19:40:13
1

Микроконтроллер, такой как Picaxe, может принимать последовательные данные на одном выводе и выводить последовательные данные на определенном штыре. Это позволило бы вам получить больше последовательных выходов, если бы вы были готовы рассказать о пикаксе, который выдает на выход. Он также мог бы сделать то же самое, но наоборот, чтобы он мог получать последовательные данные с нескольких устройств и отправлять их на малиновый пи. Другой вариант может заключаться в том, что для подключенных устройств требуется квалификатор . Это означает, что устройству 1 необходимо будет получить данные «d1», например, прежде чем он будет прослушивать дополнительные данные о последовательной линии. Устройство 2 может иметь «d2» в качестве своего определителя. Это означало бы, что сказать «привет» устройству 1, вам просто нужно отправить «d1hello» в строку UART.

Пикакс довольно дешев, вы можете получить их на http://www.techsupplies.co.uk/, и они бывают разных размеров с разным количеством контактов и т. д.

ответил phillid 5 12012vEurope/Moscow11bEurope/MoscowMon, 05 Nov 2012 06:45:11 +0400 2012, 06:45:11
1

Если связь с несколькими подчиненными устройствами UART не требуется параллельно, вы можете совместно использовать один доступный порт UART между ними. Вы можете использовать транзисторы, чтобы разрешать только соединения RxD /TxD с устройством, с которым вы в настоящее время хотите поговорить. Эти транзисторы могут управляться другими контактами Raspberry Pi GPIO.

ответил Matthias 30 +03002014-10-30T20:58:42+03:00312014bEurope/MoscowThu, 30 Oct 2014 20:58:42 +0300 2014, 20:58:42
0

У меня была та же проблема. Мне нужно подключиться к 2-4 модулям GSM, и я нашел аппаратное решение: http://www.instructables.com/id/SPI-to-4-x-UART-Bridge-MULTIUART/

Это решение основано на PIC24FJ64GA306. Вы можете заменить PIC Atmel mcu, но вы должны создать новую печатную плату:)

ответил Jerzy Drożdż 18 AM000000110000004531 2017, 11:13:45
-1

Посмотрите https: //www.kickstarter. com /projects /1915118535 /uart-hat-for-maspberry-pi Надеюсь, он может решить вашу проблему.

ответил Ameen Faraz 6 AMpMon, 06 Apr 2015 05:45:07 +030045Monday 2015, 05:45:07

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132