So erhalten Sie mehr als eine UART-Schnittstelle

30

Ok, ich habe eine Uart-Schnittstelle (TXD GPIO 14, RXD GPIO 15). Ich möchte mindestens eine weitere Uart-Schnittstelle.

Mögliche Lösungen:

  • Bit Banging: Verwenden Sie zwei unabhängige Ersatz-GPIOs. Ich verstehe, dass das Timing auf einem Standard-Linux ein Problem ist. Wäre es zuverlässig mit sehr niedriger Baudrate?

  • Switching: RPI entscheidet, wann mit welchem ​​Gerät gesprochen wird. Verwenden Sie zB CD4066BC .

  • spi to 2 x uart bridge: passendes teil nicht gefunden (verfügbarkeit, preis, dil paket)

  • usb to uart: Teuer

Gibt es noch andere Möglichkeiten? Ich bin geneigt zu wechseln, wenn es geht. Was würden Sie raten?

Tauran
quelle

Antworten:

10

Ein USB-UART wie FTDI ist nicht wirklich teuer. Alle Ihre anderen Optionen klingen so, als würden sie Sie in Teilen und in der Zeit mehr kosten als die 13 US-Dollar, die Sie möglicherweise kosten, und sind unzuverlässig oder langsam. Entscheiden Sie sich einfach für die schnelle und problemlose Option, wie zum Beispiel:

http://www.dfrobot.com/index.php?route=product/product&product_id=147#.UOamLG-sh8E

Sparkfun verkauft auch einen. In der Tat können Sie vielleicht einfach eines von einem alten USB-Gerät abziehen oder es in einem Junk-Laden kaufen, der nicht weiß, was es tut.

Ich habe mit einem SPI-zu-UART-Adapter für ein Arduino-Projekt rumgespielt, es gab keine vorhandene Bibliothek, also habe ich meine eigene geschrieben. Am Ende hat es gut geklappt, aber wenn ich nur einen 15-Dollar-Teil hätte einwerfen können, hätte ich das getan. Angesichts der Zeit, die mich das gekostet hat, hätte ich eigentlich nur einen Mega mit 4 seriellen Ports haben sollen.

Alternativ, wenn Sie viele serielle Schnittstellen benötigen, können Sie sich RS485-Seriell ansehen, das 232 ähnelt (wenn auch nicht kompatibel) und Multi-Drop, dh mehrere Schnittstellen über eine Leitung, unterstützt.

jbyrnes
quelle
1
Dies ist auch aus Software-Sicht eine einfache Option. FTDI bietet standardmäßig Unterstützung für Linux-Treiber. Alle anderen Optionen erfordern sorgfältige Fahrerarbeit.
Ber
Das cp2102 ist mein lieblings usb uart chip. Eine schnelle Amazon-Suche zeigt sie für 6,99 $ (bearbeiten tatsächlich 1,50 $) mit einem Kabel enthalten! Kann das nicht schlagen!
portforwardpodcast
6

Wenn Sie das Hinzufügen zusätzlicher Hardware überspringen und sich einfach auf die knallharte Tour begeben möchten, ist dies nicht so schwierig wie bei anderen.

Zunächst muss Ihr Kommunikationsthread in Echtzeit ausgeführt werden:

#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;
}

Von nun an wird Ihr Thread nicht mehr für 950 ms pro Sekunde * vorentleert , es sei denn, er gibt die Kontrolle bereitwillig (durch sched_yield()oder usleep()) rechtzeitig zurück, wodurch er niemals vorentleert wird. Mit einer 850-MHz-CPU läuft Ihre Bit-Banging-Schleife die meiste Zeit im Leerlauf, selbst bei höchsten Geschwindigkeiten.

Jetzt bedeutet leider die Anforderung, die Kontrolle von Zeit zu Zeit zurückzugeben, dass, während Ihr Thread schläft, alles, was Ihre "Gegenpartei" sendet, für immer verloren sein würde. Zu diesem Zweck können Sie jedoch die Getriebesteuerung verwenden. Weisen Sie entweder der CTS-Leitung mehr GPIO zu, die Sie herunterziehen, bevor Sie nachgeben, und sichern Sie sie, wenn Sie die Kontrolle wiederhergestellt haben:

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

oder (meiner Meinung nach) verwenden Sie die XON / XOFF-Übertragungssteuerung - senden Sie das XOFF-Zeichen vor dem Schlafengehen über RS232, XON, nachdem Sie den Betrieb wieder aufgenommen haben. Die Standard-ASCII-Codes für diese sind '\x13'für XOFF / "Sendevorgang beenden" und '\x11'für XON / "Sendevorgang fortsetzen".

Natürlich muss Ihr Remote-Gerät diese befolgen. Andernfalls gehen einige Daten verloren.

SF.
quelle
4

Ich habe gefunden, wonach Sie suchen: einen I2C / SPI-Slave für die UART / IrDA / GPIO-Bridge.

Sie sind als Einzel- und Doppelversion erhältlich (also 1 oder 2 zusätzliche UARTs). Sie (NXP) haben auch (für die andere Seite, falls erforderlich) I2C / SPI-Master zu UART / IrDA / GPIO-Bridges.

Weitere Informationen zu diesen Chips finden Sie hier und dem Master- Gegenstück.

Maxim hat auch Chips , die genau dasselbe tun.

Ikku
quelle
Gute Infos, aber die NXP-Links geben hier HTTP 403.
Tom
Hier ist das relevante Datenblatt: nxp.com/documents/data_sheet/SC16IS752_SC16IS762.pdf ?
Tom
3

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_readyNull ist, wurden keine Daten empfangen. Wenn andernfalls z. B. Bit 2 von bytes_readygesetzt 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.

Superkatze
quelle
1

Ein Mikrocontroller wie ein Picaxe könnte serielle Daten an einem Pin einlesen und serielle Daten an einem bestimmten Pin entsprechend ausgeben. Dies würde Ihnen effektiv mehr serielle Ausgänge geben, wenn Sie bereit wären, der Picaxe mitzuteilen, auf welchem ​​Pin ausgegeben werden soll. Es könnte auch dasselbe tun, jedoch in umgekehrter Reihenfolge, sodass serielle Daten von mehreren Geräten empfangen und an den Raspberry Pi gesendet werden können. Eine andere Möglichkeit könnte darin bestehen, angeschlossene Geräte mit einem Qualifikationsmerkmal auszustatten . Dies bedeutet, dass Gerät 1 die Daten 'd1' empfangen müsste, bevor es beispielsweise weitere Daten auf der seriellen Leitung abhören kann. Gerät 2 könnte 'd2' als Qualifikationsmerkmal haben. Dies würde bedeuten, dass Sie, um "Hallo" zu Gerät 1 zu sagen, nur "Hallo" auf der UART-Leitung senden müssen.

Picaxes sind ziemlich billig, Sie können sie bei http://www.techsupplies.co.uk/ bekommen und sie kommen in zahlreichen Größen mit unterschiedlicher Anzahl von Stiften und so weiter.

phillid
quelle
1

Wenn die Kommunikation mit den verschiedenen UART-Slave-Geräten nicht parallel erfolgen muss, können Sie den verfügbaren UART-Port zwischen ihnen teilen. Sie können Transistoren verwenden, um nur die RxD / TxD-Verbindungen zu dem Gerät zu aktivieren, mit dem Sie gerade sprechen möchten. Diese Transistoren können von anderen Raspberry Pi GPIO-Pins gesteuert werden.

Matthias
quelle
1

Der Raspberry Pi 4 unterstützt jetzt bis zu 4 UART-Schnittstellen, die mithilfe einer Gerätebaum-Überlagerung aktiviert werden müssen. Wie das geht und welche Pins zur Zeit verwendet werden, erfahren Sie hier:

https://www.raspberrypi.org/forums/viewtopic.php?t=244827

Die RPi-Stiftung bereitet hierfür noch die Dokumentation vor.

vanthome
quelle
0

Ich hatte das gleiche problem Ich muss 2-4 GSM-Module anschließen und habe eine Hardwarelösung gefunden: http://www.instructables.com/id/SPI-to-4-x-UART-Bridge-MULTIUART/

Diese Lösung basiert auf PIC24FJ64GA306. Sie können PIC durch Atmel mcu ersetzen, aber Sie müssen eine neue Platine erstellen :)

Jerzy Drożdż
quelle
0

Ich verwende SC16IS752 IC, das SPI zum Konverter 2xUART ist. Es funktioniert gut mit Raspbian Stretch.

Es ist ein bisschen teurer als ein FTDI-Chip, aber es gibt zwei Uarts und ich muss keinen wertvollen USB-Port verwenden.

Kamil
quelle
-1

Werfen Sie einen Blick auf https://www.kickstarter.com/projects/1915118535/uart-hat-for-raspberry-pi, ich hoffe, es kann Ihr Problem lösen

Ameen Faraz
quelle
1
Da dies kein Produkt ist, das tatsächlich erhältlich ist, ist dies eine schlechte Wahl.
Jacobm001
1
Schlimmer noch, es scheint, als hätte die Firma, die das KS-Projekt durchgeführt hat, geklappt, ohne die Waren zu liefern.
WineSoaked