Von Console/Terminal Lesen

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Stephan-X
Beiträge: 80
Registriert: 30.07.2008 16:02
Computerausstattung: PC 8 GB RAM NVIDIA Grafik 1 TB RAID // Ubuntu Mate 64 Bit // Pure 6.0 64
Wohnort: Oberösterreich

Von Console/Terminal Lesen

Beitrag von Stephan-X »

Moin Forum, wieder mal geht's nicht weiter und ich brauche Eure Hilfe !
Gecodet habe ich eine IDE für die Entwicklung (C und Assembler) von diversen Industrieüblichen PIC's.
Das ganze Funktionirt soweit prima, zumindest das Schreiben in die Console (Befehlsausführung mit RunProgram)
Hier mal ein Beispiel, event gibt's da auch noch Verbesserungen ?
Die Variablen werden je nach Befehl und Programmer vom Programm zusammengesetzt. Hier AVRDude.

Code: Alles auswählen

Case #avr_linker
        If OpenConsole("Console", #PB_UTF8) 
          progrun.l = RunProgram("avr-gcc","-mmcu="+pic_name+" -Os -c "+projekt+"/"+av_datei+".c -o "+projekt+"/"+av_datei+".o","", 						#PB_Program_Open | #PB_Program_Write)
          Debug Str(progrun)
          If ProgramRunning(progrun) = 0
            MessageRequester("Info","Programm  Abbruch")
            KillProgram(progrun)
            CloseProgram(progrun)
          Else
            MessageRequester("Info","Programm  Übersetzt")
            KillProgram(progrun)
            CloseProgram(progrun)
          EndIf
        EndIf
        CloseConsole()
        
        If OpenConsole("Console", #PB_UTF8) 
          progrun = RunProgram("avr-gcc",projekt+"/"+av_datei+".o -o "+projekt+"/"+av_datei+".elf","",#PB_Program_Open | #PB_Program_Write)
          Debug Str(progrun)
          If ProgramRunning(progrun) = 0
            MessageRequester("Info","Programm  Abbruch")
            KillProgram(progrun)
            CloseProgram(progrun)
          Else
            MessageRequester("Info","Linker  Beendet")
            KillProgram(progrun)
            CloseProgram(progrun)
          EndIf
        EndIf
        CloseConsole()
So jetzt kommt der Schwierige Teil, das Lesen aus der Console und Ausgeben ??
Habe alles was ich im Netz und Foren finden konnte probiert , aber nur mit mäßigen Erfolg.
So auch das nächste Code Beispiel "Lesen" was teilweise was Ausgibt, den "stderr" aber den "stdout"
bekomme ich nicht zum Reden.

Code: Alles auswählen

; Da das Terminal aber gesprächig ist möchte ich die Ausgabe / Rückmeldung auch von der Console Lesen.
; Verwendet und Abgewandelt habe ich ein Lesebeispiel aus PureExamples
; Habe etwas Rumgecodet mit Befehlen um das ganze zu verstehen 
; ---------------------------------------------------------------------
   RunProgram("GNOME-Terminal","","",#PB_Program_Open | #PB_Program_Write )
  
   ; Variablen vom Program
   progger.s = "avrdude" 
   ic_name.s = "atmega8"
   isp_version.s = "avr910"
   device_pipe.s = "/dev/ttyUSB0"
   projekt.s = "/home/stephan/AVR_Projekte/Ampel/"
   av_datei.s = "Ampel"
   
   ; Gegebene Variablen
   #BUFF_SIZE = 1024
   Prog.i
   total_size = 0
	 stdout.s
	 stderr.s
	 avail.i
	 BufferFree = 10000
	 *buffer = AllocateMemory(#BUFF_SIZE)
	 
	If OpenConsole("Console", #PB_UTF8) 
	  Prog = RunProgram(progger,"","",#PB_Program_Open | #PB_Program_Read | #PB_Program_Error | #PB_Program_UTF8)
	  If Prog
		  While ProgramRunning(Prog)
		    avail = ReadConsoleData(*buffer+total_size,BufferFree)
			  stdout + PeekS(*buffer, avail, #PB_ByteLength | #PB_UTF8)
			  stderr + ReadProgramError(Prog)
		  Wend
		  CloseProgram(Prog)
	  EndIf

	  FreeMemory(*buffer)
	  If stdout
	    Debug "======OUTPUT====="
	    Debug stdout
	    Debug "================="
	  EndIf
	  If stderr
		  Debug "======ERROR====="
		  Debug stderr
		  Debug "================"
	  EndIf
	EndIf
	CloseConsole()
Ja wie gesagt da steh ich nun und die Birne Raucht, werd wahrscheinlich alt (BJ 58) !!
Bitte mal um einen Denkanstoß :)
Noch ein schönes WE, LG Stephan
Wenn Sie nichts zu Tun haben, tun Sie es bitte nicht hier.
Stephan-X
Beiträge: 80
Registriert: 30.07.2008 16:02
Computerausstattung: PC 8 GB RAM NVIDIA Grafik 1 TB RAID // Ubuntu Mate 64 Bit // Pure 6.0 64
Wohnort: Oberösterreich

Re: Von Console/Terminal Lesen

Beitrag von Stephan-X »

Hallo Pure_Progger am Feiertag,
nach Tagen von Einlesen, Foren-Stöbern, Ausprobieren habe ich soweit eine Fastlösung gefunden. Eigentlich ist das ganz Einfach und beruht auf
einer Befehlszeile die in die Console geschrieben wird !! (/Das ist das Problem, daran scheitert's)
Ok ich Arbeite mit dem Programm "avrdude" und deren div. Parameter die Angehängt werden.
Einen Befehl für's Terminal : avrdude -p atmega8 -c avr910 -P /dev/ttyUSB0 -n -v Funktioniert.
Aus Purebasic heraus (Compiler ist Consolmodus eingestellt) wäre das folgender Befehl:

Code: Alles auswählen

RunProgram("avrdude"," -p atmega8 -c avr910 -P /dev/ttyUSB0 -n -v","",#PB_Program_Open | #PB_Program_Write)
Funzt... aber ohne Ausgabe im Compilierten Programm und ohne daß ich die Ausgabe als Text weiterverarbeiten kann.
Ein Terminal/Console wird nur geöffnet solange die Pure IDE läufdt !?
Die Lösung:logsave -a Test.txt avrdude -p atmega8 -c avr910 -P /dev/ttyUSB0 -n -v Zeigt die Ausgabe an und Schreibt stdout in die
Datei die dann weiter verwendet werden kann. -a bedeutet daß nicht überschrieben- sonder hinten angehängt wird.
Das wäre die Befehlszeile die in die Console geschrieben werden müsste, eigentlich simpel.
Eins vorweg, Runprogram() funktioniert nicht da schon Parameter "logsave -a Test.txt" vor dem Programmaufruf "avrdude" stehen muss und
die Consolbefehle:

Code: Alles auswählen

OpenConsole()
PrintN("logsave -a TEST.txt avrdude  -p atmega8 -c avr910 -P /dev/ttyUSB0 -n -v")
CloseConsole()
zwar die Zeile in die Console Schreiben aber den Befehl nicht ausführen ??
Ja kurz davor :D wer kann mir da Helfen oder hat eine Zündende Idee wie ich aus einem Pure Programm den Befehl in die Console Schreib und Ausführe ??
Schönen Feiertag noch.
Stephan
Wenn Sie nichts zu Tun haben, tun Sie es bitte nicht hier.
Antworten