Hallo, meine Frage ist wie implementiere ich eine Serielle Schnittstelle richtig? Ich würde es halt hin bekommen dass, das ganze "funktioniert" aber wie macht man es richtig? Macht es wirklich Sinn ein Protokoll wie HDLC auf einen Mikrocontroller komplett zu implementieren? Die Anforderungen: - Der Atmega 328 nutzt ein wenig I2C und ließt 4 analoge Werte aus - PC->µC Sendet ein paar Einstellungen (vielleicht 100 Bytes) - µC->PC Sendet ca jede Sekunden Sensordaten 4 Bytes und hin und wieder die Einstellungen zur Kontrolle (~100Bytes) Jetzt habe ich schon lauter Fragen wie: - Sende ich immer 100 Bytes oder teile ich das ganze logisch auf? - Sollte ich 9 Bits senden und das 9. Bit als Start/Stop Bit nehmen. - Das senden von ASCII finde ich nicht so schön oder ist es noch die beste Wahl? - Wie sollten Start/Stop Bits aussehen? (Die Daten können von 0-255 reichen also ist 0xFF nicht möglich) - Implementiert man am besten das erkennen von Fehlern beim Senden/Empfangen und sendet die Daten dementsprechend neu? Oder doch lieber Checksumme prüfen und bei Fehlern eine Sekunde warten bis neue Daten kommen. Hat jemand vielleicht ein Projekt mit ähnliche Anforderungen und kann mir den Quellcode als Beispiel zeigen? mfG Oliver
Ich würde erst mal die Grundlagen verstehen lernen. Die müssen hier nicht im Forum nicht neu gepredigt werden. https://de.wikipedia.org/wiki/RS-232 Wenn dann ein Problem auftaucht, kannst du noch mal gezielt nachfragen.
nemesis... schrieb: > Ich würde erst mal die Grundlagen verstehen lernen. > Die müssen hier nicht im Forum nicht neu gepredigt werden. > > https://de.wikipedia.org/wiki/RS-232 > > Wenn dann ein Problem auftaucht, kannst du noch mal gezielt > nachfragen. Ich bin mir nicht ganz sicher was ich da nicht verstanden habe. RS232 legt ja nicht fest was für ein Protokoll man verwendet. Bzw. es hat so gar nicht mit Paketen zutun oder habe ich da doch was falsch verstanden? Kaj schrieb: > Das kommt drauf an... Ich hatte ja schon einige Anforderungen aufgezählt welche wären noch nötig für eine Sinnvolle Entscheidung? Das ganze Projekt ist nicht super Kritisch also es hängt kein Leben davon ab oder so :D Aber sollte schon recht zuverlässig funktionieren. Das ganze ist auch mehr ein Hobby Projekt und wird nicht in Serie gehen.
Beispiel: *D12,34,56,129# *C74,"Hello World",17,9600# * Startmarkierung D Datensatz folgt C Config folgt , Trenner zwischen Daten # Ende des Datensatzes Sender und Empfänger können unabhängig voneinander mit einem simplen Terminalprogramm entwickelt und getestet werden. Prüfsummen kannst Du später problemlos hinzufügen.
Dauergast schrieb: > Beispiel: > > *D12,34,56,129# > *C74,"Hello World",17,9600# > > * Startmarkierung > D Datensatz folgt > C Config folgt > , Trenner zwischen Daten > # Ende des Datensatzes > > Sender und Empfänger können unabhängig voneinander mit einem simplen > Terminalprogramm entwickelt und getestet werden. Prüfsummen kannst Du > später problemlos hinzufügen. Ok also die ASCII variante. Wie wendet man das dann richtig beim Mikrocontroller an. Einfach mit if-else Abfragen mit strcmp?
Schau mal hier: Beitrag "RS232 Protokoll mit RXD/TXD und STX/ETX?" oder nutze hier die Suchfunktion! "serielles Protokoll" und Du wirst genügend finden.
Oliver S. schrieb: > Einfach mit if-else Abfragen mit strcmp? Das macht man mit einem switch() Statement innerhalb einer Statemachine.
Tja Du hast ziemlich viel nicht gesagt. Bei der Auswahl des Protokolls spielen viele Faktoren eine Rolle. 100 Bytes besagen Garnichts. Ohne ein paar Zusatzinformationen. So z.B. 100 Bytes pro Jahr, pro Woche oder pro Millisekunde? Wie wichtig ist eine fehlerfreie Übertragung? Ist Platz für eine Typkennung vorhanden? Mehr Daten. Ist Platz für eine Prüfsumme vorhanden? Mehr Daten. Kann der Datensatz wiederholt werden? Übertragungsunterbrechung für Wiederholung. Bidirektionales Arbeiten. Quittungsbetrieb. Ändern sich ein paar oder alle Daten häufig? Wie gestört ist der Arbeitsplatz? Übertragungsqualität, Wiederholungen. Wie weit sollen die Daten übertragen werden? und dabei habe ich wohl noch die Hälfte vergessen...
Sebastian S. schrieb: > und dabei habe ich wohl noch die Hälfte vergessen... Naja, aufgrund der Angaben im Ausgangspost wäre er mit ASCII zum Auslesen von Sensoren selbst bei 9600 sehr gut unterwegs. Wenn es dann um Raumschiffsteuerungen oder den Vertrieb nach Nordkorea geht, sollte man Deine Überlegungen sicherlich nochmal rekapitulieren :)
Du kannst dich auch von PPP inspirieren lassen: https://technet.microsoft.com/en-us/library/cc957975.aspx
Oliver S. schrieb: > Die Anforderungen: > ... > - PC->µC Sendet ein paar Einstellungen (vielleicht 100 Bytes) > - µC->PC Sendet ca jede Sekunden Sensordaten 4 Bytes und hin und wieder > die Einstellungen zur Kontrolle (~100Bytes) Sebastian S. schrieb: > 100 Bytes besagen Garnichts. Ohne ein paar Zusatzinformationen. So z.B. > 100 Bytes pro Jahr, pro Woche oder pro Millisekunde? Was ist an "jede Sekunden Sensordaten 4 Bytes" und "hin und wieder die Einstellungen" so schwer zu verstehen? Wenn die Sensordaten mit 4 Byte/s kommen, kannst du wohl davon ausgehen, dass "hin und wieder" von Millisekunden weit entfernt ist. Und relativ zur Datenrate ist es dann egal, ob 100 Bytes pro Jahr oder pro Woche.
Oliver S. schrieb: > Ich hatte ja schon einige Anforderungen aufgezählt welche wären noch > nötig für eine Sinnvolle Entscheidung? D Du solltest dir erstmal selbst im klaren werden was du überhaupt mit "Protokoll meinst" und welche Anforderungen dies dann erfüllen soll. Vereinfacht gesagt gibt es da bei einer Datenübertragung durchaus mehrer die aufeinander aufbauen: https://de.wikipedia.org/wiki/OSI-Modell Die bis jetzt hier gegebenen Antworten springen kreuz und quer von Layer eins bis hin zu Tipps für Layer sieben lustig umher ohne das du überhaupt definiert hast was du überhaupt genau haben willst.
Peter M. schrieb: > Oliver S. schrieb: >> Einfach mit if-else Abfragen mit strcmp? > > Das macht man mit einem switch() Statement innerhalb einer Statemachine. Also in etwas so?
1 | int state = 0; |
2 | while(true) |
3 | {
|
4 | switch(state) |
5 | {
|
6 | case 0: |
7 | if(nextByte == sstart byte) state = 1; |
8 | break; |
9 | case 1: |
10 | if(nextByte == setting pwm1) state = 20; |
11 | break; |
12 | case 2: |
13 | if(nextByte == setting pwm2) state = 21; |
14 | break; |
15 | ...
|
16 | ...
|
17 | ...
|
18 | case 20: |
19 | byte temp = nextByte; |
20 | if(checkCRC(nextByte)) |
21 | changePWM(temp); |
22 | else
|
23 | requestResend(setting pwm1); |
24 | state = 0; |
25 | break; |
26 | }
|
27 | }
|
Scheint wohl das ASCII die richtig Wahl zu seien scheint bei meinen Anforderungen. PPP schrieb: > Du kannst dich auch von PPP inspirieren lassen: > https://technet.microsoft.com/en-us/library/cc957975.aspx Ok danke. Ist aber HDLC auch sehr ähnlich. W.A. schrieb: > Was ist an "jede Sekunden Sensordaten 4 Bytes" und "hin und wieder die > Einstellungen" so schwer zu verstehen? > > Wenn die Sensordaten mit 4 Byte/s kommen, kannst du wohl davon ausgehen, > dass "hin und wieder" von Millisekunden weit entfernt ist. Und relativ > zur Datenrate ist es dann egal, ob 100 Bytes pro Jahr oder pro Woche. Ich hätte mich wohl genau ausdrücken müssen. Wobei ich mir bei vielen noch gar nicht so sicher bin. So oder so werde ich wohl keine große Bandbreite benötigen. Irgendwer schrieb: > Die bis jetzt hier gegebenen Antworten springen kreuz und quer von Layer > eins bis hin zu Tipps für Layer sieben lustig umher ohne das du > überhaupt definiert hast was du überhaupt genau haben willst. Mein Frage bezieht sich wohl eher auf die Schicht 2. Wobei ich mich wohl ein paar mal vertan hab und von Paketen gesprochen habe.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.