Datenlogger auf ARDUINO- Basis

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Ulrich schrieb:

      an den 328-Pins feine Drähte anlöten.
      Ich zitiere mal aus der ins deutsche übersetzten Beschreibung:

      SPARKFUN schrieb:

      SPI


      Am gegenüberliegenden Ende der Platine sind außerdem vier
      SPI-Testpunkte herausgebrochen. Mit diesen können Sie den Bootloader auf
      dem ATmega328 neu programmieren.

      Das neueste OpenLog (DEV-13712) bricht diese Punkte in kleineren durchkontaktierten Löchern heraus. Wenn Sie einen ISP zum Neuprogrammieren oder Hochladen eines neuen Bootloaders auf OpenLog verwenden müssen, können Sie Pogo-Pins verwenden, um eine Verbindung zu diesen Testpunkten herzustellen.
      Die Pins müssten eigentlich von links nach rechts Reset, SCK, Mosi und Miso sein, entweder der ganz linke oder ganz rechte verlötete Punkt wird die 3.3V des Chips führen (lt. Schaltplan gibt es einen TP1 also Testpunkt), das müsste man heraus messen. Gnd wiederum ist sowieso unten herausgeführt.

      Einfache Flasher brauchen auch keine Verbindung zur Stromversorgung, der MKII meckert aber, wenn der nicht erkennt, dass die Zielschaltung nicht stromversorgt ist.
      Daher sollte die Stromversorgung des Moduls aufrecht sein und auch nicht fremdversorgt werden (viele einfache Flasher tun das) da da ein eigener Spannungsregler alles tut was das Modul braucht während der MKII wiederum die Zielschaltung gar nicht versorgt sondern nur prüft ob die Stromversorgung aufrecht ist.

      Und während dem Flashen sollte auch keine SD-Karte gesteckt sein, weil die wohl auch an den ISP-Punkten hängt.
      Und natürlich kann man über den SPI dann nicht nur einen Bootloader flashen.
    • Ulrich schrieb:

      Die Frage die ich mir auch stelle, wo liegt die Resonatorfrequenz des Moduls und wie kommt der 328 bei 3,3V+/- ? mit den 16MHz zurecht?
      Das Quarz hat keine Aufschrift oder einen Code?
      Was immer funktioniert ist Messen, am besten Mit Oszi.

      Ob der 328p mit 16MHz bei 3,3V klar kommt?
      Er benötigt 2,7V für 10MHz; und 4,5V für 20MHz.
      In einem Diagramm im Datenblatt kann man auslesen, dass bei 3,3V nur ca. 12,25 MHz erreicht werden.
      Ich vermute daher, dass der nicht mit 16MHz läuft.

      Auch da hilft messen, welche VCC der Controller tatsächlich bekommt.
    • Laut Schaltplan ist ein ATMEGA328P_TQFP verbaut der mit 3.3V (Spannungsregler 3.3V MIC5205) versorgt wird.

      Die 3.3V sind wohl wiederum der SD-Karte geschuldet.

      Möglicherweise ist das ganze ja mit der heißen Nadel gestrickt :D .


      Laut Sparkfun sind die Daten aber wohl korrekt.


      SPARKFUN schrieb:

      Der SparkFun OpenLog ist ein Open-Source-Datenlogger, der über eine einfache serielle Verbindung funktioniert und microSD-Karten bis zu 32GB unterstützt. Der OpenLog kann große Mengen serieller Daten speichernoder „protokollieren“ und als eine Art Blackbox fungieren, um alle seriellen Daten, die Ihr Projekt generiert, für wissenschaftliche oder Debugging-Zwecke zu speichern.

      Der SparkFun OpenLog verwendet dank des integrierten Resonators einen ATmega328, der mit 16 MHz läuft.
      Der OpenLog verbraucht im Leerlaufmodus (nichts aufzuzeichnen) etwa 2-3mA. Während einer vollständigen Aufzeichnung kann OpenLog je nach verwendeter microSD-Karte 10 bis 20 mA verbrauchen.

      Alle vom OpenLog protokollierten Daten werden auf der microSD-Karte gespeichert.
      Jede microSD-Karte mit 512 MB bis 32 GB sollte funktionieren. OpenLog unterstützt sowohl die SD-Formate FAT16 als auch FAT32.

      Für eine noch bessere Leistung ist OpenLog Artemis das Tool, das Sie benötigen, mit Protokollierungsgeschwindigkeiten von bis zu 500.000 Bit/s.
    • Ulrich schrieb:

      an den 328-Pins feine Drähte anlöten
      Die benötigten Pins liegen auf den Bohrungen der unbelegten Seite. (Rst,Sck,Mo(si) und Mi(so). Fehlt nur noch Gnd , der kann von der anderen Seite genommen werden ;)
      Direkt an den Pins ist greußlich, das würde ich auch vermeiden wenn möglich.

      Der Bootloader wird sich vermutlich nicht überreden lassen den Flash Inhalt aus zu geben?
    • Aufgrund des Schaltbild sehe ich eine Beschaltung des SCK-Pins.
      Daran hängt eine LED (keine Low-Current) mit 330 Ohm Vorwiderstand.

      Diesen Pin muss ja der Programmer Takten, denn während der Programmierung über ISP ist der Controller Slave.
      Möglicherweise ist genau das das Problem.

      Ich glaube nicht, dass der SCK-Ausgang des Programmers mit 1MHz Takt die LED auch noch mit ca. 5mA treiben kann,
      ohne dass der SCK-Pegel zusammen bricht.

      LED oder Vorwiderstand auslöten und dann nochmal flashen mit anschließendem Verify durchführen.
      Gehts dann, was das das Problem.

      Wenn nicht, geht die Suche weiter.
    • Guter Hinweis

      Mitch64 schrieb:

      ohne dass der SCK-Pegel zusammen bricht.
      Dann hat der einfach keinen "Dampf" X( Mein MKII ist da auch schlapp. Mit 125kHz schafft er es (so gerade) mit dem Mosi über 220R ein LCD Backlight zum Flackern zu bringen.
      Weniger Speed könnte da helfen.
      Oder sind da Reihenwiderstände verbaut? Die 5 mA sollte er eigentlich spielend hin bekommen?
      Schwach, daß so ein "Profigerät" gegen einen 2€ Usbasp "abstinkt"
    • Hallo alle zusammen!

      Um auch meinen Senf dazuzugeben:
      Meinem "no name" OpenLog Modul habe ich vor einigen Tagen ebenfalls die V4.3 Firmware des Sparkfun-Moduls gegönnt. Die Beschaltung ist zwar nicht 100% gleich, aber beide haben den ATMEGA328P_TQFP verbaut.
      Mit meinem alten myAVR MKII Prommer und meiner altbewährten Software (myAVR ProgTool V1.56) zum Brennen hat dies auch Anhieb ohne Probleme funktioniert.
      Beim Brennvorgang hatte ich nicht mal die Verbindung zum Mega2560-Board getrennt und die Stromversorgung während des Brennvorganges erfolgte ausschließlich über den Prommer! (Das Mega2560 Board wurde dadurch natürlich die ganze Zeit vom Prommer spannungsmäßig mitversorgt).

      Hier noch ein Bild vom Anschluss des Adapterkabels (SPI/ISP) für den Prommer:
      ISP_Openlog.JPG
      Ganz links, mit der weißen Markierung, dass ist GND und die 5V vom Prommer habe ich an VCC auf der gegenüberliegenden Anschlussreihe eingespeist.
    • Hallo liebe Untertsützer und Hinweisgeber,

      Habe heute alle Pegel an dem No-Name Modul (mit Update Problem) nachgemessen, siehe Bilder MISO, MOSI, SCK.

      Mitch64 schrieb:

      Ich glaube nicht, dass der SCK-Ausgang des Programmers mit 1MHz Takt die LED auch noch mit ca. 5mA treiben kann,
      ohne dass der SCK-Pegel zusammen bricht.


      Zu diesem Modul, habe ich via Fusebit-Einstellung den Clock-Out gemessen: 15,993MHz sowie die Spannung am AVR-328 Pin4 von 3,255V

      Wenn ich den Chip-Inhalt nach dem Schreiben (Chip/write buffer into chip) in den Buffer zurücklese, deckt er sich nur in Teilen mit dem OpenLog_V43.hex. (siehe Bilder: Buffer zurückgelesen/OpenLog_V43) Vielleicht hängt das mit der niedrigen Spannung zusammen.

      Beim Sparkfun Modul lässt sich offenbar die Fusebit Einstellung nicht auslesen????

      @avralfred

      Erstellt dein No-Name Modul auch automatisch eine Config.txt, wenn auf der SD-Card beim Power-Up keine vorhanden ist?

      Viele Grüsse Ulrich
      Dateien
      • Prommer Bild2.jpg

        (70,59 kB, 15 mal heruntergeladen, zuletzt: )
      • Buffer zurückgelesen.JPG

        (273,81 kB, 13 mal heruntergeladen, zuletzt: )
      • OpenLog_V43 im Buffer.JPG

        (310,98 kB, 11 mal heruntergeladen, zuletzt: )
      • MISO.BMP

        (998,45 kB, 10 mal heruntergeladen, zuletzt: )
      • MOSI.BMP

        (998,45 kB, 5 mal heruntergeladen, zuletzt: )
      • SCK.BMP

        (998,45 kB, 9 mal heruntergeladen, zuletzt: )
    • Mal davon abgesehen, dass der Controller mit 16MHz und 3,3V außerhalb der Spezifikation betrieben wird,
      fallen doch noch die Pegel an der ISP-Schnittstelle auf.

      • Miso passt mit 3,3V. Das ist in Ordnung.
      • Mosi liegt höher, bei 3,8V. Wieso? Treibt dein Programmer 5V am MOSI?
      • Und der SCK (am Controller-Pin gemessen?) hat nur 2,5V. Das sind 75% von VCC. Das halte ich für zu wenig.
      Wie sieht das Reset-Signal aus von den Pegeln?

      Löte mal den Widerstand raus von der LED am SCK-Pin, oder probiere mal einen anderen Programmer, so wie es auch schon Pluto geschrieben hat.
    • Ulrich schrieb:

      wenn auf der SD-Card beim Power-Up keine vorhanden ist?
      Wobei es auch noch eventuell auf den Softwarestand ankommt.
      In der aktuellen Version wird jedenfalls eine Config.TXT angelegt.
      Deren Inhalt ist davon abhängig was vorher mit dem Modul passiert ist.
      Ist das Modul "nagelneu" (z.B. neu geflasht und das EEPROM wurde dabei auch gelöscht) werden die Standard-Vorgabewerte für das Config geschrieben, während bei einem bereits verwendeten Modul jene Werte in die Config.TXT geschrieben werden, welche auch die vorhergehende SD-Karte kannte (die auch abweichend vom Standard sein können.
    • An alle meine Unterstützer und andere Interessierte

      No-Name OpenLog-Modul läuft nun mit Update OpenLog_V43.hex

      Die Aufgabe bestand darin, ein Programm welches nur als *.hex File vorliegt, in einen AVR328 mit einem Diamex-Prommer zu übertragen.

      Die entscheidende Maßnahme war letztlich anstatt:

      Chip/write Buffer into chip das andere

      Chip/Autoprogram auszuwählen.



      Für alle, die sich ebenfalls für diese preiswerten Logger-Module (OpenLog-Module) interessieren und bei Bedarf ein erforderliches update einspielen wollen, hier meine Vorgehensweise. (Diese gilt prinzipiell für alle Dateien, die nur im *.hex Format vorliegen und in einen AVR-Prozessor einprogrammiert werden sollen)

      Hier speziell: Update-Adapter für das No-Name Modul präparieren, d.h. eine ISP-Verbindung mit Prommer herstellen (Ist etwas Lötarbeit, MISO-,MOSI-,SCK-,Reset- sowie Power-Pins des Moduls mit ISP vom Prommer verbinden. Prommer auf 3,3V Spannung einstellen. (Diamex-Bedienungsanleitung/ Bild vom Adapter in Post#68 von avralfred, Modulbilder in Post#39/#41)

      Zunächst im Menue Options/Programmer das Autoflash deaktivieren.

      Um beim Aufruf von Bascom Zugriff auf die ausgegrauten Menue-Icons zu erhalten, ist ein kurzes (beliebiges) Bascom-Programm mit dem entsprechenden AVR-Typ aufzurufen.

      Danach ist der Zugriff auf die Menue-Icons freigegeben und es kann wie folgt weitergehen:
      • Program Chip (F4) aufrufen
      • Im erscheinenden Menue: Buffer/clear anklicken (im Buffer-Bereich zeigen alle Werte nun „FF“/ dies nur zur Sicherheit, kann auch entfallen)
      • Buffer/Load from file anklicken (*.hex file mit Explorer suchen und mit öffnen auswählen, danach wechseln die im Buffer-Bereich angezeigten FF-Werte in die geladenen Hex-Werte )
      • Im Menue nun Chip/Autoprogram! auswählen und

      • warten bis der grüne Fortschrittsbalken abgelaufen ist und das Fenster geschlossen wird. Falls das Fenster nicht schließt, ist wohl ein Fehler aufgetreten.
      • Modul aus dem Update-Adapter entnehmen, und an den Logger-Prozessor anschließen, der die Daten für die SD-Card des Moduls liefern soll.



      Diese Vorgehensweise hat bei mir zum Erfolg geführt (zwei Module upgedated). Die No-Name Module funktionieren damit entsprechend der im Forum-Lexikon zu findenden OpenLog Beschreibung . Auf Basis der detaillierten Programm-Schnipsel von Zitronenfalter (Post#21/#23) kann ich noch mein Programmbeispiel zum Testen und Betrieb solcher Module beisteuern. (Anlegen weiterer Files zur Runtime)

      Ich hoffe, ich habe nichts vergessen…

      Gruß

      Ulrich
    • OpenLog Ergänzung/Hinweise

      Micro SD-Card: wenn möglich schnelle Variante, z.B. Class 10
      Formatierung SD-Card: Fat32
      Max. Grösse SD-Card : 32GB
      Verdrahtung: siehe Bild
      Beispiel/Test-Programm für Arduino Mega2560

      Mit Editor: 38400,26,3,0,0,0,0 als Config.txt vor Betrieb auf die SD-Card schreiben. (es sind alle Baudraten definierbar, 9600Bd ist Standardrate)

      Zur Vorgeschichte:

      Es gab in meinem Umfeld die Anforderung alle 5ms einen ADC-Wert über 12 Stunden mit 115200Bd auf einer SD-Card zu speichern.

      Zudem sollte das SD-Card Modul so klein wie technisch möglich sein, und eine einfache Ansteuerung aufweisen. Die Wahl fiel auf ein OpenLog Modul, welches mit der entsprechenden Config.txt (115200Bd,26,3,0,0,0,0) sowie via Tx-Port zu beschreiben ist.

      Da sonst keine weiteren Einstellungen (auch kein update) vorzunehmen waren, funktionierte das Loggen auf Anhieb und es wurde eine einzige große *.txt Datei erstellt. (8,64MB)

      Um diese riesige Datenmenge auch grafisch darstellen zu können, bot sich der Flow-CSV-Viewer an, welcher vermittels Zoomeinstellung jeden Abschnitt der dargestellten Grafik einsehbar macht, lediglich die Endung *.txt musste vorher in *.csv umbenannt werden.

      Um jedoch auch während der Laufzeit schon mehrere Files anlegen zu können (nicht nur nach Powerup) und zugleich den Namen der Files sowie die File-Endung *.csv selbst definieren zu können, wurde das Testprogramm erstellt.

      Testprogramm folgt....
      Dateien
    • Und hier noch mein Testprogramm für die Kommunikation mit OpenLog-Modul

      BASCOM-Quellcode

      1. '( Datum: 03.10.2023, Bascom Version 2.0.8.6
      2. Programm-Name: Forum V5 Test mit Gosub.bas
      3. Test-Programm für Kommunikation zum Openlog Modul
      4. In diesem Testprogramm wird auch ein Uhr Modul verwendet, z.B.
      5. ' https://www.reichelt.de/raspberry-pi-real-time-clock-modul-rtc-ds3231sn-rpi-rtc-clock-p224214.html?search=RTC-Modul
      6. Hier wurde der Einfachheit halber eine Sub Newfile zur Erkennung der
      7. OpenLog-Quittungszeichen gewählt.
      8. Auf SD-Card config.txt erstellen, Inhalt mittels Editor: 38400,26,3,0,0,0,0
      9. (das OpenLog-Modul wird hier mit 38400Bd beschrieben)
      10. Das Programm wurde auf einem upgedateten No-Nome Modul getestet.
      11. Sicherlich kann man Verbesserungen vornehmen, jedoch ist es ja auch nur
      12. ein Testprogramm
      13. **************************************************************************
      14. Mein besonderer Dank gilt Forums-Mitglied "Zitronenfalter", da ohne seine
      15. Vorarbeit dieses Programm so nicht möglich gewesen wäre
      16. **************************************************************************
      17. ')
      18. $regfile = "m2560def.dat"
      19. $crystal = 15875949 '!!!anstatt 16MHz hat mein Mega2560 nur 15,875MHz
      20. 'bei zu großer Abweichung von 16Mhz anpassen
      21. $hwstack = 200
      22. $swstack = 400
      23. $framesize = 400
      24. Disable Jtag
      25. Dim Naked_date As String * 8
      26. Dim Weekday As Byte
      27. Dim Sekunde As Byte
      28. Dim Got_time As String * 8
      29. Dim Got_date As String * 8
      30. Dim Newfilename As String * 12
      31. Dim Filenumber As Byte
      32. Dim F_nr As String * 3
      33. Dim S As String * 2
      34. Dim Fa As Byte
      35. Dim Fs As String * 3
      36. Dim Op_sent As String * 50
      37. Dim Substring1 As String * 2
      38. Dim Substring2 As String * 1
      39. Dim Cnt As Word
      40. Dim Text As String * 30
      41. Dim A As Byte
      42. Config Portf.0 = Output 'Ersatz-Reset Port für OpenLog Modul
      43. Testport Alias Portf.0
      44. Reset Testport 'separater Start-Reset für OpenLog-Modul
      45. Config Com4 = 38400 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
      46. Open "Com4:" For Binary As #3 'Output zum OpenLog für Daten
      47. Config Com3 = 38400 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
      48. Open "Com3:" For Binary As #2 'Input vom Openlog für Quittungen und anderes
      49. Config Serialin2 = Buffered , Size = 200
      50. Config Com1 = 115200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
      51. Open "Com1:" For Binary As #1 'Output zu Hterm, Mitlesen der Kommunikation
      52. Enable Interrupts
      53. $lib "i2c_twi.lbx"
      54. '-------------I2C Parameter---------------------------
      55. Config Scl = Portd.0 ' serial clock SCL am mega2560
      56. Config Sda = Portd.1 ' serial data SDA am mega2560
      57. I2cinit
      58. Config Twi = 400000 ' Taktrate 400KHz
      59. Const Ds3231w = &HD0 ' RTCadresse fuers schreiben
      60. Const Ds3231r = &HD1 ' RTCadresse fuers lesen
      61. Config Clock = User
      62. ''setze 32,768kHz (1Hz) Takt-Ausgang
      63. I2cstart
      64. I2cwbyte Ds3231w
      65. I2cwbyte 7
      66. 'I2cwbyte &B10010000 ' Control-Byte für 1Hz am SOW-Out
      67. I2cwbyte &B00010011 ' Control-Byte für 32,768kHz am SOW-Out
      68. I2cstop
      69. Config Date = Dmy , Separator = Minus 'Datumsformat TT-MM-JJ
      70. ''Zum Stellen der Uhr (DS3231) Date und Time aktualisieren und aktivieren
      71. 'Date$ = "03-10-23" 'z.B.: für Tests, Startzit definieren
      72. 'Time$ = "16:15:00" '
      73. ''---------------------Versions-Daten
      74. 'F_name = Version(3)
      75. 'F_date = Version(1)
      76. 'F_datum = Left(f_date , 10)
      77. 'F_time = Right(f_date , 8)
      78. 'Text = F_datum + " " + F_time
      79. 'Print #1, Text
      80. '-----------------------------------------------------------
      81. Clear Serialin2 'Eingangsbuffer für OpenLog Quittungen Löschen
      82. Wait 3 'Wartezeit damit OpenLog nach Powerup bereit wird
      83. ' '*******************************************************************************
      84. Filenumber = 0
      85. ''#############################
      86. Do
      87. Print #1 , "Do-Loop " 'Ausgabe für Hterm zur Kontrolle
      88. Gosub Newfile
      89. If A <> 0 Then 'Schreibfreigabe bei ungleich 0, aus Sub Newfile
      90. 'ab hier beliebige Daten auf Openlog Modul speichern
      91. ' Zur Kontrolle und auch für den Flow CSV Viewer doppelte Ausgabe
      92. 'z.B. Header-Zeilen
      93. Got_time = Time$
      94. Text = "#" + Got_time + "," + "new-Testfile " + "," + "2-Headerline" 'Beispiel Texte
      95. Print #3 , Text
      96. Text = "#" + Got_time + "," + "new-Testfile " + "," + "2-Headerline" 'Beispiel Texte
      97. Print #3 , Text
      98. Wait 1 'dieses Wait hier, nur damit der Time-Wert ein neuer ist
      99. Got_time = Time$
      100. 'ab hier Beispiel Daten, nur um zu sehen ob alles auch auf SD-Card landet
      101. Cnt = 0
      102. Do
      103. Incr Cnt
      104. Text = Str(cnt) + " , " + Got_time
      105. Print #3 , Text 'Daten zur SD-Card
      106. Loop Until Cnt > 100
      107. Print #1 , "---Daten sind geschrieben---" 'Für Hterm ausgabe
      108. End If
      109. Wait 3 'Pause bevor ein neues File angelegt wird
      110. Loop Until Filenumber > 1 'neues File anlegen,
      111. End
      112. '****************************************************************************
      113. Newfile: ''neues File im Command Modus anlegen
      114. Print #1, 'Kontrollausgaben für Hterm
      115. Print #1 , "***sub Newfile*******"
      116. Incr Filenumber
      117. Text = "Filenumber= " + Str(filenumber)
      118. Print #1 , Text 'Kontrollausgaben für Hterm
      119. Print #3 , "{026}{026}{026}"; ' bisherige Datenübertragung beenden
      120. 'und in Command-Modus wechseln
      121. 'Dieses Wait mit 200ms ist wichtig, da sonst nichts auf der SD-Card landet
      122. Waitms 200 'Offenbar benötigt das Modul einige Zeit
      123. ' 'um den Config.txt Inhalt zu interpretieren
      124. Op_sent = ""
      125. Substring1 = "~>" 'Quittungs-Zeichen für Modul im Command-Modus
      126. While Ischarwaiting(#2) = 1 '#2=Com3 für Empfang von OpenLog
      127. Fa = Waitkey(#2) 'Fa als Byte
      128. Fs = Chr(fa) 'von Byte nach Charakterzeichen
      129. Op_sent = Op_sent + Fs 'alle Zeichen sammeln
      130. Waitms 1 '???? Wartezeit, da Programm zu schnell ????
      131. Wend
      132. A = Instr(op_sent , Substring1) 'ist Command_modus?
      133. Print #1 , "A1=" ; A
      134. If A <> 0 Then 'substring gefunden wenn ungleich 0
      135. Print #3 , "sync" ' Restbuffer in file schreiben
      136. '
      137. Got_date = Date$
      138. Naked_date = Got_date
      139. Delchars Naked_date , "-" 'Binde-Striche zwischen den Uhr-Ziffern..
      140. '..entfernen, da max. 8 Zeichen erlaubt sind
      141. F_nr = Str(filenumber) 'wurde in Hauptschleife inkrementiert
      142. S = Format(f_nr , "0") 'einstellig, da sonst nicht in Filenamen passt
      143. Newfilename = Naked_date + "-" + S + ".csv" 'Erweiterung wichtig 8.3
      144. Clear Serialin2 'frei für neue Quitungs-Zeichen
      145. Print #3 , "append " ; Newfilename 'hier neues File erstellen
      146. Print #1 ,
      147. ''*******auf Freigabe zum Daten-Schreiben prüfen
      148. Op_sent = ""
      149. Substring2 = "<" 'Quittungs-Signal vom Modul, bin im Schreib-Modus
      150. Print #1 , "-------" 'Hterm Ausgabe
      151. Print #1 , "Check Freigabe" 'Hterm Ausgabe
      152. While Ischarwaiting(#2) = 1 '#2=Com3 für Empfang von OpenLog
      153. Fa = Waitkey(#2) 'Fa als Byte
      154. Fs = Chr(fa) 'von Byte nach Zeichen
      155. Op_sent = Op_sent + Fs 'alle Zeichen sammeln
      156. Waitms 1 '???? Wartezeit, da Programm zu schnell ????
      157. Wend
      158. A = Instr(op_sent , Substring2) ' Write-Modus
      159. Print #1 , "A2=" ; A 'Hterm Kontroll ausgabe
      160. End If
      161. Return
      162. ''*******************************************************************************
      163. Getdatetime:
      164. I2cstart
      165. I2cwbyte Ds3231w
      166. I2cwbyte 0
      167. I2cstart
      168. I2cwbyte Ds3231r
      169. I2crbyte _sec , Ack
      170. I2crbyte _min , Ack
      171. I2crbyte _hour , Ack
      172. I2crbyte Weekday , Ack
      173. I2crbyte _day , Ack
      174. I2crbyte _month , Ack
      175. I2crbyte _year , Nack
      176. I2cstop
      177. _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
      178. _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
      179. Return
      180. '*******************************************************************************
      181. Setdate:
      182. _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
      183. I2cstart
      184. I2cwbyte Ds3231w
      185. I2cwbyte 4
      186. I2cwbyte _day
      187. I2cwbyte _month
      188. I2cwbyte _year
      189. I2cstop
      190. Return
      191. '*******************************************************************************
      192. Settime:
      193. _sec = Sekunde 'Hier wird die Sekundenvariable mit dem gestellten Wert ersetzt.
      194. _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
      195. I2cstart
      196. I2cwbyte Ds3231w
      197. I2cwbyte 0
      198. I2cwbyte _sec
      199. I2cwbyte _min
      200. I2cwbyte _hour
      201. I2cstop
      202. Return
      203. '*******************************************************************************
      Alles anzeigen
    • Hallo Gemeinde,
      hier mein BASCOM Programm für das OpenLog-Moodul auf Basis von Ulrich - Danke hier an dieser Stelle.
      Habe es angepaßt an einen ATmega128. Dieser hat ja nur 2 Schnittstellen.

      Ach ja, das OpenLog-Modul verpaßt jeder Datei das selbe Datum. Kann man das irgendwie ändern? Klar wseiß ich, daß das Modul keine Uhr mit Datum hat, aber wäre schon schön.

      Quellcode

      1. 'OpenLog Test ATmega128.bas abgewandelt von
      2. '( Datum: 03.06.2024, Bascom Version 2.0.8.6
      3. Programm -name : Forum V5 Test Mit Gosub.bas
      4. Test-Programm für Kommunikation zum Openlog Modul
      5. In diesem Testprogramm wird auch eine Echtzeituhr Uhr DS1307 verwendet.
      6. Auf SD-Card config.txt erstellen, Inhalt mittels Editor: 9600,26,3,0,0,0,0
      7. (das OpenLog-Modul wird hier mit 9600 Bd beschrieben)
      8. Das Programm wurde auf einem upgedateten No-Nome Modul getestet.
      9. Sicherlich kann man Verbesserungen vornehmen, jedoch ist es ja auch nur
      10. ein Testprogramm
      11. **************************************************************************
      12. ')
      13. $regfile = "m128def.dat"
      14. $hwstack = 216
      15. $swstack = 216
      16. $framesize = 232
      17. $crystal = 14745600
      18. $version 0 , 3 , 90
      19. Disable Jtag
      20. Dim Naked_date As String * 8
      21. Dim Naked_time As String * 8
      22. Dim Weekday As Byte
      23. Dim Sekunde As Byte
      24. Dim Got_time As String * 8
      25. Dim Got_date As String * 8
      26. Dim Newfilename As String * 12
      27. Dim Filenumber As Byte
      28. Dim F_nr As String * 3
      29. Dim S As String * 2
      30. Dim A As Byte
      31. Dim Rechts As String * 1 'ASCII-Wert der Position 3 der Befehlzeichenfolge
      32. Dim B_udr As String * 7 'wird für das Zusammensetzen der Zeichen von UDR genutzt
      33. Config Portd.5 = Output 'Ersatz-Reset Port für OpenLog Modul
      34. Resetopenlog Alias Portd.5
      35. Reset Resetopenlog 'separater Start-Reset für OpenLog-Modul
      36. Config Portf.5 = Output 'Einschalten OpenLog Modul
      37. Set Portf.5
      38. 'UART0 ist Standard COM1 und wird hier als #2 angesprochen. Verwendung: OpenLog
      39. Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
      40. Open "Com1:" For Binary As #2 'Daten-Input vom Openlog, Quittungen
      41. Config Serialin1 = Buffered , Size = 200
      42. 'UART1 ist COM2 und wird hier als #1 angesprochen. Verbindung zum Terminal
      43. Config Com2 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
      44. Open "Com2:" For Binary As #1 'Daten-Output zu Hterm
      45. On Urxc Open_log_uart ' UART0 Interrupt
      46. Enable Urxc ' Enable Urxc0-Interrupt
      47. 'Ucsr0b.rxcie0 = 1 ' Enable Urxc0-Interrupt
      48. Enable Interrupts
      49. $lib "i2c_twi.lbx"
      50. '-------------I2C Parameter---------------------------
      51. Config Scl = Portd.0 ' serial clock SCL am mega2560
      52. Config Sda = Portd.1 ' serial data SDA am mega2560
      53. I2cinit
      54. Config Twi = 400000 ' Taktrate 400KHz
      55. Const Ds1307w = &HD0 ' RTCadresse fuers schreiben
      56. Const Ds1307r = &HD1 ' RTCadresse fuers lesen
      57. Config Clock = User
      58. '*** setze 32,768kHz (1Hz) Takt-Ausgang ***
      59. I2cstart
      60. I2cwbyte Ds1307w
      61. I2cwbyte 7
      62. I2cwbyte &B10010000 ' Control-Byte für 1Hz am SOW-Out
      63. 'I2cwbyte &B00010011 ' Control-Byte für 32,768kHz am SOW-Out
      64. I2cstop
      65. Config Date = Dmy , Separator = Minus 'Datumsformat TT-MM-JJ
      66. 'Zum Stellen der Uhr (DS1307) Date und Time aktualisieren und aktivieren
      67. 'Date$ = "31-05-24" 'z.B.: für Tests, Startzit definieren
      68. 'Time$ = "16:47:00" '
      69. '*******************************************************************************
      70. Clear Serialin1 ' Lesebuffer für OpenLog Quittungen Löschen
      71. Wait 3 ' Wartezeit damit OpenLog nach Powerup bereit wird
      72. '*******************************************************************************
      73. Filenumber = 0
      74. Print #1 ,
      75. Print #1 , "Version: " ; Version(2)
      76. Print #1 , "Datum vom: " ; Version(1)
      77. Print #1 , "Datei: " ; Version(3)
      78. Print #1 , "Systemzeit: " ; Date$ ; " " ; Time$ : Print #1,
      79. Wait 1
      80. 'Setze OpenLog zurück, damit wir wissen, in welchem Zustand er sich befindet, und
      81. 'warte bis Openlog online geht und mit "<" Bereitschaft meldet.
      82. Gosub Openlog_reset ' RESET vom OpenLog
      83. Do
      84. If Len(b_udr) > 2 Then 'wenn der eingelesene Befehl maximal 3 Zeichen lang ist
      85. Exit Do 'dann verlasse die DO-LOOP Schleife
      86. End If
      87. Loop
      88. 'Print #1 , : Print #1 , "UART0: " ; B_udr ' Kontrollausgabe von OpenLog
      89. Rechts = Right(b_udr , 1)
      90. B_udr = "" ' Empfangsstring löschen
      91. 'Print #1 , "letztes Zeichen: " ; Rechts
      92. If Rechts = "<" Then Print #1 , "OpenLog meldet Empfangsbereitschaft"
      93. Wait 1
      94. Print #2 , "{026}{026}{026}"; ' bisherige Datenübertragung beenden
      95. ' und in Command-Modus wechseln
      96. Do ' warte auf Zeichen von OpenLog
      97. If Len(b_udr) > 1 Then 'wenn der eingelesene Befehl 2 Zeichen lang ist
      98. Exit Do 'dann verlasse die DO-LOOP Schleife
      99. End If
      100. Loop
      101. 'Print #1 , : Print #1 , "UART0: " ; B_udr ' Kontrollausgabe von OpenLog
      102. Rechts = Right(b_udr , 1)
      103. Clear Serialin1 'frei für neue Quitungszeichen
      104. If Rechts = ">" Then Print #1 , "OpenLog im Command-Modus"
      105. Wait 1
      106. F_nr = Str(filenumber) 'wurde in Hauptschleife inkrementiert
      107. S = Format(f_nr , "0") 'einstellig, da sonst nicht in Filenamen passt
      108. Got_date = Date$
      109. Got_time = Time$
      110. Naked_time = Got_time
      111. Naked_date = Left(got_date , 2)
      112. Delchars Naked_time , ":" ' Doppelpunkte zwischen den Uhr-Ziffern löschen
      113. Newfilename = Naked_date + Naked_time + ".csv" ' Erweiterung wichtig 8.3
      114. ' ich will eigene Dateinamen und keine *.LOG Dateien auf der Karte, deshalb
      115. Print #1 , "Lösche alle LOG Dateien" : Print #1, ' lösche alle LOG-Dateien...
      116. Print #2 , "rm LOG*.TXT"
      117. Clear Serialin1 'frei für neue Quitungs-Zeichen
      118. Wait 2
      119. Print #2 , "append " ; Newfilename '...und erstelle hierein neues File
      120. Wait 1
      121. Print #1 , "Neuer Dateiname: " ; Newfilename 'hier neues File erstellen
      122. Wait 1
      123. Clear Serialin1 'frei für neue Quitungs-Zeichen
      124. Print #1 , "Sende nun einige Testdaten"
      125. For A = 1 To 20
      126. Print #2 , A ; " Zeit: " ; Time$ ' schreibe in Datei
      127. Print #1 , A ; " Zeit: " ; Time$ ' Kontrollausgabe
      128. Waitms 100
      129. Next
      130. Clear Serialin1 'frei für neue Quitungs-Zeichen
      131. Print #1 , "Fertig!"
      132. End
      133. '*******************************************************************************
      134. Getdatetime:
      135. I2cstart
      136. I2cwbyte Ds1307w
      137. I2cwbyte 0
      138. I2cstart
      139. I2cwbyte Ds1307r
      140. I2crbyte _sec , Ack
      141. I2crbyte _min , Ack
      142. I2crbyte _hour , Ack
      143. I2crbyte Weekday , Ack
      144. I2crbyte _day , Ack
      145. I2crbyte _month , Ack
      146. I2crbyte _year , Nack
      147. I2cstop
      148. _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
      149. _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
      150. Return
      151. '*******************************************************************************
      152. Setdate:
      153. _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
      154. I2cstart
      155. I2cwbyte Ds1307w
      156. I2cwbyte 4
      157. I2cwbyte _day
      158. I2cwbyte _month
      159. I2cwbyte _year
      160. I2cstop
      161. Return
      162. '*******************************************************************************
      163. Settime:
      164. _sec = Sekunde 'Hier wird die Sekundenvariable mit dem gestellten Wert ersetzt.
      165. _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
      166. I2cstart
      167. I2cwbyte Ds1307w
      168. I2cwbyte 0
      169. I2cwbyte _sec
      170. I2cwbyte _min
      171. I2cwbyte _hour
      172. I2cstop
      173. Return
      174. '*******************************************************************************
      175. '*** Interruptroutine zum Zeichenempfang von OpenLog ***
      176. '*******************************************************************************
      177. Open_log_uart:
      178. B_udr = B_udr + Chr(udr) ' lese Zeichen von UART0 und hänge es an den String an
      179. ' Udr1 = Udr ' und gebe es als Echo auf UART1 zurück
      180. Return
      181. '*******************************************************************************
      182. '*** RESET OpenLog ***
      183. '*******************************************************************************
      184. Openlog_reset:
      185. Reset Resetopenlog
      186. Waitms 10
      187. Set Resetopenlog
      188. Return
      189. '*******************************************************************************
      Alles anzeigen
    • Liebe Community,

      ich habe hier ein kleines Problem und finde keine Lösung.

      Aus OpenLog-Modulen sollen die Versionsdaten ausgelesen werden. Dafür gibt es auf Github ein Arduino C-Programm Beispiel, welches mit Bascom nachempfunden wurde.

      Mit diesem Bascom-Programm werden die in Github genannten 200 Datenwerte auf Hterm ausgelesen und nach einem „v“ für die Versionsdaten gesucht. Diese sind jedoch in den ausgelesenen Daten nicht vorhanden.

      Im angehängten Programm, auch mit Teilen von Hal50, ist die Versionsabfrage (nach Github) im Moment wieder auskommentiert, damit zunächst die Funktion des restlichen Programms bestätigt werden kann.

      Hat jemand noch einen Tipp, warum oder wieso die Versionsabfrage bei mir nicht funktioniert?

      BASCOM-Quellcode: OpenLog for Community

      1. 'Datum: 24.11.2024 /16:50
      2. 'Test für Daten-Logging auf SD-Card mit Open-Log Modul
      3. 'Verwendung von Gosubs für die einzelnen Vorbereitungs-Schritte
      4. 'Hardware-Basis: Arduino UNO
      5. $regfile = "m328pdef.dat"
      6. $crystal = 16000000
      7. $hwstack = 64
      8. $swstack = 54
      9. $framesize = 64
      10. $baud = 9600
      11. Dim Time_over As Byte
      12. Dim Naked_date As String * 6
      13. Dim Weekday As Byte
      14. Dim Got_time As String * 8
      15. Dim Got_date As String * 8
      16. Dim Newfilename As String * 12
      17. Dim Filenumber As Byte
      18. Dim A As Byte
      19. Dim F_name As String * 50
      20. Dim F_date As String * 25
      21. Dim F_datum As String * 10
      22. Dim F_time As String * 8
      23. Dim S As String * 1
      24. Dim Sekunde As Byte
      25. Dim I As Byte
      26. Dim B_udr As String * 3
      27. Dim Uart_cnt As Byte
      28. Dim Zeichen_ist_da As Byte
      29. Dim Buf(200) As Byte
      30. Dim Wert As String * 3
      31. '******************************************************************
      32. 'Open a Soft channel for output to Hterm
      33. Open "comd.6:9600,8,n,1" For Output As #1 'zusätzlicher UART-Ausgang
      34. Config Portc.0 = Output ' 'an GRN=kapazitver Input von OpenLog => Reset,
      35. Extra_reset Alias Portc.0
      36. Set Extra_reset
      37. Config Timer1 = Timer , Prescale = 1024
      38. On Timer1 Tim1_isr
      39. Enable Timer1
      40. Stop Timer1
      41. On Urxc Open_log_uart ' UART Interrupt
      42. Enable Urxc ' Enable UART-Interrupt
      43. Enable Interrupts
      44. $lib "i2c_twi.lbx"
      45. '-------------I2C Parameter---------------------------
      46. Config Scl = Portd.0 ' serial clock SCL am mega2560
      47. Config Sda = Portd.1 ' serial data SDA am mega2560
      48. I2cinit
      49. Config Twi = 100000 ' Taktrate 100KHz
      50. Const Ds3231w = &HD0 ' RTCadresse fuers schreiben
      51. Const Ds3231r = &HD1 ' RTCadresse fuers lesen
      52. Config Clock = User
      53. ''setze 32,768kHz (1Hz) Takt-Ausgang
      54. I2cstart
      55. I2cwbyte Ds3231w
      56. I2cwbyte 7
      57. ''I2cwbyte &B10010000 ' Control-Byte für 1Hz am SOW-Out
      58. I2cwbyte &B00010011 ' Control-Byte für 32,768kHz am SOW-Out
      59. I2cstop
      60. Config Date = Dmy , Separator = Minus 'Datumsformat TT-MM-JJ
      61. ''Zum Stellen der Uhr (DS1307) Date und Time aktualisieren und aktivieren
      62. 'Date$ = "23-11-24" 'z.B.: für Tests, letzter Tag im Jahr
      63. 'Time$ = "11:56:00" 'z.B.: für Tests, 3 Minuten vor Mitternacht
      64. F_name = Version(3)
      65. F_date = Version(1)
      66. F_datum = Left(f_date , 10)
      67. F_time = Right(f_date , 8)
      68. Print #1 , F_name
      69. Print #1 , F_datum
      70. Print #1 , F_time
      71. Time_over = 0
      72. Wait 3
      73. Uart_cnt = 0
      74. Gosub Openlog_reset 'Reset OpenLog Modul an GRN
      75. Wait 1
      76. Gosub Check_if_ready 'Ist Modul Alive?; ==> "<"
      77. Wait 1
      78. Gosub Command_mode 'Prepare for Receiving Commands; ==> ">"
      79. '***************************************************************
      80. 'Gosub Version_mode 'hole OpenLog Version
      81. ''Versuch die Versonsdaten auszulesen, jedoch kein "v" zu entdecken
      82. ''Beispiel-Umsetzung Arduino Routine aus Github
      83. '' Auslesen der per read empfangenen Daten
      84. 'For I = 1 To 200
      85. ' Wert = Chr(buf(i))
      86. ' 'If Buf(i) = 118 Then ' ==> "v"
      87. ' Print #1 , I ; " " ; Buf(i) ; " " ; Wert
      88. ' 'End If
      89. 'Next
      90. 'Print #1 , "Ende erreicht"
      91. '*****************************************************************
      92. Print #1, 'Leerzeile
      93. Filenumber = 4 'Vorgabe einer Nummer, (0 - 9 max.?
      94. Gosub Make_filename 'Bilde Filename
      95. Gosub Prep_for_writing 'from Command-Mode to Record-Mode; ==> "<"
      96. Print #1 , "Sende nun einige Testdaten"
      97. Gosub Write_data 'Daten auf SD-Card
      98. End
      99. ''****************************************************************************
      100. Open_log_uart:
      101. B_udr = Chr(udr) ' lese Zeichen von UART0
      102. Zeichen_ist_da = 1
      103. Return
      104. Openlog_reset:
      105. Reset Extra_reset
      106. Waitms 10
      107. Set Extra_reset
      108. Return
      109. Check_if_ready:
      110. Time_over = 0
      111. Timer1 = 40000
      112. Start Timer1
      113. Do
      114. If Time_over = 0 Then
      115. If B_udr = "<" Then 'wenn der eingelesene Befehl
      116. Exit Do 'dann verlasse die DO-LOOP Schleife
      117. End If
      118. Else
      119. Print #1 , "--SD-CARD vorhanden ???--"
      120. Print #1 , " Program gestoppt"
      121. Print #1 ,
      122. Stop
      123. End If
      124. Loop
      125. Stop Timer1
      126. B_udr = "" ' Empfangsstring löschen
      127. Print #1 , "---- OpenLog alive ----"
      128. Print #1,
      129. Return
      130. Command_mode:
      131. Print "{026}{026}{026}"; ' in Command-Modus wechseln
      132. Do ' warte auf Zeichen von OpenLog
      133. If B_udr = ">" Then '
      134. Exit Do '
      135. End If
      136. Loop
      137. B_udr = "" '
      138. Print #1 , "OpenLog im Command-Modus"
      139. Return
      140. Version_mode: '200 Zeichen einlesen, nach Github-Arduino- Beispiel
      141. Print #1,
      142. Print #1 , "-----Versionsabfrage ---"
      143. Print "? " 'Help Aufruf laut Github Arduino Programm
      144. Waitms 100
      145. Do
      146. Print "read " 'Daten von SD-Card einlesen
      147. Do
      148. nop
      149. Loop Until Zeichen_ist_da = 1 'Merker: Uart hat Zeichen empfangen
      150. Zeichen_ist_da = 0 ' 'Merker zurücksetzen
      151. Incr Uart_cnt 'zählen der Zeichen
      152. Buf(uart_cnt) = Udr 'speichern in Buffer, Auslesen im Hauptprogramm
      153. Loop Until Uart_cnt > 200
      154. B_udr = ""
      155. Return
      156. Make_filename:
      157. Got_date = Date$
      158. Naked_date = Got_date
      159. Delchars Naked_date , "-"
      160. S = Str(filenumber)
      161. Newfilename = Naked_date + "-" + S + ".csv" ' Erweiterung wichtig 8.3
      162. ' ich will eigene Dateinamen und keine *.LOG Dateien auf der Karte, deshalb
      163. Print #1 , "Neuer Dateiname: " ; Newfilename
      164. Return
      165. Prep_for_writing:
      166. Print #1 , "Lösche alle LOG Dateien"
      167. Print #1,
      168. Print "rm LOG*.TXT"
      169. Wait 2
      170. Print "append " ; Newfilename '...und erstelle neues File
      171. Do ' warten auf Zeichen von OpenLog
      172. If B_udr = "<" Then '
      173. Exit Do '
      174. End If
      175. Loop
      176. Print #1 , "OpenLog is ready for writing"
      177. Return
      178. Tim1_isr:
      179. Time_over = 1
      180. Timer1 = 0 '
      181. Return
      182. Write_data: 'Beispiel: Schreiben auf SD-Card in OpenLog Modul
      183. Print #1 , "Alles OK" 'Vorbereitung war ok
      184. Got_time = Time$
      185. Got_date = Date$
      186. For A = 1 To 10
      187. Print A ; " Zeit: " ; Got_date ; " " ; Got_time '
      188. Waitms 50
      189. Next
      190. Print #1 , "Fertig!"
      191. Return
      192. Getdatetime:
      193. I2cstart
      194. I2cwbyte Ds3231w
      195. I2cwbyte 0
      196. I2cstart
      197. I2cwbyte Ds3231r
      198. I2crbyte _sec , Ack
      199. I2crbyte _min , Ack
      200. I2crbyte _hour , Ack
      201. I2crbyte Weekday , Ack
      202. I2crbyte _day , Ack
      203. I2crbyte _month , Ack
      204. I2crbyte _year , Nack
      205. I2cstop
      206. _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
      207. _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
      208. Return
      209. '*******************************************************************************
      210. Setdate:
      211. _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
      212. I2cstart
      213. I2cwbyte Ds3231w
      214. I2cwbyte 4
      215. I2cwbyte _day
      216. I2cwbyte _month
      217. I2cwbyte _year
      218. I2cstop
      219. Return
      220. '*******************************************************************************
      221. Settime:
      222. _sec = Sekunde 'Hier wird die Sekundenvariable mit dem gestellten Wert ersetzt.
      223. _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
      224. I2cstart
      225. I2cwbyte Ds3231w
      226. I2cwbyte 0
      227. I2cwbyte _sec
      228. I2cwbyte _min
      229. I2cwbyte _hour
      230. I2cstop
      231. Return
      232. '*******************************************************************************
      Alles anzeigen
    • Hast du mal das Buf-Array ausgeben lassen ob da überhaupt ein v drin ist?

      Wenn nicht, liegts wohl am Empfang, wenn doch, dann wohl an der Suchroutine.

      Aber warum machst du dir so eine Mühe?
      Wieso benutzt du nicht einfach den SerialIn Buffer?

      Checken ob was drin ist, wenn ja byte lesen. Ist es v, wenn nicht verwerfen und von vorn.
      Oder v da, dann die nächsten bytes lesen.

      Der Buffer leer sich dann von ganz alleine, kannst eigentlich nichts verpassen.