|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 12.10.2006, 09:36 Titel: |
|
|
pebisoft 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 )
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 |
|
|
terminate
Anmeldungsdatum: 12.09.2006 Beiträge: 56
|
Verfasst am: 12.10.2006, 11:05 Titel: |
|
|
@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 |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 12.10.2006, 14:15 Titel: |
|
|
@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 |
|
|
terminate
Anmeldungsdatum: 12.09.2006 Beiträge: 56
|
Verfasst am: 12.10.2006, 15:29 Titel: |
|
|
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" |
|
Nach oben |
|
|
pebisoft gesperrt
Anmeldungsdatum: 28.11.2004 Beiträge: 131
|
Verfasst am: 12.10.2006, 17:59 Titel: |
|
|
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 |
|
|
pebisoft gesperrt
Anmeldungsdatum: 28.11.2004 Beiträge: 131
|
Verfasst am: 12.10.2006, 18:07 Titel: |
|
|
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 |
|
|
pebisoft gesperrt
Anmeldungsdatum: 28.11.2004 Beiträge: 131
|
Verfasst am: 12.10.2006, 18:21 Titel: |
|
|
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 |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 12.10.2006, 18:48 Titel: |
|
|
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 |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 12.10.2006, 22:00 Titel: |
|
|
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 _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
terminate
Anmeldungsdatum: 12.09.2006 Beiträge: 56
|
Verfasst am: 12.10.2006, 23:06 Titel: |
|
|
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 |
|
|
pebisoft gesperrt
Anmeldungsdatum: 28.11.2004 Beiträge: 131
|
Verfasst am: 13.10.2006, 09:55 Titel: |
|
|
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 |
|
|
pebisoft gesperrt
Anmeldungsdatum: 28.11.2004 Beiträge: 131
|
Verfasst am: 13.10.2006, 10:23 Titel: |
|
|
Zitat: |
Also gut, Marc Vitri der Autor von MVCOM, (purebasic serial port library), hat geantwortet:
|
juup, alles ok. ich danke dir.
mfg |
|
Nach oben |
|
|
terminate
Anmeldungsdatum: 12.09.2006 Beiträge: 56
|
Verfasst am: 13.10.2006, 11:48 Titel: |
|
|
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 |
|
|
pebisoft gesperrt
Anmeldungsdatum: 28.11.2004 Beiträge: 131
|
Verfasst am: 13.10.2006, 13:02 Titel: |
|
|
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 |
|
|
Michael Frey
Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 14.10.2006, 14:42 Titel: |
|
|
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 .
Ich vermute mal einen Tippfehler
Ü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 |
|
|
terminate
Anmeldungsdatum: 12.09.2006 Beiträge: 56
|
Verfasst am: 14.10.2006, 19:56 Titel: |
|
|
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 .
Ich vermute mal einen Tippfehler
|
Voll erwischt! |
|
Nach oben |
|
|
terminate
Anmeldungsdatum: 12.09.2006 Beiträge: 56
|
Verfasst am: 16.10.2006, 17:14 Titel: Open Com RB/TB; Open Com Library win32 |
|
|
@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 )
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 |
|
|
pebisoft gesperrt
Anmeldungsdatum: 28.11.2004 Beiträge: 131
|
Verfasst am: 16.10.2006, 20:49 Titel: |
|
|
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 |
|
|
terminate
Anmeldungsdatum: 12.09.2006 Beiträge: 56
|
Verfasst am: 16.10.2006, 21:00 Titel: |
|
|
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 |
|
|
pebisoft gesperrt
Anmeldungsdatum: 28.11.2004 Beiträge: 131
|
Verfasst am: 16.10.2006, 22:58 Titel: |
|
|
ich bin noch mit der gameboycam am testen .
danke für deine grosse hilfe und deine testreihe.
mfg |
|
Nach oben |
|
|
|
|
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.
|
|