Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

erstellte dll von purebasic mit freebasic ansprechen
Gehe zu Seite Zurück  1, 2, 3, 4  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1875
Wohnort: D59192

BeitragVerfasst am: 12.10.2006, 09:36    Titel: Antworten mit Zitat

pebisoft mit dem Kopf durch die Mauer wollen hat Folgendes geschrieben:
wenn es die buffereinstellung gibt, so muss es doch eine lösung geben den buffer grösser als 4096 zu setzen. da freebasic erst in den kinderschuhen mit 0.17, ist doch für den programmierer von freebasic ein leichtes, dieses mit reinzunehmen.
wende dich an M$,
da das kein Problem von freeBASIC ist,
aber das hab ich dir ja schon mehrfach geschrieben.

Es würde keiner(?) auf die Idee kommen den Tastaturbuffer auf 16KByte zu erhöhen weil er darin seinen ganzen Text speichern will!

pebisoft hat Folgendes geschrieben:
woher hast du denn gewusst, das gerade in dem augenblick , wo du ein neues byte einlesen möchtest dieses byte bei freebasic-com anliegt?
entweder schaut man mit LOC (#1) nach wieviel Byte im Buffer sind oder man wartet mit INPUT (1,#1) bis ein Byte da ist (einfach oder cool )
pebisoft hat Folgendes geschrieben:
so einfach geht es nicht. du müsste dann erst wieder ein abfrage der com machen ob ein neues byte anliegt, das kostet zeit.
doch ganz einfach, und kostet keine 8 Sekunden.
Aber das habe ich dir ja auch schon hier vorgeschlagen:
http://forum.qbasic.at/viewtopic.php?p=40887#40887
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
terminate



Anmeldungsdatum: 12.09.2006
Beiträge: 56

BeitragVerfasst am: 12.10.2006, 11:05    Titel: Antworten mit Zitat

@pebisoft

Jetzt mal unabhängig davon, ob die Art wie du den Com Port nutzen willst, mehr oder weniger sinnvoll ist, habe ich Marc Vitry dem Autor von MVCOM jetzt eine Mail geschrieben und ihn gefragt wie seine Library den Input Buffer verwaltet. Sollte sich heraustellen, dass er dafür keine eigene Routine benutzt sondern nur die Länge des Input Buffers an das Betriebssystem weitergibt, werde ich gerne einen entsprechenden Bug Report im offiziellen Freebasic Forum posten.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1875
Wohnort: D59192

BeitragVerfasst am: 12.10.2006, 14:15    Titel: Antworten mit Zitat

@terminate, kleiner Hinweis dazu auf die FBWiki:
http://www.freebasic.net/wiki/wikka.php?wakka=KeyPgOpenCom
FBWiki hat Folgendes geschrieben:
...
TBn Set the "Transmit Buffer" size (n>=0), 0 = default, depends on platform
RBn Set the "Receive Buffer" size (n>=0), 0 = default, depends on platform
...

(sagt aber leider nichts über die maximale Größe?)
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
terminate



Anmeldungsdatum: 12.09.2006
Beiträge: 56

BeitragVerfasst am: 12.10.2006, 15:29    Titel: Antworten mit Zitat

FBWiki hat Folgendes geschrieben:
...
TBn Set the "Transmit Buffer" size (n>=0), 0 = default, depends on platform
RBn Set the "Receive Buffer" size (n>=0), 0 = default, depends on platform
...


Ja habe ich gesehen, aber so interpretiert, dass nur die Default Größe der Buffer vom Betriebssystem abhängig ist.

Zitat:
(sagt aber leider nichts über die maximale Größe?)


Na ja, könnte man ja mal auf www.freebasic.net anfragen, pebisoft hat das ja auch versucht, leider hat er die 'Frage' etwas unglücklich und minimalistisch formuliert, so dass es nicht dazu gereicht hat die Aufmerksamkeit der Developer auf sich zu ziehen.

http://www.freebasic.net/forum/viewtopic.php?p=50672#50672

@pebisoft
Also auf gehts! Da gibt es ne prima Editfunktion auf www.freebasic.net/forum, ändere erst mal das subject, formuliere die Frage neu und mach einen Post damit der Thread wieder auf der ersten Seite landet. Mein Bruder wollte übrigens nur behilflich sein:

http://www.freebasic.net/forum/viewtopic.php?p=50680#50680

sah dann aber so aus als ob du das Interesse an dem Thread verloren hättest.

Wenns mit dem Englischen nicht so klappt können wir gerne behilflich sein.

Die Frage kann natürlich nur allgemein formuliert werden, ist ein bisschen schwierig von einem Bug zu sprechen, wenn man gar nicht weiß was die Developer bei Open Com eigentlich im Sinn hatten. Da gehts vielleicht eher um einen Featurerequest:
"Ich hätte gerne, dass die Open Com Funktion einen eigenen Buffer bekommt der vom OS unabhängig ist, ...., damit mein Gameboycam Programm auch unter FreeBASIC läuft" mit den Augen rollen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
pebisoft
gesperrt


Anmeldungsdatum: 28.11.2004
Beiträge: 131

BeitragVerfasst am: 12.10.2006, 17:59    Titel: Antworten mit Zitat

wie ich vorn geschrieben habe, das baby ist noch klein 0.17 , es kann nur durch uns gesund aufwachsen, sonst bleibt es ein englischer gartenzwerg.

mfg
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
pebisoft
gesperrt


Anmeldungsdatum: 28.11.2004
Beiträge: 131

BeitragVerfasst am: 12.10.2006, 18:07    Titel: Antworten mit Zitat

Zitat:

...doch ganz einfach, und kostet keine 8 Sekunden.... eben doch.....haha...

meinst du die übertragungszeit der 16000byte wird kürzer, wenn ich die bytes einzeln abfrage anstatt in einem buffer, da machst du einen gedankenfehler. die übertragungszeit pro bit bleibt immer konstand, wenn ich die baurate festlege, oder..... und mit dem bild kann ich erst etwas anfangen und die hindernisse auswerten wenn es komplett bereit steht.

mfg


Zuletzt bearbeitet von pebisoft am 12.10.2006, 18:24, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
pebisoft
gesperrt


Anmeldungsdatum: 28.11.2004
Beiträge: 131

BeitragVerfasst am: 12.10.2006, 18:21    Titel: Antworten mit Zitat

Zitat:

dass da 16kilobyte schon in so einer rasend schnellen geschwindigkeit verarbeitet werden müssen.


natürlich, ich muss ja die pixel auswerten, wo sich ein hindernis befindet und das geht nur wenn das bild komplett vorhanden ist, da will ich keine zeit verschwenden mit einzelnen bytefiselei.

ihr befasst euch nur mit den einfachen dingen, aber mit bildübertragung usw. wurde hier im forum noch nichts gemacht, ist halt etwas anderes.


aber es klappt ja jetzt wunderbar mit meiner eigenen erstellten com-dll und irgendwann in den nächsten wochen. wenn 0.18 herauskommt kann ich es vielleicht mit freebasic allein machen.


also freebasic ist gar nicht so übel in der jungen blüte.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1875
Wohnort: D59192

BeitragVerfasst am: 12.10.2006, 18:48    Titel: Antworten mit Zitat

Amen
( So soll es geschehen! )
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 12.10.2006, 22:00    Titel: Antworten mit Zitat

richtig, du hast es erkannt. WIR sind alle die n00bs!!! So sei es! Übrigens: Wir sind keine n00bs im Editieren, denn über deinene eigenen beiträgen gibt es einen edit-button, mit dem du dreifach-posts bequem zu einem einzelnen zusammenfügen kannst Zunge rausstrecken
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
terminate



Anmeldungsdatum: 12.09.2006
Beiträge: 56

BeitragVerfasst am: 12.10.2006, 23:06    Titel: Antworten mit Zitat

Also gut, Marc Vitri der Autor von MVCOM, (purebasic serial port library), hat geantwortet:
Zitat:

Hi,

I'm not familar with FreeBasic but I can Help you about MVCOM library for PureBasic.

All MVCOM functions use Win32 API functions without any callback and particular process for the transmit and receive buffers. So the values of Input and Output buffers are send to the system.

The problem may be produced by a limitation of FreeBasic...

To help you more, please send me a sample code in FreeBasic and the equivalent in PureBasic

Regards

Marc


Ok, dann werde ich jetzt mal ein kleines Testprogramm schreiben um einen möglichen Bug in freebasic Open Com darstellbar und nachvollziehbar zu machen, (zwei Rechner, serielles Kabel und so was).
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
pebisoft
gesperrt


Anmeldungsdatum: 28.11.2004
Beiträge: 131

BeitragVerfasst am: 13.10.2006, 09:55    Titel: Antworten mit Zitat

nicht schmollen, da ich sehr tief in der materie mit dem avr-proggen drinstecke ist es halt mein thema pc und avr zusammen arbeiten zulassen, sei es mit funk-seriell/bilderdaten und steuerungsdaten, funk-video, videocapturedarstellung mit hinderniserkennung oder auch sogar bilder im fbas-formt mit dem avr darzustellen. datenübertragung über funk als wave usw. weil der videofunk auch eine tonübertragung hat, kann man sehr schön realisieren.

ich habe auch festgestellt, das sich die grafik in freebasic einfacher und schneller realisieren lässt als in pure, auch die datenumsetzung bis zum sichtbaren screen ist super schnell bei freebasic.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
pebisoft
gesperrt


Anmeldungsdatum: 28.11.2004
Beiträge: 131

BeitragVerfasst am: 13.10.2006, 10:23    Titel: Antworten mit Zitat

Zitat:

Also gut, Marc Vitri der Autor von MVCOM, (purebasic serial port library), hat geantwortet:


juup, alles ok. ich danke dir.

mfg
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
terminate



Anmeldungsdatum: 12.09.2006
Beiträge: 56

BeitragVerfasst am: 13.10.2006, 11:48    Titel: Antworten mit Zitat

pebisoft hat Folgendes geschrieben:
Zitat:

Also gut, Marc Vitri der Autor von MVCOM, (purebasic serial port library), hat geantwortet:


juup, alles ok. ich danke dir.

mfg


Schon ok, trotzdem ganz locker bleiben! Du hast festgestellt, dass sich Open Com unter Freebasic anders verhält als unter Purebasic, ok, das bezweifelt auch keiner, (wie gesagt ich werde da noch ein paar Tests machen heute nachmittag oder morgen früh). Aber in der Beziehung gibt es noch mehr Unterschiede zwischen freebasic und purebasic z.B. das Filelen statement:

Unter freebasic bringt:
filelen("c:\pagefilesys")
immer 0.

Unter purebasic zeigt:
FileSize("c:\pagefile.sys")
die korrekte Größe des Pagefiles an.

Ein Bug?
Nein eigentlich nicht, des Rätsels Lösung:
Freebasic verwendet zum auslesen der Filelänge fseeko64/ftello64 absolut korrekt unter den meisten Betriebsystemen, leider funktioniert das nicht mit manchen Systemdateien unter Windows, dazu braucht man nämlich die Win32 API Funktion:
FindFirstFile/WIN32_FIND_DATA

Das ist auch den Freebasic Entwicklern bekannt, trotzdem glaube ich nicht dass sich daran was ändern wird, (Kompatibilität und Geschwindigkeit).
Wer will muß eben FindFirstFile/WIN32_FIND_DATA unter freebasic verwenden um die Attribute von pagefile.sys und hyberfil.sys auszulesen, eventuell kommt ja auch mal eine entsprechendes Funktionskürzel in windows.bi oder vbcompat.bi dazu.

Und so ist es auch bei der Open Com Funktion, wenn dazu unter Freebasic auch win32 api Aufrufe verwendet werden, liegt möglicherweise ein Bug vor, (kein Thema ist dann in 4 Tagen in der nächsten CVS Version gefixt).
Falls aber nicht, dann muß man sich eben eine eigene Library schreiben genau wie MVCOM, scheint ja nicht so schwierig zu sein, da nur win32 api Aufrufe verwendet werden wie Marc Vitri geschrieben hat.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
pebisoft
gesperrt


Anmeldungsdatum: 28.11.2004
Beiträge: 131

BeitragVerfasst am: 13.10.2006, 13:02    Titel: Antworten mit Zitat

schau mal hier am 11.10 20.44 uhr da ich hatte mal was reingestellt , es ist ein freies programm ohne die mvcom.

mfg

ps: ich habe keine probleme damit eine eigene erstellte dll in delphi/pure oder einer anderen sprache zu benutzen. ich finde die dll schön hilfreich.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 14.10.2006, 14:42    Titel: Antworten mit Zitat

terminate hat Folgendes geschrieben:
Unter freebasic bringt:
filelen("c:\pagefilesys")
immer 0.

Unter purebasic zeigt:
FileSize("c:\pagefile.sys")
die korrekte Größe des Pagefiles an.

Fairer Vergleich durchgeknallt .
Ich vermute mal einen Tippfehler zwinkern

Übrigens:
@pebisoft
Melde deinen "Bug" bitte ausführlich auf Sourceforge.
Die Entwickler lesen Reports dort öfter und genauer als einen Eintrag im Forum.
_________________
http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
terminate



Anmeldungsdatum: 12.09.2006
Beiträge: 56

BeitragVerfasst am: 14.10.2006, 19:56    Titel: Antworten mit Zitat

Michael Frey hat Folgendes geschrieben:
terminate hat Folgendes geschrieben:
Unter freebasic bringt:
filelen("c:\pagefilesys")
immer 0.

Unter purebasic zeigt:
FileSize("c:\pagefile.sys")
die korrekte Größe des Pagefiles an.

Fairer Vergleich durchgeknallt .
Ich vermute mal einen Tippfehler zwinkern


Voll erwischt!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
terminate



Anmeldungsdatum: 12.09.2006
Beiträge: 56

BeitragVerfasst am: 16.10.2006, 17:14    Titel: Open Com RB/TB; Open Com Library win32 Antworten mit Zitat

@pebisoft
Also ich hab mich jetzt nochmal mit dem Thema beschäftigt und kann dein Problem mit der Größe des COM Port Empfangsbuffers (RB) nachvollziehen.

Eines vorne weg, ich finde die Methode wie du deine Gameboycam ausliest nicht besonders ideal, aber egal, es müßte dennoch funktionieren.

Die maximale Größe des Receivebuffers (RB) wird vom COM Port Treiber vorgegeben, kann man auslesen unter Win32 mit GetCommProperties() , (Beispiel unten), wenn da null drinsteht, heißt das, es gibt keine Größenbeschränkung. Ich habe mehrere serielle Schnittstellen getestet und keine einzige davon hatte eine Größenbeschränkung.
Allderdings scheinen die meisten Treiber bzw. Betriebssysteme als Standardgröße für den COM Empfangsbuffer 4096 zu verwenden, aber das hast du ja schon herausgefunden.

So wie ich das sehe ignoriert Freebasic den Parameter RB einfach, das liegt entweder an der Art der Implementierung, (gewollt / nicht vermeidbar), oder ist ein schlichter Bug, (Versehen).

Einiges spricht dafür, dass es an der Art der Implementierung liegt, ich habe vor kurzem ein Freebasic CVS kompiliert und bei der Gelegenheit auch einen Blick in den Quellcode geworfen, soweit ich das gesehen habe, verwendet Freebasic für den COM Port keine direkten winapi32 Aufrufe, sondern Funktionen, wie man sie etwa aus der stdio.h, io.h etc. kennt, (hab natürlich keine Ahnung, was dagegen spricht, dass es deswegen nicht trotzdem funktioniert).

Für einen Bug spricht, dass es sehr leicht ist, die COM Buffereinstellungen an der falschen Stelle im Quellcode vorzunehmen, zumindest unter der winapi32 muß die Buffereinstellung direkt nach dem Öffnen des COM Ports mit 'CreatFile' vorgenommen werden, zu jedem späteren Zeitpunkt wirkt die Einstellung nicht mehr und es wird die Standardeinstellung verwendet, (4096).

Ich hab jetzt drei Testprogramme geschrieben, mit denen man, (hoffentlich), zeigen kann, dass es prinzipiell möglich ist, den RB in der von dir gewünschten Weise zu verwenden, obwohl das mit den Standard Freebasic Funktionen so nicht funktioniert, (mit etwas winapi32 Bastelei dann aber schon):

com_receive_test.bas Programm um Daten über den seriellen Port zu empfangen

com_send_test.bas Programm um Daten über den seriellen Port zu senden.

com_port_lib_winapi32.bas Eine Art simple COM Port 'Library', (in Form eines Testprogramms und ohne .bi file), die zum ansprechen des COM Ports winapi32 Funktionen verwendet.


Test:
Man benötigt entweder einen Rechner mit zwei seriellen Schnittstellen, (bei mir COM4 und COM1), oder zwei Rechner mit jeweils einer seriellen Schnittstelle. Die beiden Schnittstellen werden mit einem (Crossover, Nullmoden was auch immer ...), Kabel verbunden, Hauptsache man kann hinterher zwei Hyperterminal Sitzungen aufmachen und testen, dass die beiden Schnittstellen korrekt miteinander kommunizieren, (danach Hyperterminals wieder schließen).

Zum testen startet man zuerst das jeweils empfangende Freebasic Programm, (nicht vergessen COM Port Nummer im Quellcode richtig einstellen, nicht jeder hat COM4 oder COM1).

1. com_receive_test.exe starten.

2. Warten bis "Any key to receive data" angezeigt wird.
(Empfangende COM Schnittstelle wird geöffnet, es erfolgt aber noch kein Zugriff auf die Schnittstelle)

3. com_send_test.exe starten.

4. Warten bis "Finished sending data!" ... "Press any key to exit test app" angezeigt wird, (kann einige Sekunden dauern bis der Timeout erreicht ist).
(Es wird ein 16000 Bytes großes Testmuster erzeugt, angezeigt und dann gesendet, da das empfangende Programm noch keinerlei Anstalten unternimmt um irgendwelche Daten auszulesen, müssen die gesendeten Daten zwangweise im Empfangsbuffer der anderen Schnittstelle landen oder im Nirvana verschwinden).

5. com_send_test.exe durch Tastendruck beenden.
(com_send_test.exe kann jetzt aktiv keine Daten mehr senden, alles was jetzt noch empfangen werden kann, muss sich entweder im Empfangsbuffer von com_receive_test.exe oder im Sendepuffer von com_send_test.exe befinden, (der Sendepuffer wäre natürlich eine mögliche Fehlerquelle, aber die Geschwindigkeit des Auslesevorgangs weist darauf hin, dass der Sendepuffer zu diesem Zeitpunkt nicht mehr aktiv, bzw vorher auf einen Wert < 16000 eingestellt war. EDIT: Wer sicher gehen will kann auch einfach das Verbindungskabel abziehen))).

6. Jetzt den Datenempfang von com_receive_test.exe durch Tastendruck starten.
(Die Daten im Empfangsbuffer werden ausgelesen und angezeigt, jetzt heißt es Farbe bekennen)

Egal welche Werte ich für TB und RB eingestellt habe, com_receive_test.exe hat von den gesendeten Bytes immer nur maximal 3184 bis 4096 Bytes empfangen.
Allerdings klappt der Empfang, wenn man statt Freebasics Open Com winapi32 Funktionen verwendet, (die ja sogesehen auch schon in der "windows.bi" von Freebasic enthalten sind zwinkern)

7. Test wiederholen diesmal aber zum empfangen com_port_lib_winapi32.exe anstatt com_receive_test.exe verwenden.
(Jetzt werden (hoffentlich) alle 16000 Bytes empfangen, (je nachdem was man vorher getestet hat, bekommt man beim ersten Start evt. auch noch ein paar Bytes von den vorherigen Experimenten eingelesen)

com_receive_test.bas
Code:

dim as long com_port_handle
dim as string com_str_port,com_str_settings,com_str_complete,buf_receive_pat
dim read_char as string *1
   
com_str_port="com4"
com_str_settings="9600,N,8,1,CS0,DS0,TB32000,RB32000"

print "opening com port " & com_str_port
com_str_complete=com_str_port & ":" & com_str_settings
print com_str_complete
com_port_handle=freefile

print "com_port_handle: " & com_port_handle

Open Com com_str_complete As #com_port_handle
print "com port " & com_str_port & " opened"
print

print "Any key to receive data"
sleep

print "Receive data via port " & com_str_port
print

DO UNTIL LOC(com_port_handle) = LOF(com_port_handle)
    get #com_port_handle,,read_char
    buf_receive_pat=buf_receive_pat+read_char
loop

print "Received data: "
print
print buf_receive_pat
print
print "len(buf_receive_pat): " & len(buf_receive_pat)
print

print "Closing " & com_str_port
close com_port_handle
print com_str_port & " closed"
print

print "Any key to exit"
sleep

com_send_test.bas
Code:

declare function com_port_test(byval send_data_size as long,byref com_str_port as string, byref com_str_settings as string) as integer
declare function add_trail_str (byval l_number as long,byval l_final_len as long,byval s_lead_string as string) as string

'*************************************
dim as long send_data_size
dim as string com_str_port,com_str_settings
   
com_str_port="com1"
com_str_settings="9600,N,8,1,CS0,DS0,TB1,RB1"

    'Amount of bytes to send, (must be a multiple of 8 for this test)
    send_data_size=16000
   
    com_port_test(send_data_size,com_str_port,com_str_settings)

print "Press any key to exit test app"
sleep
end

'*************************************
function com_port_test(byval send_data_size as long,byref com_str_port as string, byref com_str_settings as string) as integer
dim as integer com_port_handle
dim as long i,h,len_buf_send
dim as string buf_send_pat,com_str_complete

'*************************************
'generate a numbered, (human readable), data pattern to send
for i= 8 to send_data_size step 8
buf_send_pat=buf_send_pat+ add_trail_str(i,8,":00000000")
next i

print "buf_send_pat: "
print
print buf_send_pat
print
len_buf_send =len(buf_send_pat)
print "len_buf_send: " & len_buf_send
print


print "Opening " & com_str_port
com_str_complete=com_str_port & ":" & com_str_settings
print com_str_complete
com_port_handle=freefile
Open Com com_str_complete As #com_port_handle
print com_str_port & " opened"
print

print "Sending data via " & com_str_port & ", please wait until its finished/timeout!"
put #com_port_handle,,buf_send_pat
print "Finished sending data!"
print

print "Closing " & com_str_port
close com_port_handle
print com_str_port & " closed"
print

return 0
end function

'*************************************
function add_trail_str (byval l_number as long,byval l_final_len as long,byval s_lead_string as string) as string
dim as string s_number,s_lead_string_tmp
dim as long l_number_len,i,h

s_lead_string_tmp=s_lead_string

s_number=str(l_number)
l_number_len=len(s_number)

if l_number_len<l_final_len then

    if len(s_lead_string_tmp)=1 then
        s_number=string(l_final_len-l_number_len,asc(s_lead_string_tmp))+s_number
        return s_number
    else
        if len(s_lead_string_tmp)<l_final_len then
            h=(l_final_len/len(s_lead_string_tmp))+1
            for i = 1 to h
                s_lead_string_tmp=s_lead_string_tmp+s_lead_string_tmp
            next i
        endif   
       
        s_number=left(s_lead_string_tmp,l_final_len-l_number_len)+s_number
        return s_number
    endif
endif
return s_number

end function

com_port_lib_winapi32.bas
Code:

#include once "windows.bi"

type t_com_CreateFile
    com_pz_filename as zstring ptr
    com_DesiredAccess as dword
    com_ShareMode as dword
    com_p_SecurityAttributes as LPSECURITY_ATTRIBUTES
    com_CreationDisposition as dword
    com_FlagsAndAttributes as dword
    com_TemplateFile as HANDLE
end type

type t_com_my_COMMPROP
    com_cur_baudrate as zstring * 100
    com_provider_type as zstring * 100
    com_tx_max_buffer_size as uinteger
    com_rx_max_buffer_size as uinteger
    com_tx_buffer_size as uinteger
    com_rx_buffer_size as uinteger
    get_com_driver_props_success as integer
end type

'*************************************
'Public
declare function open_com_winapi32(byval com_port_num as integer, byref com_settings_std as string,byval com_input_buf_size as uinteger=0,byval com_output_buf_size as uinteger=0,byval com_timeout as integer=100,byref error_list as string)as any ptr
declare function close_com_winapi32(byval com_handle as any ptr) as integer
declare function com_read_winapi32 (byval com_handle as any ptr,byval com_p_Buffer as any ptr,byval com_NumberOfBytesToRead as uinteger,byref com_NumberOfBytesRead as uinteger =0) as integer
declare function com_write_winapi32 (byval com_handle as any ptr,byval com_p_Buffer as any ptr,byval com_NumberOfBytesToWrite as uinteger,byref com_NumberOfBytesWritten as uinteger =0) as integer
declare function get_com_driver_props_winapi32 (byval com_handle as any ptr, byref com_my_COMMPROP as t_com_my_COMMPROP)as integer
declare function get_cur_com_device_setting_winapi32(byval com_handle as any ptr,byval com_p_dcb as DCB ptr) as integer
declare function set_cur_com_device_setting_winapi32(byval com_handle as any ptr,byval com_p_dcb as DCB ptr) as integer

'Private
declare function com_create_file(byref com_filename as string) as HANDLE
declare function com_clear_com_err(byval com_handle as any ptr, byref com_clear_com_err_Errors as long=0)as integer
declare function com_clearbuffers (byval com_handle as any ptr, byval rb as integer=1, byval tb as integer=1)as integer
declare function com_set_buffersize(byval com_handle as any ptr,byval com_input_buf_size as dword,byval com_output_buf_size as dword) as integer
declare function com_build_dcb(byref com_settings_def as string, byval com_p_dcb as DCB ptr) as integer
declare function com_SetTimeout(byval com_handle as any ptr,ByVal com_timeout As integer)as integer

'*************************************
'Examples
'*************************************
dim as integer ret_val, comport_num, com_timeout
dim as any ptr com_handle
dim as string com_settings_std, error_list
dim as uinteger com_input_buf_size, com_output_buf_size

'*************************************
'com_read_winapi32() example
'*************************************
dim as uinteger com_NumberOfBytesToRead, com_NumberOfBytesRead,num_all_bytes
dim as ubyte read_byte

'Initialize variables for open_com_winapi32()
comport_num=4
com_settings_std="baud=9600 parity=N data=8 stop=1"
'[baud=b][parity=p][data=d][stop=s][to={on|off}][xon={on|off}][odsr={on|off}][octs={on|off}][dtr={on|off|hs}][rts={on|off|hs|tg}][idsr={on|off}]
com_input_buf_size=32000
com_output_buf_size=0
com_timeout=250 '100-250 seems to be a good value
error_list="" 'open_com_winapi32 errors are stored here

'Open Com port, (get COM port free fileany ptr)
com_handle=open_com_winapi32(comport_num,com_settings_std,com_input_buf_size,com_output_buf_size,com_timeout,error_list)

if error_list <> "" then
    print
    print "error_list:"
    print error_list
endif
 

'Read bytes from COM port
print "Press any key to start reading from com" & comport_num
sleep

com_NumberOfBytesToRead=1
do
    com_read_winapi32 (com_handle,@read_byte,com_NumberOfBytesToRead,com_NumberOfBytesRead)
    if com_NumberOfBytesRead =0 then exit do
    print chr$(read_byte);
    num_all_bytes=num_all_bytes+1
loop

print
print "Bytes received: " & num_all_bytes

'Close COM port
close_com_winapi32(com_handle)

print
print "Reading finished, press any key to continue/exit"
sleep

''*************************************
''com_write_winapi32() example, uncomment to use
''*************************************
'print
'print "Now sending data, press keys, (ESC to exit)"
'dim as string write_char
'dim as uinteger com_NumberOfBytesToWrite,com_NumberOfBytesWritten
'
'com_handle=open_com_winapi32(comport_num,"baud=9600 parity=N data=8 stop=1",0,0,100,error_list)
'
'com_NumberOfBytesToWrite=1
'
'do
'
'write_char=inkey$
'com_write_winapi32 (com_handle,strptr(write_char),com_NumberOfBytesToWrite,com_NumberOfBytesWritten)
'
'if com_NumberOfBytesWritten>0 then print write_char;
'
'sleep 1
'loop until write_char=chr$(27)
'
'close_com_winapi32(com_handle)
'
''*************************************
''get_com_driver_props_winapi32() example, uncomment to use
''*************************************
'print
'print "Open com" & comport_num
'
'com_handle=open_com_winapi32(comport_num,"baud=9600 parity=N data=8 stop=1",10000,0,100,error_list)
'
'
'dim com_my_COMMPROP as t_com_my_COMMPROP
'get_com_driver_props_winapi32 (com_handle,com_my_COMMPROP)
'
'print "com_provider_type: " & com_my_COMMPROP.com_provider_type
'print "com_tx_buffer_size: " & com_my_COMMPROP.com_tx_buffer_size
'print "com_rx_buffer_size: " & com_my_COMMPROP.com_rx_buffer_size
''...
''...
'
'close_com_winapi32(com_handle)
'
'print
'print "Finished, press any key to continue/exit"
'
''*************************************
''get_cur_com_device_setting_winapi32() example, uncomment to use
''*************************************
'print
'print "Open com" & comport_num
'
'com_handle=open_com_winapi32(comport_num,"baud=9600 parity=N data=8 stop=1",10000,0,100,error_list)
'
'
'dim com_dcb as DCB
'get_cur_com_device_setting_winapi32(com_handle,@com_dcb)
'
'print "DWORD DCBlength;           (sizeof(DCB)): " & com_dcb.DCBlength
'print "DWORD BaudRate;            (current baud rate): " & com_dcb.BaudRate
'print "DWORD fBinary: 1;          (binary mode, no EOF check): " & com_dcb.fBinary
'print "DWORD fParity: 1;          (enable parity checking): " & com_dcb.fParity
'print "DWORD fOutxCtsFlow:1;      (CTS output flow control): " & com_dcb.fOutxCtsFlow
'print "DWORD fOutxDsrFlow:1;      (DSR output flow control): " & com_dcb.fOutxDsrFlow
'print "DWORD fDtrControl:2;       (DTR flow control type): " & com_dcb.fDtrControl
'print "DWORD fDsrSensitivity:1;   (DSR sensitivity): " & com_dcb.fDsrSensitivity
'print "DWORD fTXContinueOnXoff:1; (XOFF continues Tx): " & com_dcb.fTXContinueOnXoff
'print "DWORD fOutX: 1;            (XON / XOFF out flow control): " & com_dcb.fOutX
'print "DWORD fInX: 1;             (XON / XOFF in flow control): " & com_dcb.fInX
'print "DWORD fErrorChar: 1;       (enable error replacement): " & com_dcb.fErrorChar
'print "DWORD fNull: 1;            (enable null stripping): " & com_dcb.fNull
'print "DWORD fRtsControl:2;       (RTS flow control): " & com_dcb.fRtsControl
'print "DWORD fAbortOnError:1;     (abort reads / writes on error): " & com_dcb.fAbortOnError
'print "DWORD fDummy2:17;          (reserved): " & com_dcb.fDummy2
'print "WORD wReserved;            (not currently used): " & com_dcb.wReserved
'print "WORD XonLim;               (transmit XON threshold): " & com_dcb.XonLim
'print "WORD XoffLim;              (transmit XOFF threshold): " & com_dcb.XoffLim
'print "BYTE ByteSize;             (number of bits / byte, 4-8): " & com_dcb.ByteSize
'print "BYTE Parity;               (0-4=no,odd,even,mark,space): " & com_dcb.Parity
'print "BYTE StopBits;             (0,1,2 = 1, 1.5, 2): " & com_dcb.StopBits
'print "char XonChar;              (Tx and Rx XON character): " & com_dcb.XonChar
'print "char XoffChar;             (Tx and Rx XOFF character): " & com_dcb.XoffChar
'print "char ErrorChar;            (error replacement character): " & com_dcb.ErrorChar
'print "char EofChar;              (end of input character): " & com_dcb.EofChar
'print "char EvtChar;              (received event character): " & com_dcb.EvtChar
'print "WORD wReserved1;           (reserved; do not use): " & com_dcb.wReserved1
'
'close_com_winapi32(com_handle)
'
'print
'print "Finished, press any key to continue/exit"


sleep
end

'*************************************
public function open_com_winapi32(byval com_port_num as integer, byref com_settings_std as string,byval com_input_buf_size as uinteger=0,byval com_output_buf_size as uinteger=0,byval com_timeout as integer=100,byref error_list as string)as any ptr
'[baud=b][parity=p][data=d][stop=s][to={on|off}][xon={on|off}][odsr={on|off}][octs={on|off}][dtr={on|off|hs}][rts={on|off|hs|tg}][idsr={on|off}]
'baud=9600 parity=N data=8 stop=1

    dim as long com_clear_com_err_Errors
    dim as string com_settings_std_tmp,com_filename,open_com_error
    dim com_handle as any ptr
    dim com_dcb as dcb
   
    com_settings_std_tmp=com_settings_std
    com_filename="COM"+str(com_port_num)+chr$(0)

    com_handle=com_create_file(com_filename)
    if com_handle =-1 then
        error_list=error_list+"Failed_CreateFile,(open com port)"+chr$(13,10)
        exit function
    endif
   
    if com_set_buffersize(com_handle,com_input_buf_size,com_output_buf_size)=0 then
        error_list=error_list+"Failed_SetupComm,(buffersize)"+chr$(13,10)
    endif

    if com_settings_std<>"" then
        if com_build_dcb(com_settings_std_tmp,@com_dcb)=0 then
            error_list=error_list+"Failed_BuildCommDCB,(initialize com settings)"+chr$(13,10)
        endif

        if set_cur_com_device_setting_winapi32(com_handle,@com_dcb)=0 then
            error_list=error_list+"Failed_SetCommState,(activate com settings)"+chr$(13,10)
        endif

    endif

    if com_SetTimeout(com_handle,com_timeout)=0 then
        error_list=error_list+"Failed_SetCommTimeouts"+chr$(13,10)
    endif
   
    if com_clear_com_err(com_handle,com_clear_com_err_Errors)=0 then
        error_list=error_list+"Failed_ClearCommError"+chr$(13,10)
    endif     
   
    if com_clearbuffers(com_handle)=0 then
        error_list=error_list+"Failed_PurgeComm,(clear buffers)"+chr$(13,10)
    endif

    return com_handle
end function

'*************************************
public function close_com_winapi32(byval com_handle as any ptr) as integer
    dim com_handle_ret as integer

    if com_handle<>-1 then         
        com_handle_ret=CloseHandle(com_handle)
        com_handle=cptr(any ptr,-1) 'not to be suspicious
    endif

    return com_handle_ret
end function

'*************************************
public function com_read_winapi32 (byval com_handle as any ptr,byval com_p_Buffer as any ptr,byval com_NumberOfBytesToRead as uinteger,byref com_NumberOfBytesRead as uinteger =0) as integer

dim com_ReadFile_ret as integer
dim com_lpOverlapped as LPOVERLAPPED

com_ReadFile_ret=ReadFile(com_handle,_
                            com_p_Buffer,_
                            com_NumberOfBytesToRead,_
                            @com_NumberOfBytesRead,_
                            com_lpOverlapped)
return com_ReadFile_ret
end function

'*************************************
function com_write_winapi32 (byval com_handle as any ptr,byval com_p_Buffer as any ptr,byval com_NumberOfBytesToWrite as uinteger,byref com_NumberOfBytesWritten as uinteger =0) as integer
dim com_WriteFile_ret as integer
dim com_lpOverlapped as LPOVERLAPPED

com_WriteFile_ret=WriteFile(com_handle,_
                            com_p_Buffer,_
                            com_NumberOfBytesToWrite,_
                            @com_NumberOfBytesWritten,_
                            com_lpOverlapped)
return com_WriteFile_ret
end function

'*************************************
function com_SetTimeout(byval com_handle as any ptr,ByVal com_timeout As integer)as long
            Dim com_COMMTIMEOUTS as COMMTIMEOUTS
            If com_handle = -1 Then
                Exit function
            Else
                With com_COMMTIMEOUTS
                    .ReadIntervalTimeout = 0
                    .ReadTotalTimeoutMultiplier = 0
                    .ReadTotalTimeoutConstant = com_timeout
                    .WriteTotalTimeoutMultiplier = 10
                    .WriteTotalTimeoutConstant = 100
                End With
            return SetCommTimeouts(com_handle, @com_COMMTIMEOUTS)
            End If
return 0
End function

'*************************************
function com_build_dcb(byref com_settings_def as string, byval com_p_dcb as DCB ptr) as integer
    dim com_settings_def_tmp as string
    com_settings_def_tmp=com_settings_def
    return BuildCommDCB(strptr(com_settings_def_tmp),com_p_dcb)
end function

'*************************************
function set_cur_com_device_setting_winapi32(byval com_handle as any ptr,byval com_p_dcb as DCB ptr) as integer
    return SetCommState(com_handle,com_p_dcb)
end function

'*************************************
function get_cur_com_device_setting_winapi32(byval com_handle as any ptr,byval com_p_dcb as DCB ptr) as integer
    return GetCommState(com_handle,com_p_dcb)
end function

'*************************************
function com_set_buffersize(byval com_handle as any ptr,byval com_input_buf_size as dword,byval com_output_buf_size as dword) as integer
    return SetupComm(com_handle,com_input_buf_size,com_output_buf_size)
end function

'*************************************
function com_clear_com_err(byval com_handle as any ptr, byref com_clear_com_err_Errors as long=0)as integer
    dim struct_COMSTAT as COMSTAT
    return ClearCommError(com_handle,@com_clear_com_err_Errors,@struct_COMSTAT)
end function

'*************************************
function com_clearbuffers (byval com_handle as any ptr, byval rb as integer=1, byval tb as integer=1)as integer
    'PURGE_RXCLEAR=0x0008,PURGE_TXCLEAR=0x0004,PURGE_RXABORT=0x0002,PURGE_TXABORT=0x0001
    dim dwFlags as dword
    if rb=1 then dwFlags=PURGE_RXCLEAR
    if tb=1 then dwFlags=dwFlags or PURGE_TXCLEAR
    return PurgeComm(com_handle,dwFlags)
end function

'*************************************
function com_create_file(byref com_filename as string) as any ptr

    dim struct_com_CreateFile as t_com_CreateFile
    dim com_handle as any ptr
    dim as string com_filename_tmp

    com_filename_tmp=com_filename

    with struct_com_CreateFile
        .com_pz_filename=strptr(com_filename_tmp)
        .com_DesiredAccess=(GENERIC_READ or GENERIC_WRITE)
        .com_ShareMode=0
        .com_p_SecurityAttributes=0
        .com_CreationDisposition=(OPEN_EXISTING)'CREATE_NEW,CREATE_ALWAYS,OPEN_EXISTING,OPEN_ALWAYS,TRUNCATE_EXISTING
        .com_FlagsAndAttributes=FILE_ATTRIBUTE_NORMAL
        .com_TemplateFile=0
    end with

    com_handle = CreateFile(struct_com_CreateFile.com_pz_filename,_
                            struct_com_CreateFile.com_DesiredAccess,_
                            struct_com_CreateFile.com_ShareMode,_
                            struct_com_CreateFile.com_p_SecurityAttributes,_
                            struct_com_CreateFile.com_CreationDisposition,_
                            struct_com_CreateFile.com_FlagsAndAttributes,_
                            struct_com_CreateFile.com_TemplateFile)

    return com_handle
end function

'*************************************
public function get_com_driver_props_winapi32 (byval com_handle as any ptr, byref com_my_COMMPROP as t_com_my_COMMPROP)as integer
dim com_COMMPROP as COMMPROP

com_my_COMMPROP.get_com_driver_props_success=GetCommProperties(com_handle,@com_COMMPROP)

with com_my_COMMPROP
    select case com_COMMPROP.dwMaxBaud
        case BAUD_075
        .com_cur_baudrate="75"
        case BAUD_110
        .com_cur_baudrate="110"
        case BAUD_134_5
        .com_cur_baudrate="134.5"
        case BAUD_150
        .com_cur_baudrate="150"
        case BAUD_300
        .com_cur_baudrate="300"
        case BAUD_600
        .com_cur_baudrate="600"
        case BAUD_1200
        .com_cur_baudrate="1200"
        case BAUD_1800
        .com_cur_baudrate="1800"
        case BAUD_2400
        .com_cur_baudrate="2400"
        case BAUD_4800
        .com_cur_baudrate="4800"
        case BAUD_7200
        .com_cur_baudrate="7200"
        case BAUD_9600
        .com_cur_baudrate="9600"
        case BAUD_14400
        .com_cur_baudrate="14400"
        case BAUD_19200
        .com_cur_baudrate="19200"
        case BAUD_38400
        .com_cur_baudrate="38400"
        case BAUD_56K
        .com_cur_baudrate="56K"
        case BAUD_57600
        .com_cur_baudrate="57600"
        case BAUD_115200
        .com_cur_baudrate="115200"
        case BAUD_128K
        .com_cur_baudrate="128K"
        case BAUD_USER
        .com_cur_baudrate="BAUD_USER"
        case else
        .com_cur_baudrate="none"
    end select
end with

with com_my_COMMPROP
    '.wPacketLength       '// packet size, in bytes
    '.wPacketVersion      '// packet version
    '.dwServiceMask       '// services implemented
    '.dwReserved1         '// reserved
    .com_tx_max_buffer_size=com_COMMPROP.dwMaxTxQueue        '// max Tx bufsize, in bytes
    .com_rx_max_buffer_size=com_COMMPROP.dwMaxRxQueue        '// max Rx bufsize, in bytes
    '.dwMaxBaud)           '// max baud rate, in bps
    '.dwProvSubType      '// specific provider type
    '.dwProvCapabilities  '// capabilities supported
    '.dwSettableParams    '// changeable parameters
    '.dwSettableBaud      '// allowable baud rates
    '.wSettableData       '// allowable byte sizes
    '.wSettableStopParity '// stop bits/parity allowed
    .com_tx_buffer_size=com_COMMPROP.dwCurrentTxQueue    '// Tx buffer size, in bytes
    .com_rx_buffer_size=com_COMMPROP.dwCurrentRxQueue    '// Rx buffer size, in bytes
    '.dwProvSpec1         '// provider-specific data
    '.dwProvSpec2         '// provider-specific data
    '.wcProvChar[1]       '// provider-specific data
end with

with com_my_COMMPROP
    select case com_COMMPROP.dwProvSubType
        case PST_FAX
        .com_provider_type="FAX device"
        case PST_LAT
        .com_provider_type="LAT protocol"
        case PST_MODEM
        .com_provider_type="Modem device"
        case PST_NETWORK_BRIDGE
        .com_provider_type="Unspecified network bridge"
        case PST_PARALLELPORT
        .com_provider_type="Parallel port"
        case PST_RS232
        .com_provider_type="RS-232 serial port"
        case PST_RS422
        .com_provider_type="RS-422 port"
        case PST_RS423
        .com_provider_type="RS-423 port"
        case PST_RS449
        .com_provider_type="RS-449 port"
        case PST_SCANNER
        .com_provider_type="Scanner device"
        case PST_TCPIP_TELNET
        .com_provider_type="TCP/IP Telnet® protocol"
        case PST_UNSPECIFIED
        .com_provider_type="Unspecified"
        case PST_X25
        .com_provider_type="X.25 standards"
        case else
        .com_provider_type="none"
    end select
end with

return 0
end function
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
pebisoft
gesperrt


Anmeldungsdatum: 28.11.2004
Beiträge: 131

BeitragVerfasst am: 16.10.2006, 20:49    Titel: Antworten mit Zitat

Zitat:

Eines vorne weg, ich finde die Methode wie du deine Gameboycam ausliest nicht besonders ideal,



muss in einem zug gelesen werden und der roboter muss auch stehen bleiben. die camera kennt kein ende, wenn sie einmal startet, fängt sie immer wieder von vorne an das bild aufzubauen.

wenn ich den robby bewege, habe ich die schlierenbewegung drauf.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
terminate



Anmeldungsdatum: 12.09.2006
Beiträge: 56

BeitragVerfasst am: 16.10.2006, 21:00    Titel: Antworten mit Zitat

pebisoft hat Folgendes geschrieben:
Zitat:

Eines vorne weg, ich finde die Methode wie du deine Gameboycam ausliest nicht besonders ideal,



muss in einem zug gelesen werden und der roboter muss auch stehen bleiben. die camera kennt kein ende, wenn sie einmal startet, fängt sie immer wieder von vorne an das bild aufzubauen.

wenn ich den robby bewege, habe ich die schlierenbewegung drauf.


Aber den Rest meines Postings hast du schon auch gelesen, oder?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
pebisoft
gesperrt


Anmeldungsdatum: 28.11.2004
Beiträge: 131

BeitragVerfasst am: 16.10.2006, 22:58    Titel: Antworten mit Zitat

ich bin noch mit der gameboycam am testen .

danke für deine grosse hilfe und deine testreihe.

mfg
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite Zurück  1, 2, 3, 4  Weiter
Seite 3 von 4

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz