Emulator-Programm

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

mschnell hat geschrieben: Das Beispielprogramm ließ sich übersetzen, aber die Message kommt nicht beim Empfänger an (Keine Fehlermeldung).
Hast du meine Variante oben oder BerLin's source.zip getestet?
source.zip geht bei mir auf Linux auch nicht aber der Code den ich oben gepostet habe schon.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Beitrag von mschnell »

Ich habe mein eigenes zusammengeclickt, das ein paar Buttons und ein TMemo verwendet:

Code: Alles auswählen

unit Unit1; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls,
  simpleipc;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Memo1: TMemo;
    SimpleIPCClient1: TSimpleIPCClient;
    SimpleIPCServer1: TSimpleIPCServer;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure SimpleIPCServer1Message(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 
 
var
  Form1: TForm1; 
  nr: Integer;
 
implementation
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Lines.Add('StartServer');
  SimpleIPCServer1.ServerID := 'test';
  SimpleIPCServer1.Global := True;
  SimpleIPCServer1.StartServer;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  Memo1.Lines.Add('Server send ' + IntToStr(nr));
//  SimpleIPCServer1.;
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
  Memo1.Lines.Add('StartClient');
  SimpleIPCClient1.ServerID := 'test';
  SimpleIPCClient1.Connect;
end;
 
procedure TForm1.Button4Click(Sender: TObject);
begin
  SimpleIPCClient1.SendStringMessage('da kommt was');
end;
 
procedure TForm1.SimpleIPCServer1Message(Sender: TObject);
var
  s: String;
  n: Integer;
  st: TMemoryStream;
begin
  SimpleIPCServer1.GetMessageData(st);
  n := st.Size;
  setlength(s, n);
  st.Read(s[1], n);
//  SimpleIPCServer1.Readmessage; is protrected
  s := SimpleIPCServer1.StringMessage;
  Memo1.Lines.Add(s);
 
//  ExecuteProcess('whoami', '');
 
end;
 
initialization
  {$I unit1.lrs}
 
end.
-Michael

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Du machst aber auch kein polling. Das muss man wahrsch. unter Linux.
Schau dir mein Beispiel an.

Repeat
SimpleIPCServer1.PeekMessage(1,true);
Application.ProcessMessages;
until Closeing;

Das würde man natürlich besser in einen Thread auslagern.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Beitrag von mschnell »

theo hat geschrieben:Du machst aber auch kein polling. Das muss man wahrsch. unter Linux.
Das ist aber ausgesprochen unfein !!! :(:( :( !!!

Einerseits ist es offensichtlich eben nicht Plattform-unabhängig und zweitens sind On???? - Events ja genau dafür da, dass man kein Polling machen muss, sondern eben eine Nachricht im Mainthread erhält, wenn ein externes Ereignis auftritt.

Ich habe mir den (wegen Verwendung eines abstrakten Objekts und diverser inc-Dateien) ziemlich komplexen) Sourcecode noch nicht im Detail angeschaut, aber ich vermute, dass in Linux eine Queue verwendet wird. Hier sollte man richtiger Weise das "epoll" - Interface verwenden, das einen Callback aufruft, wenn auf einer Queue Daten ankommen. Dieser Callback muss natürlich von der Komponente auf das Delphi-Langauge "Event" umgesetzt ("gequeued") werden. Da ich leider den Message-Queue-Mechanismus in der Linux LCL (noch) nicht genau genug kenne, kann ich das nicht " 'mal eben" einbauen :( da müsste ein besserer Kenner der Materie 'ran.

Eigentlich sollte man einen Bug-Report schreiben...

-Michael

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Mach doch, du kannst übrigendes in LNet gucken dort ist das genau so gelöst wie du das hier vorschlägst. Bin nebenbei auch dafür. Aber als Bug seh ich das nicht wenn die Komponente es eigentlich erfordert zu pollen und im Windows funktionierts auch ohne ist das nicht unbedingt ein Bug. Es ist aber sicher schöner das über die Messageque zu lösen.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Beitrag von mschnell »

Ich schau' mir das 'mal an.

Vielleicht kann ich ein Patch machen (oder Du ....? Jedenfalls wird der andere sich das dann sicherlich kritisch angucken :) )

(Für mich ist alles was nicht Plattform-Unabhöngig ist ein Bug (außer es ist explizit dokumentiert und in der To-Do-Liste.)

(Wer sagt, dass die Komponente erfordert, zu pollen ? Dazu brauchte es das Event dann nicht zu geben.)

-Michael

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Das sagt die nicht vorhandene Doku zu der Komponente. Wenn das Poll Event da ist muss es normalerweise auch benutzt werden.
In der fpc ipcserver klasse MUSS es enutzt werden. Und die visuellen Komponenten sind nur eine Kapselung davon.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

HEndrik18
Beiträge: 1
Registriert: Do 31. Mär 2011, 20:24

Re: Emulator-Programm

Beitrag von HEndrik18 »

Bei mir funktioniert es garnicht :(
Gruss HEndrik

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Emulator-Programm

Beitrag von MAC »

Hi, schau dir das mal an.
http://www.martinjakobs.de/pages/lazarus.php" onclick="window.open(this.href);return false;

Da gibts ne einfache nleitung zu...
versteh sogar ich :D
http://www.martinjakobs.de/media/Lazaru ... lieren.pdf" onclick="window.open(this.href);return false;

soll auch platformunabhängig sein: http://wiki.lazarus.freepascal.org/lNet" onclick="window.open(this.href);return false;

Code: Alles auswählen

Signatur := nil;

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Emulator-Programm

Beitrag von Maik81ftl »

Weiß nicht, ob das ggf helfen kann. ist je eine RS-232 Routine zum Datentausch.

Aber wie ihr schon sehen werden halt leider in ASM

RS232-send.asm

Code: Alles auswählen

list p=16f84
;***********************************************************************
;* Pinbelegung des PIC
;* -------------------
;* PORTA :  0 
;*			1
;*			2	seriell Output
;*			3
;*			4
;* PortB	0
;*			1
;*			2
;*			3
;*			4
;*			5
;*			6
;*			7
;***********************************************************************
;* Senden via RS232 am Pin RB2
;* output RA1	(keine RS232-Treiberschaltkreise verwenden)
;* Takt : 4 MHz
 
	#include	<p16f84.inc>
 
	__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
 
;***********************************************************************
;* Variablennamen vergeben
 
Temp	Equ	0x20
cycl_1	equ	0x21	; Zähler
cycl_2	equ	0x22	; Zähler
Byte	equ	0x23
out		equ	2		; RS-232 Out ist RA2
 
;**********************************************************************
; los geht's mit dem Programm
; Pin RA2 auf Ausgabe stellen
 
init	bsf 	STATUS, RP0
		movlw	B'00111011'
		movwf	TRISA
		bcf		STATUS, RP0
		clrf	PORTA
 
Loop	movlw 	'A'
		call	Send_RS
		goto 	Loop
 
;***********************************************************************
; senden des Bytes, das im Register 'W' steht
 
Send_RS	movwf	Byte
		movlw	8
		movwf	cycl_1
		bcf		PORTA, out
		call	Warte_s
		bsf		PORTA, out
		call	Warte_s
 
Send_1	rrf		Byte, f
		btfsc 	STATUS, C
		bcf 	PORTA, out
		btfss	STATUS, C
		bsf 	PORTA, out
		call 	Warte_s
		decfsz	cycl_1, f
		goto 	Send_1
		bcf 	PORTA, out
		call	Warte_s
		Return
 
;***********************************************************************
; ein Bit Zeitverzögerung mit einer Warteschleife
; Timing muss genau Stimmen (5%)
; senden		4 MHz	10MHz
; 2400 Bps = 	69d		173d
; 9600 Bps = 	16D		 43d
 
Warte_s	Movlw	D'16'
		movwf 	cycl_2
 
Warte1	nop
		nop
		nop
		decfsz 	cycl_2, 1
		goto	Warte1
		return
 
		end
RS232-empf.asm

Code: Alles auswählen

list p=16f84
;***********************************************************************
;* Pinbelegung des PIC
;***********************************************************************
;* PORTA :  0 
;*			1
;*			2	
;*			3	seriell Input
;*			4
;* PortB	0	LED	2^0
;*			1	LED 2^1
;*			2	LED 2^2
;*			3	LED 2^3
;*			4	LED 2^4
;*			5	LED 2^5
;*			6	LED 2^6
;*			7	LED 2^7
;***********************************************************************
;* Rothe, Andreas - Empfänger RS-232
;* input RA3	(keine RS232-Treiberschaltkreise verwenden
;*				 sondern 22K Reihenwiderstand)
;* Takt : 4 MHz
;* Empfangener Code wird am PORTB ausgeben
 
	#include	<p16f84.inc>
 
	__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
 
;***********************************************************************
;* Variablennamen vergeben
 
cycl_1	equ	0x20	; Zähler
cycl_2	equ	0x21	; Zähler
rs232in	equ	0x22
Byte	equ	0x23
Temp	equ	0x24
in		equ	3		; RS-232 In ist RA3
 
;**********************************************************************
; los geht's mit dem Programm
; Pin RA2 auf Ausgabe stellen
 
init	bsf 	STATUS, RP0
		movlw	B'00000000'
		movwf	TRISB
		bcf		STATUS, RP0
		clrf	PORTA
		clrf	PORTB			; Alle LEDs ausschalten
 
Loop	call	Ser_RX
		movlw	rs232in
		movwf	PORTB
		goto 	Loop
 
;***********************************************************************
; senden des Bytes, das im Register 'W' steht
 
Ser_RX	clrf 	Byte
		movlw	8
		movwf	cycl_1
		btfsc	PORTA, in
		goto 	Ser_RX
		call 	Pause
		btfsc	PORTA, in
		goto	Ser_RX
 
RX_2	call 	Warte
		btfsc	PORTA, in
		bcf		STATUS, C
		btfss	PORTA, in
		bsf		STATUS, C
		rrf		Byte, f
		decfsz	cycl_1, f
		goto	RX_2
 
		call	Warte
		btfsc	PORTA, in
		goto 	Ser_RX
		movf	Byte, w
		movwf	rs232in
		Return
 
;***********************************************************************
; ein Bit Zeitverzögerung mit einer Warteschleife
; Timing muss genau Stimmen (5%) LZ zw sendert und Empfänger
; empfangen		4 MHz	10MHz
; 2400 Bps = 	69D		173D
; 4800 Bps = 	34D		 86D
; 9600 Bps = 	16D		 43D
 
Warte	Movlw	D'16'
		movwf 	cycl_2
 
Warte1	nop
 		nop
		nop
 		decfsz 	cycl_2, 1
 		goto	Warte1
		return
 
;***********************************************************************
; 1/2 bit Zeitverzögerung
; dieses Timing ist nicht ganz so Kritisch (25%)
;
; 						4 MHz	10 MHz
; 2400 Bps = 416T =		63D		157D
; 4800 Bps =			31D		 78D
; 9600 Bps = 			15D		 39D
;
Pause	Movlw	D'15'
		Movwf	Temp
 
Pause2	decfsz	Temp, f
		goto	Pause2
		return
 
;***********************************************************************
 
		end
ggf. kann es ja auf dieses Problem angewendet und modiviziert werden. bei bedarf lase ich auch die ASM, HEX hoch.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Emulator-Programm

Beitrag von mschnell »

Gar nicht empfehlenswert :(
- Nicht Prozessor-unabhängig
- Nicht Betriebssystem-unabhängig
- Hält am Betriebssystem vorbei den Prozess mit einer Warteschleife an und blockiert den ganzen Rechner

So was geht heute überhaupt nicht mehr.

-Michael

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Emulator-Programm

Beitrag von Maik81ftl »

mschnell hat geschrieben:Gar nicht empfehlenswert :(
- Nicht Prozessor-unabhängig
- Nicht Betriebssystem-unabhängig
- Hält am Betriebssystem vorbei den Prozess mit einer Warteschleife an und blockiert den ganzen Rechner

So was geht heute überhaupt nicht mehr.

-Michael
geht hier ja eher nur um das Grundprinzip.

Ist sowieso nur ein Theoreisches Beispiel aus der Berufsschule.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Antworten