Forum: Compiler & IDEs SoftwareSerial für Arduino mit Parity


von Olli Z. (z80freak)


Lesenswert?

Hallo,

ich suche für ein Projekt die Möglichkeit einen ATMEGA328P (Arduino 
Nano) mit einer weiteren seriellen Schnittstelle zu versehen, in Form 
von Software. Die Geschwindigkeit ist mit 2400 Baud eher unbedeutend.
Libs dafür gibt es genügend:
- SoftwareSerial
- NewSoftwareSerial
- AltSoftSerial
um nur ein paar zu nenne. Leider können die alle kein Parity und das 
brauche ich!
für die AltSoftSerial gibt es einen Patch, der aber nicht funktioniert 
:-(

Hat jemand einen Tipp?

von Uwe (de0508)


Lesenswert?

Olli Z.,

ja programmiere dir doch eine Bibliothek.

Ist doch kein Beinbruch, man liest einfach noch ein Bit ein und 
verwurstet dann alle gelesenen, bzgl. EVEN oder ODD Parity.
Dann kann man entscheiden, ob das Byte gültig ist.

von Jürgen S. (jurs)


Lesenswert?

> um nur ein paar zu nenne. Leider können die alle kein Parity und das
> brauche ich!
> für die AltSoftSerial gibt es einen Patch, der aber nicht funktioniert
> :-(
>
> Hat jemand einen Tipp?

Was für Parity brauchst Du denn für wie viele Datenbits?

Am einfachsten wäre es, wenn Du beispielsweise 7E1 (even parity, 7 data 
bits) oder 7O1 (odd parity, 7 data bits) benötigen würdest, denn dann 
könntest Du die Paritätsprüfung komplett über Deine Anwendung mit 8N1 
laufen lassen.

Beim Senden mit 8N1 würdest Du dann einfach das letzte Bit selbst so 
setzen, wie es für 7E1 oder 7O1 erforderlich ist, und dann ganz einfach 
8 Bits über 8N1 raushauen.

Und beim Empfangen mit 8N1 würdest Du das achte Bit im Byte selbst 
anhand der ersten 7 Bits ermitteln, und empfangene Bytes dann als 
ungültig verwerfen, wenn die Parität nicht stimmt.

Ein anderes Datenprotokoll als 8N1 brauchst Du erst dann, wenn die Summe 
aus Daten- und Paritätsbits nicht 8 ergibt, sondern eine höhere Zahl. 
Z.B. 8E1 oder 9E1.

Aber für 7E1 oder 7O1 kannst Du als Protokoll komplett mit 8N1 senden 
und empfangen, und das Setzen bzw. Prüfen des Parity-Bits vollständig 
Deiner Applikation überlassen, denn 7 Datenbits plus ein Parity-Bit 
zusammen sind ja auch 8 Bits, und die werden mit 8N1 übertragen. Völlig 
ohne Probleme.

von Olli Z. (z80freak)


Lesenswert?

Ich brauche 8E1.

: Bearbeitet durch User
von Jürgen S. (jurs)


Lesenswert?

Olli Z. schrieb:
> Ich brauche 8E1.


Das ist natürlich Mist, weil das ohne Start-/Stoppbits schon 9 Bits 
sind. Wenn das von keiner der üblichen SoftwareSerial-Libraries für 
Arduino unterstützt wird, bleiben Dir zwei Möglichkeiten:

1. Einen Atmega-Controller verwenden, der mindestens zwei 
HardwareSerial-Schnittstellen hat. Anstelle eines Arduino Nano z.B. 
einen Arduino Micro mit einem Atmega32U4 Controller.

HardwareSerial unterstützt nämlich auf Atmegas diverse Protokolle, wie 
auch 8E1.

Wenn das aus irgendwelchen Gründen hardwaremäßig nicht möglich ist, 
einen geeigneten Controller zu verwenden, und auch keine der vorhandenen 
Software-UART-Emulationslibraries 8E1 unterstützt, bliebe Dir wohl 
tatsächlich nur, das selbst zu programmieren.

Stehen Interrupts auf Deinem System denn weitgehend ohne Einschränkungen 
zur Verfügung, z.B. Hareware-Interrupts an Aruino Pin-2 und Pin-3, bei 
bisher nur geringer Interruptbelastung im System (also nicht bereits 
zigtausend Interrrupts pro Sekunde, oder viele Zeiten mit gesperrten 
Interrupts im Haupt-Code)?

Geht es Dir denn um das Senden mit 8E1, oder um das Empfangen mit 8E1? 
Oder sogar um beides?

Oder könntest Du einen Arduino Micro verwenden?

von W.A. (Gast)


Lesenswert?

Jürgen S. schrieb:
> Das ist natürlich Mist, weil das ohne Start-/Stoppbits schon 9 Bits
> sind.

Man kann Software selber schreiben, auch wenn Einbinden und 
/Copy&Paste/ sich immer mehr verbreiten. Und bis 9 zu zählen, sollte ein 
ATmega328 locker schaffen.

Das ist ja schlimmer, als die unzähligen Threads über Bauteilsuche für 
EAGLE.

von Olli Z. (z80freak)


Lesenswert?

Hallo Jürgen,

alles was Du sagst stimmt und wie Du es sagst ist verständlich (würden 
sich andere doch mal ein Beispiel an Dir nehmen oder besser einfach 
jichts pisten)

Pins wäre frei, Interrupts auch. Ich muss das senden und empfangen 
können.
 Meine Programmierkenntnisse sind für eine eigene Serial Lib zu 
limitiert, auch wenn mir das vom Prinzip her klar ist. Habe schon 
versucht den Code zu verstehen und anzupassen, leider bislang ohne 
Erfolg. Und meine Hoffnung auf Unterstützung in dieser Sache schwindet. 
Scheinbar braucht das sonst niemand.
Da muss ich dann wohl doch auch andere Hardware gehen...

von ... (Gast)


Lesenswert?

Olli Z. schrieb:
> Meine Programmierkenntnisse sind für eine eigene Serial Lib zu
> limitiert, auch wenn mir das vom Prinzip her klar ist. Habe schon
> versucht den Code zu verstehen und anzupassen,

Dann nimm dir ein C-Buch und lies die ersten paar Kapitel, setzt dich 
noch einmal an den Code und wenn du immer noch unklare Stellen findest, 
poste die hier mit deiner Interpretation. Dann wird dir sicher auch 
geholfen deine Fehler zu verstehen und weiter zu lernen.

Auf Zuruf und ohne genau Spezifikation eine Software geliefern zu 
bekommen, kannst du aber wahrscheinlich wirklich vergessen. So wie ich 
auch nicht erwarte, dass mir ein Mechaniker kostenlos die Winterreifen 
umsteckt, obwohl ich es auch selber tun könnte,...

p.s. die AVR Appnotes AVR304, AVR305 könnten dir vielleicht auch etwas 
weiterhelfen.

von Jürgen S. (jurs)


Lesenswert?

Olli Z. schrieb:
> Pins wäre frei, Interrupts auch. Ich muss das senden und empfangen
> können.
>  Meine Programmierkenntnisse sind für eine eigene Serial Lib zu
> limitiert

Und was spricht dann dagegen, gerade wenn Du sowohl senden als auch 
empfangen möchtest (und das womöglich sogar gleichzeitig im 
Vollduplexbetrieb), bei der Hardwareauswahl ein Arduino-Board zu wählen, 
das eine zweite HardwareSerial-Schnittstelle unterstützt, an die Du Dein 
Gerät leicht anschließen könntest, und das dann
- von der Arduino Core-Library
- mit 8E1
- mit gepuffertem Senden und Empfangen im Hintergrund
unterstützt wird?

Beispielsweise ein "Arduino Micro" Board und dann
1
Serial1.begin(2400, SERIAL_8E1);

von Olli Z. (z80freak)


Lesenswert?

Eben nichts spricht dagegen. Daher sagte ich ja eingangs das Du wohl 
recht hast. Aber das hier ist doch ein Hobbyforum und etwas Tüftlergeist 
darf da doch schon mitschwingen...oder ? ;-)

von Peter D. (peda)


Lesenswert?


von Olli Z. (z80freak)


Lesenswert?

Peter D. schrieb:
> Der ATMEGA328PB hat 2 UARTs.

Eine gute Alternative zum Atmega2560. Weiß Du, ob dieser evtl. sogar 
pinkompatibel mit dem Atmega328P ist? Dann könnte man ihn ja sogar auf 
dem Arduino-Board einfach austauschen?!
Gibt es eine Toolchain-Unterstützung dafür?

von AVR dude (Gast)


Lesenswert?

Da greift man sich an den Kopf und denkt - Gibt es heute keine 
Datenblätter mehr ?

Da steht doch alles drin. So wie Gehäuse, Pins und dessen Bedeutung.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.