Echte serielle 9-Bit-Portdaten?


10

Ich habe ein vorhandenes, halb vollständiges Verkaufsautomatenprojekt, das auf einem Atmel UTC ausgeführt wird und das ich auf den Pi portieren möchte.

Um mit Peripheriegeräten wie dem Münzprüfer zu kommunizieren, muss der Multi-Drop-Bus unterstützt werden, der über eine serielle Schnittstelle mit 9 Datenbits (plus Start-, Stopp- und Paritätsbits) verfügt.

Ich habe auf die harte Tour mit dem Atmel-Board gelernt, dass Hacks, die im Internet vorgeschlagen werden und auf der Verwendung des Paritätsbits als 9. Datenbit beruhen, zu schlechten Timing-Problemen führen können - schwer zu erkennen und zu korrigieren (also bitte nicht verweisen mich auf diese oder ähnliche. Danke).

Weiß jemand, ob / wo ich eine echte 9-Bit-serielle Schnittstelle für den Pi kaufen kann (Bonuspunkte, wenn es irgendwie mit dem Pi Null funktionieren kann).

Gibt es vielleicht einen Hut? Oder könnte ich einfach (ich habe als / w-Typ, mit wenig Wissen über h / w) eine andere Karte verwenden, um den 9-Datenbit-UART zu handhaben und das von einem Pi aus zu steuern?


1
Es gibt eine serielle Schnittstelle auf dem GPIO - auf Raspbian-Bildern usw. wurde diese so eingestellt, dass sie eine Ausgabe vom Pi liefert, sodass Sie diese zuerst deaktivieren müssen, aber Sie werden immer noch ein Problem mit den Bits haben, die nicht im Standardbereich liegen. Dieser Beitrag in den Foren kann ebenfalls hilfreich sein.
Wilf

1
Können Sie dem Projekt Hardware hinzufügen? Ein Schild mit einem UART wäre nicht zu schwer zu erstellen und würde Ihnen genau das geben, was Sie brauchen, obwohl es möglicherweise mehr E / A verbraucht, als es wert ist. Eine wirklich Low-End-PIC-CPU könnte wahrscheinlich schnell so programmiert werden, dass sie zwischen 8 und 9 Bit seriell übersetzt, ohne zu viel zu kosten oder zu viel Arbeit für Sie zu bedeuten.
Michael Kohne

Weißt du, wo ich einen kaufen könnte?
Mawg sagt, Monica

Antworten:


7

Meine Pigpio- Bibliothek unterstützt das Lesen und Schreiben von seriellen 9-Bit-Daten. Es verwendet Bit Banging, sodass Sie jedes verfügbare GPIO verwenden können.

Wenn ich mich richtig erinnere, waren Geschwindigkeiten von 19,2 kbps oder langsamer ziemlich stabil.

Welche Bits pro Sekunde benötigen Sie?

Lesen ( C , Python ) ist etwas einfacher als Schreiben ( C , Python ).


1
Bist du 100 * sicher? Als ich anfing zu entwickeln, wurde ich vor solchen "Hacks" gewarnt und sagte, dass es Zeitprobleme geben würde. Wissen Sie, ob jemand es mit einem Automaten versucht hat? en.wikipedia.org/wiki/Multidrop_bus und coin-acceptor.com.cn/Upload/EditorFiles/technicalfile/… (Entschuldigung, ich kann keine Sektennummer angeben, da ich mich hinter einer Firewall eines Unternehmens
befinde

3
Die einzige Erfahrung, die ich gemacht habe, ist die Verwendung der Bibliothek zwischen dem Pi und einem Laptop mit einem seriellen USB-Dongle. Die Tests, die ich durchgeführt habe, sind in raspberrypi.stackexchange.com/questions/27488/… dokumentiert . Meine Software verwendet nur RX / TX und Masse. Wenn Sie also etwas Besonderes mit den anderen seriellen Signalen tun, können Probleme auftreten.
Joan

Hört sich gut an. : Lassen Sie mich die Spezifikation überprüfen und mich bei Ihnen
melden

2
@ Mawg: Du hast das akzeptiert. Bedeutet dies, dass die vorgeschlagene Lösung zuverlässig funktioniert hat?
Thomas Weller

3

Mir wurde ein Projekt zum Betreiben eines Snackautomaten zugewiesen, der das MDB-Protokoll für die Zahlung verwendet, und ich habe das Projekt mit Pi Zero (Orange) abgeschlossen.

Ich habe 9-Bit-Serien- und Software-Serienbibliotheken ausprobiert und hatte Zeitprobleme mit Pi Zero. Die serielle 9-Bit-Kommunikation von MDB wurde zu einem Problem. Laut MDB-Protokoll sollten Peripheriegeräte eine Toleranz von 5% für das Timing der seriellen Kommunikation haben, jedoch haben verschiedene Peripheriegerätehersteller unterschiedliche Toleranzen, die nicht mit dem MDB-Protokoll kompatibel sind. Wenn Sie der Meinung sind, dass Sie die serielle Kommunikation abgeschlossen haben, aber das Zahlungsperipheriegerät eines anderen Anbieters ausprobieren, funktioniert dies einfach nicht. Verlassen Sie sich also nicht auf das MDB-Protokolldatenblatt. Ich hatte es satt, MDB-Controller für Buggy-Anbieter zu implementieren. Einige Peripheriegeräte können während des internen Startvorgangs zu viel Strom aus den Uart-Pins ablassen und Ihre serielle Kommunikationsschicht beschädigen. Verwenden Sie also besser eine Abstraktion. Optokoppler sind in Ordnung, aber ich würde es trotzdem nicht tun Es wird nicht empfohlen, die serielle MDB-Kommunikation mit Pi Zero zu handhaben. Besser ist es, einen Middle-Layer-Ansatz mit einem AVR zu verwenden.

Anstatt Uart auf Pi Zero für die MDB-Kommunikation zu verwenden, habe ich einen Atmega328 AVR für MDB-Handling, Polling usw. verwendet. Atmega328 steuert die MDB-Peripheriegeräte mithilfe der Software Serial Library und sendet lesbare Daten an Pi Zero auf Hardware Serial. Alle Elektronikschemata, Quellen und Pi Zero Armbian-Bilder sowie Python-Code für Verkaufsvorgänge sind hier verfügbar:

http://eliverse.com/content/vendiverse/

Auf der Wiki-Seite finden Sie weitere Informationen zur Steuerung von Motoren, Produktlieferungssensoren, Kühlern und Zeichen-LCD-Anzeigen. Es ist ein komplettes Projekt zur Steuerung von Verkaufsautomaten und wird von einigen Automatenherstellern verwendet.


Dies ist eine fantastische Antwort, zumal es sich um eine erste Antwort handelt. Ich hatte zuvor Erfolg mit einem Atmel-Board mit einem echten 9-Bit-UART und hatte gehofft, mit einem Raspberry Pi Geld zu sparen, aber Ihre Lösung ist so umfassend, dass ich ein Dummkopf wäre, sie nicht zu verwenden. Leider bin ich nur ein Software-Typ, daher würde ich für einen Prototyp eine Lösung ohne Löten bevorzugen. Können Sie ein COTS-Board empfehlen?
Mawg sagt, Monica

Auf dieser Seite Ihrer Website heißt es: "Wenn Sie die Schritte zum Erstellen einer Vendiverse VMC-Karte abgeschlossen haben oder wenn Sie eine Vendiverse VMC-Karte erhalten haben". Kann ich eine bei Ihnen kaufen? Wie viel würde es kosten? Wenn Sie bestimmte MDB-Peripheriegeräte empfehlen, können Sie diese Ihrer Site hinzufügen? Danke
Mawg sagt, dass Monica

Es sieht so aus, als ob meine E-Mails in Ihrem Spam stecken bleiben. Können Sie sich mit mir in Verbindung setzen? Sie haben meine E-Mail-Adresse und ich bin immer noch in Bremen
Mawg sagt, Monica

Jetzt sieht es so aus, als ob die Seite tot ist und das Projekt abgebrochen wurde :-(
Mawg sagt, Monica am


1

Alle seriellen Daten sind per Definition 1 Bit. Es liegt an den Schnittstellen , die diese Daten lesen und schreiben, wie sie sich darauf einigen können, wie sie die Bits zu und von aussagekräftigen Daten interpretieren.
Wenn Sie 9 Datenbits und ein Paritätsbit sowie ein Stopp- und ein Startbit wünschen. Dann liegt es an Ihnen, Ihre Daten in dieses Format zu konvertieren und die in diesem Format gelesenen Daten zu interpretieren. Das in einer anderen Antwort erwähnte Pigpio-Modul bietet Ihnen die Hardware-Schnittstelle, die Sie benötigen, oder Sie können Ihre eigene schreiben. Wenn Sie in Python entwickeln, empfehle ich Ihnen, sich das bitString.py-Modul von Scott Griffiths als Bibliothek anzusehen, mit der sich bitbasierte Daten recht einfach bearbeiten lassen.


5
Das Problem bei der Übertragung serieller Daten liegt im Timing. Die Daten sind nicht selbsttaktend und der einzige garantierte Pegelübergang befindet sich in den Stopp / Start-Bits. Beide Enden müssen ein enges, nicht unterbrochenes Timing einhalten, um herauszufinden, wo sich die Bits befinden. Aus diesem Grund wird im Allgemeinen dedizierte Hardware zum Senden und Empfangen der Daten verwendet. Es gibt wenig Zeitspielraum.
Joan

1

Ich bevorzuge definitiv Hardware-UART gegenüber Software-Implementierung wie pigpio.

Sie können das Paritätsbit für die 9-Bit-Kommunikation verwenden. Es gibt ein kleines Problem: Der aktuelle Kernel bietet keine CMSPAR-Unterstützung (Space / Mark-Parität).
Sie können jedoch auch mit dem aktuellen Kernel die gerade / ungerade Parität wechseln, um den gewünschten 9. Bitwert zu erhalten. Beispiel:

unsigned char check_parity(unsigned char v)
{
    v ^= v >> 4;
    v &= 0xf;
    return (0x6996 >> ((v ^ (v >> 4)) & 0xf)) & 1;
}

/* send 9 bits - 8 bits of byte + 1 bit of parity */
send_byte_with_parity(unsigned char byte, unsigned char parity)
{
    if (check_parity(byte) == parity) {
        options.c_cflag &= ~PARODD;
    } else {
        options.c_cflag |= PARODD;
    }
    tcsetattr(fd, 0, &options);
    write(fd, &byte, 1);
}


Besserer Ansatz IMHO ist die Verwendung eines kleinen Kernel-Patches für die CMSPAR-Unterstützung:
http://marc.info/?l=linux-serial&m=145706834101241&w=2
Es wird die Unterstützung für Mark / Space-Parität hinzugefügt , wodurch der Code etwas einfacher wird.

PS Ich habe MDB over Serial mit diesem Ansatz implementiert. Es funktioniert einwandfrei auf Pi.
Der PPS-Patch wurde genehmigt und CMSPAR funktioniert ab dem 4.6-Kernel sofort.


Ohne den Patch oder zumindest einen Link und vollständigere Details ist dies weder eine Antwort noch ein hilfreicher Kommentar - abgesehen davon, dass dies theoretisch möglich ist.
Steve Robillard

Es bleiben immer noch mehr Fragen als Antworten: Wie implementiere ich MDB, wie wende ich den Kernel-Patch an, funktioniert dies auf allen PIs oder nur auf einigen von ihnen? Was könnte das sonst noch brechen? Wie kann ich dies bei Bedarf rückgängig machen? Ist dieser Patch sicher? Denken Sie daran, dass Sie dies wissen, weil Sie es implementiert haben, was das OP nicht hat.
Steve Robillard

1
Ich habe Ihre Antwort nicht gelöscht, da Sie zugeben, dass Ihre Antwort besser sein könnte. Ich hoffe, Sie werden die Gelegenheit nutzen, um es zu verbessern.
Steve Robillard

Was muss ich noch hinzufügen? MDB-Implementierung? Ich habe von meinem Arbeitgeber keine Erlaubnis zum Open Source erhalten.
edo1

Lesen Sie meinen vorherigen Kommentar und denken Sie daran, dass der Endbenutzer nicht alles weiß, was Sie tun.
Steve Robillard

1

Aufgrund des 9-Bit-Formats und der strengen MDB-Timings können Sie RPi serial nicht ZUVERLÄSSIG direkt an den MDB-Bus anschließen. Nachrichten zwischen MDB-Peripheriegerät und RPi müssen im laufenden Betrieb und in Echtzeit konvertiert werden. Überprüfen Sie diesen Link, es wird helfen: DIY MDB-UART Konverter


0

Die akzeptierte Antwort, bei der ein Atmel-Prozessor mit echtem 9-Bit-Daten-URT verwendet wurde, der mit einem Pi kommuniziert, scheint entweder aufgegeben oder kommerziell angenommen worden zu sein.

Ich gehe also mit https://www.vendingtools.ro/en für Eur 70, und das wird meinen Pi mit dem MDB 9-Datenbitbus verbinden.


[Aktualisieren]

Siehe auch

https://www.qibixx.com/de/products/mdb-interface/

https://blog.abrantix.com/webshop/product/mdb-to-raspberry-pi/

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.