Hallo Kolleginnen und Kollegen,
ich habe ein gravierendes Problem mit einer seriellen Übertragung und hoffe, dass Ihr mir evtl weiterhelfen könnt.
Ob ich hier im Forum richtig bin, weiss ich nicht genau. Vielleicht werde ich das Problem auch auf einem Raspberry oder Python Forum posten….
Hier die oberflächliche Problembeschreibung (weiter Infos gibt es unten):
Ich übertrage seriell Daten von einem atxmega128 zu einem Raspberry 4, der diese Daten empfängt und ggfs. dann auf einen USB-Stick schreiben soll.
Dazu läuft auf dem Raspberry ein kleiner Python Script im Autostart.
Sobald dieser Script beendet wird (vermutlich durch einen Fehler), friert mein Bascom-Programm komplett ein.
Hier der Aufbau:
Der Raspberry 4 ist über die beiden Pins 8 und 10 mit meinem xmega128a4u Pin 26 und 27 verbunden (Com4)
Der Python-Script läuft als systemd Service (vorher via Eintrag unter rc.local)
Hier der Python-Script:
Alles anzeigen
Hier noch der Bascom-Code:
Alles anzeigen
Alles sehr verkürzt, aber an sich ist das alles keine Raketenwissenschaft.
Der Pythonscript läuft und empfängt die Daten. Er reagiert auf die Steuerbefehle „record start“ und „record stop“ und zeichnet dann auch auf USB auf.
Leider friert das System reproduzierbar ein.
Mal nach wenigen Sekunden, mal nach mehreren Stunden (Rekord waren bisher 28 Stunden).
Ich habe natürlich schon einiges versucht: Baudraten geändert. Serielle Verbindung in der Schleife beendet und wieder aufgebaut.
Ich habe das ganze System ein zweites mal aufgebaut (mit Rasperry 2). Alles mit dem gleichen Ergebnis…
Das einzige was ich herausgefunden habe und was überhaupt Hinweise liefert ist folgendes:
Wenn der Python-Script im Raspberry unter /etc /rc.local eingetragen ist, dann sieht man ihn ja laufen, wenn man sich mit dem Befehl „top“ die Liste der laufenden Prozesse anschaut.
Solange der Script dort erscheint ist alles OK.
Aus einem nicht ersichtlichen Grund verschwindet er aber irgendwann dort und dann bleibt sofort mein Bascom-Programm stehen.
Ich bin jetzt langsam mit meinem Latein am Ende und bin für jeden erdenklichen Hinweis dankbar.
Ich vermute mal, dass es kein Bascom-Problem ist, aber sicher bin ich mir nicht.
Also falls Ihr irgendwelche Ideen, Vorschläge, Geistesblitze habt, wäre ich Euch sehr dankbar!
ich habe ein gravierendes Problem mit einer seriellen Übertragung und hoffe, dass Ihr mir evtl weiterhelfen könnt.
Ob ich hier im Forum richtig bin, weiss ich nicht genau. Vielleicht werde ich das Problem auch auf einem Raspberry oder Python Forum posten….
Hier die oberflächliche Problembeschreibung (weiter Infos gibt es unten):
Ich übertrage seriell Daten von einem atxmega128 zu einem Raspberry 4, der diese Daten empfängt und ggfs. dann auf einen USB-Stick schreiben soll.
Dazu läuft auf dem Raspberry ein kleiner Python Script im Autostart.
Sobald dieser Script beendet wird (vermutlich durch einen Fehler), friert mein Bascom-Programm komplett ein.
Hier der Aufbau:
Der Raspberry 4 ist über die beiden Pins 8 und 10 mit meinem xmega128a4u Pin 26 und 27 verbunden (Com4)
Der Python-Script läuft als systemd Service (vorher via Eintrag unter rc.local)
Hier der Python-Script:
Quellcode
- #!/usr/bin/python
- #coding: utf8
- #!/usr/bin/env python
- import time
- import serial
- import subprocess
- import os.path
- ser = serial.Serial("/dev/ttyS0")
- ser.baudrate = 19200
- x = 0
- while 1:
- try:
- i=ser.readline()
- print i
- if ("record stop" in i):
- print "record stop"
- x = 0
- if ("record start" in i):
- print "record start"
- x = 1
- if ("umount" in i):
- cmd = "sudo umount -l /media/usb"
- os.system(cmd)
- if (x == 1):
- try:
- if os.path.ismount("/media/usb/"):
- File_Obj = open("/media/usb/reading.txt", "a")
- File_Obj.write(i)
- File_Obj.close
- ser.write("O")
- else:
- ser.write("F")
- except:
- print("error write usb")
- except:
- continue
Hier noch der Bascom-Code:
Quellcode
- '##### Konfigurations-Gedöns ##############################
- $regfile = "xm128a4udef.dat"
- $crystal = 32000000
- $hwstack = 64
- $swstack = 40
- $framesize = 40
- '##### mehr Gedöns ########################################
- $lib "xmega.lib"
- $lib "i2c_TWI.Lbx"
- $external _xmegafix_clear
- $external _xmegafix_rol_r1014
- '##### Echtzeit Gedöns ###################################
- Config Osc = Enabled , 32mhzosc = Enabled , 32khzosc = Enabled
- Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1
- Config Clock = Soft , Rtc = 1khz_int32khz_rcosc , Gosub = Sectic
- Config Priority = Static , Vector = Application , Lo = Enabled ' the RTC uses LO priority interrupts so these must be enabled !!!
- Enable Interrupts
- '##### EEPROM Gedöns ######################################
- Config Eeprom = Mapped
- '##### LCD Gedöns #########################################
- $lib "glcdeadogm128x6.lib" ' specify the used lib
- Config Vport0 = D
- Config Graphlcd = 128 * 64eadogm , Cs1 = Port0.5 , A0 = Port0.3 , Si = Port0.1 , Sclk = Port0.2 , Rst = Port0.4
- '##### Debounce konfigurieren ##########################
- Config Debounce = 15
- '### Konfigurationsgedöns des Analog-Digital Wandlers #########################
- Config Adca = Single , Convmode = Unsigned , Resolution = 12bit , Dma = Off , _
- Reference = Intvcc , Event_mode = None , Prescaler = 32 , _
- Ch0_gain = 1 , Ch0_inp = Single_ended , Mux0 = &B00000000
- '###### Kalibrierung ADC - Version 3
- Dim Calibration_word As Word
- Dim Adca_byte_0 As Byte At Calibration_word Overlay
- Dim Adca_byte_1 As Byte At Calibration_word + 1 Overlay
- 'First we read the Calibration bytes form Signature Row (to get the real 12-Bit)
- Adca_byte_0 = Readsig(&H20)
- Adca_byte_1 = Readsig(&H21)
- 'Write factory calibration values to calibration register
- Adca_call = Adca_byte_0
- Adca_calh = Adca_byte_1
- '##### Konfig für die serielle Schnitstelle ###############
- Config Com5 = 9600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8 'Terminal
- Config Com1 = 9600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8 'LCD
- Config Com4 = 19200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8 'Raspberry
- 'Config Serialout5 = Buffered , Size = 20 'Terminal
- Config Serialout1 = Buffered , Size = 20 'LCD
- 'Config Serialout4 = Buffered , Size = 20 'Raspberry
- Open "COM5:" For Binary As #1 'Terminal
- 'Open "COM1:" For Binary As #3 'LCD
- 'Open "COM4:" For Binary As #4 'Raspberry
- '##### I2C starten ###############
- Dim Twi_start As Byte 'This Variable is used by the I2C functions
- Open "twie" For Binary As #2
- I2cinit 'set i2c pins to right state , open collector , pull up activated
- Config Twie = 100000 'Set TWI Baud Rate and Enable TWI Master
- '############## Variablendeklarationen ##############################
- 'Dim ca. 100 Variable as Igendwas
- 'Declare ca. 40 Subs
- '###### Die Main-Loop
- Do
- Open "COM1:" For Binary As #3 'Nextion
- Open "COM4:" For Binary As #4 'Raspberry
- 'Ich habe hier mal alles rausgeschmissen, damit es ein bisschen übersichtlicher ist (siehe Unterprogramme)
- Loop
- '##### Unterprogramme #########################################################
- 'Hier stehen nochmal 40 Unterprogramme und 4000 Zeilen Code
- End
- Sectic:
- If Per_ist = Per_soll Then
- Per_ist = 1
- Print #4 , "Day: " ; _day ; " Time: " ; Time$ ; " Value: " ; Lw ; " " ; Einheitanz ; " " ; ";"
- Else
- Incr Per_ist
- End If
- 'Clear Serialout4
- Close #4
- Return
Alles sehr verkürzt, aber an sich ist das alles keine Raketenwissenschaft.
Der Pythonscript läuft und empfängt die Daten. Er reagiert auf die Steuerbefehle „record start“ und „record stop“ und zeichnet dann auch auf USB auf.
Leider friert das System reproduzierbar ein.
Mal nach wenigen Sekunden, mal nach mehreren Stunden (Rekord waren bisher 28 Stunden).
Ich habe natürlich schon einiges versucht: Baudraten geändert. Serielle Verbindung in der Schleife beendet und wieder aufgebaut.
Ich habe das ganze System ein zweites mal aufgebaut (mit Rasperry 2). Alles mit dem gleichen Ergebnis…
Das einzige was ich herausgefunden habe und was überhaupt Hinweise liefert ist folgendes:
Wenn der Python-Script im Raspberry unter /etc /rc.local eingetragen ist, dann sieht man ihn ja laufen, wenn man sich mit dem Befehl „top“ die Liste der laufenden Prozesse anschaut.
Solange der Script dort erscheint ist alles OK.
Aus einem nicht ersichtlichen Grund verschwindet er aber irgendwann dort und dann bleibt sofort mein Bascom-Programm stehen.
Ich bin jetzt langsam mit meinem Latein am Ende und bin für jeden erdenklichen Hinweis dankbar.
Ich vermute mal, dass es kein Bascom-Problem ist, aber sicher bin ich mir nicht.
Also falls Ihr irgendwelche Ideen, Vorschläge, Geistesblitze habt, wäre ich Euch sehr dankbar!