|
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 |
Dos5.0
Anmeldungsdatum: 07.12.2008 Beiträge: 30
|
Verfasst am: 07.12.2008, 19:02 Titel: Datenübertragung |
|
|
Hallo,
dies ist mein erster Beitrag in diesem Forum.
Ich würde gerne wissen, wie ich ein Datenübertragungsprogramm mit QBASIC realisieren kann. Ich möchte gerne Daten von meinem Dos 5.0 zu meinem XP über ein serielles Kabel am Com1 Port übertragen. Ich habe schon versucht einen kleinen "Textchat zu programmieren". Dies ging ohne Probleme. Doch nun weiß ich nicht mehr weiter. Bitte helft mir.
Johannes |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
|
Nach oben |
|
|
Dos5.0
Anmeldungsdatum: 07.12.2008 Beiträge: 30
|
Verfasst am: 07.12.2008, 23:24 Titel: |
|
|
Aber da steht wieder nur etwas über Textchat. Ich will aber eine Datei von einem Computer zum anderen schicken. Steht auch in meiner Frage. |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
|
Dos5.0
Anmeldungsdatum: 07.12.2008 Beiträge: 30
|
Verfasst am: 07.12.2008, 23:33 Titel: |
|
|
geht das nur bei text dateien? |
|
Nach oben |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
Verfasst am: 08.12.2008, 00:24 Titel: |
|
|
Jede Datei besteht physisch nur aus Bit-folgen. Diese können Zahlen darstellen (Dualsystem) oder Buchstaben (ASCII, Tabelle), ...
Code: | DEFINT A-Z
DIM Buffer AS STRING * 1 'Zeichenkette der Länge 1 (= 1 Zeichen)
OPEN "t1.fas" FOR BINARY AS #1 'Zu übertragende Datei öffnen
OPEN "COM2:9600,N,8,1,DS0,CS0,CD0,BIN" AS #2 'COM-Port Verbindung öffnen
DO UNTIL EOF(1) 'Wiederholen bis Ende der Datei erreicht
GET #1, , Buffer 'Nächstes Byte aus der Datei lesen
'und in den Buffer schreiben
IF NOT EOF(1) THEN 'Nur wenn das Dateiende noch nicht erreicht ist
PRINT #2,Buffer 'Dateien übertragen
END IF
LOOP
CLOSE
SYSTEM
|
Mit dem obigen Code wird eine Datei geöffnet und in der Schleife jedes Byte abgearbeitet. Es wird jedes Byte einzeln verschickt. Ob das versenden über den COM-Port funktioniert, weiß ich nicht. Ich habe schnell die Befehle von dreal's Seite kopiert. ggf musst du dann diese Befehle ändern ("PRINT #2, Buffer" zum Versenden, und "OPEN "COM2:9600,N,8,1,DS0,CS0,CD0,BIN" AS #2" zum Öffnen der Verbindung über den COM-Port 2) _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Zuletzt bearbeitet von St_W am 08.12.2008, 00:35, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Dos5.0
Anmeldungsdatum: 07.12.2008 Beiträge: 30
|
Verfasst am: 08.12.2008, 00:34 Titel: |
|
|
aber das empfangen ist doch ein problem |
|
Nach oben |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
Verfasst am: 08.12.2008, 00:53 Titel: |
|
|
Codebeispiel zum Senden:
Code: | DEFINT A-Z
DIM Buffer AS STRING * 1
DIM Groesse AS INTEGER
OPEN "t1.fas" FOR BINARY AS #1
OPEN "COM2:9600,N,8,1,DS0,CS0,CD0,BIN" FOR RANDOM AS #2
Groesse = LOF(1)
PRINT #2, CHR$(255) + CHR$(255) + CHR$(255)
PRINT #2, Groesse
PRINT #2, CHR$(255) + CHR$(255) + CHR$(255)
FOR q = 0 TO Groesse - 1
GET #1, , Buffer
PRINT #2, Buffer
NEXT
PRINT #2, CHR$(255) + CHR$(255) + CHR$(255)
CLOSE
SYSTEM |
Und zum Empfangen:
Code: | DEFINT A-Z
DIM Buffer AS STRING * 1
DIM Groesse AS INTEGER
OPEN "t1.fas" FOR BINARY AS #1
OPEN "COM2:9600,N,8,1,DS0,CS0,CD0,BIN" FOR RANDOM AS #2
tmp$ = INPUT$(3, #2)
IF tmp$ <> CHR$(255) + CHR$(255) + CHR$(255) THEN
PRINT "Fehler bei der Übertragung!"
CLOSE
SYSTEM
END IF
Groesse = CVI(INPUT$(2, #2))
tmp$ = INPUT$(3, #2)
IF tmp$ <> CHR$(255) + CHR$(255) + CHR$(255) THEN
PRINT "Fehler bei der Übertragung!"
CLOSE
SYSTEM
END IF
FOR q = 0 TO Groesse - 1
Buffer = INPUT$(1, #2)
PUT #1, , Buffer
NEXT
tmp$ = INPUT$(3, #2)
IF tmp$ <> CHR$(255) + CHR$(255) + CHR$(255) THEN
PRINT "Fehler bei der Übertragung!"
CLOSE
SYSTEM
END IF
CLOSE
SYSTEM |
Allereinfachste Form!! Bevor die eigentliche Datenübertragung beginnt, wird ein vordefinierter Wert versendet (in diesem Fall &HFFFFFF), dann die Größe der Datei als INTEGER (2 Bytes) und wieder dieser Prüfwert. Wenn der Prüfwert am Empfänger nicht so ankommt, wird eine Fehlermeldung ausgegeben und das Programm beendet. Andernfalls werden die Daten übertragen und wieder ein Prüfwert. Wenn dieser Prüfwert auch richtig empfangen wird (dies ist z.B. nicht der Fall wenn ein Teil der Datei nicht gesendet wird) ist die Übertragung komplett.
Übrigens keine Garantie auf Richtigkeit. Ich hatte keine Gelegenheit das Programm auszuprobieren, da ich auf meinem Laptop leider keinen COM-Port mehr habe und den USB->COM Adapter habe ich gerade nicht da. _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
|
Dos5.0
Anmeldungsdatum: 07.12.2008 Beiträge: 30
|
Verfasst am: 08.12.2008, 00:59 Titel: |
|
|
das probier ich mal aus. danke |
|
Nach oben |
|
|
Dos5.0
Anmeldungsdatum: 07.12.2008 Beiträge: 30
|
Verfasst am: 08.12.2008, 20:21 Titel: |
|
|
Leider hat es nicht funktioniert. Es kam jedes mal die Meldung "Fehler beim Übertragen!". Ich habe den Code mehrmals überprüft. |
|
Nach oben |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
Verfasst am: 08.12.2008, 21:44 Titel: |
|
|
Neuer Versuch meinerseits:
Code: | DEFINT A-Z
DIM Buffer AS STRING * 1
DIM Groesse AS INTEGER
OPEN "t1.fas" FOR BINARY AS #1
OPEN "COM2:9600,N,8,1,DS0,CS0,CD0,BIN" FOR RANDOM AS #2
DO
tmp$ = INPUT$(1, #2)
IF tmp$ = CHR$(255) THEN
tmp$ = INPUT$(1, #2)
IF tmp$ = CHR$(255) THEN
tmp$ = INPUT$(1, #2)
IF tmp$ = CHR$(255) THEN
EXIT DO
END IF
END IF
END IF
LOOP
Groesse = CVI(INPUT$(2, #2))
tmp$ = INPUT$(3, #2)
IF tmp$ <> CHR$(255) + CHR$(255) + CHR$(255) THEN
PRINT "Fehler bei der Übertragung!"
CLOSE
SYSTEM
END IF
PRINT "Dateigröße:"; Groesse
FOR q = 0 TO Groesse - 1
Buffer = INPUT$(1, #2)
PUT #1, , Buffer
IF (q \ (Groesse - 1)) <> ((q - 1) \ (Groesse - 1)) THEN
PRINT (q \ (Groesse - 1)); " %"
END IF
NEXT
tmp$ = INPUT$(3, #2)
IF tmp$ <> CHR$(255) + CHR$(255) + CHR$(255) THEN
PRINT "Fehler bei der Übertragung!"
CLOSE
SYSTEM
END IF
CLOSE
SYSTEM
|
Wie bereits erwähnt, konnte ich es leider nicht ausprobieren.
Du musst möglicherweise beim "OPEN"-Befehl den Com-Port ändern in den, den du verwendest (1 bis 4).
Weiters wird die Datei "T1.FAS" angelegt, die vorher nicht existieren sollte.
Zum Testen, ob die überhaupt Daten empfangen werden, kannst du folgenden Code probieren:
Code: | OPEN "COM2:9600,N,8,1,DS0,CS0,CD0,BIN" FOR RANDOM AS #2
DO
tmp$ = INPUT$(1, #2)
PRINT tmp$
LOOP
CLOSE
SYSTEM |
_________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 09.12.2008, 09:51 Titel: |
|
|
Nur soviel noch zum Thema zuverlässige Übermittlung: Ein wichtiges Muss ist noch die Implementierung eines CRCs für die Daten selber + ACK-Quittung mit Sequenznummer, dasselbe auch für die Daten.
Ich hatte früher einmal selber so etwas geschrieben, um vom einstigen Commodore Amiga 500 der komplette Festplatteninhalt in eine .HDF-Datei für WinUAE übertragen zu können (Datei war dort einfach ein "tar"-Datenstrom). Hatte übrigens damals PowerBasic eingesetzt, weil dies 115200 bps erlaubte.
Extra für Euch im Archiv etwas herumgewühlt (Empfängerseite für x86-PC):
http://beilagen.dreael.ch/QB/SERTRANS.BAS
http://beilagen.dreael.ch/QB/SERTRAN3.BAS
Sendeseite muss ich im Amiga-Emulator noch zu Hause suchen. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
Dos5.0
Anmeldungsdatum: 07.12.2008 Beiträge: 30
|
Verfasst am: 09.12.2008, 20:24 Titel: |
|
|
Also, gesendet wurde es. Ich habe es auch empfangen mit dem 2. Code. Aber bei dem 1.Code wird immernoch der Fehler angezeigt. Keine Ahnung wieso.
Es hat aufjedenfall den Text beim 2.Code angezeigt, den ich übertragen habe. Dann kann man ja den String einfach in einer Datei abspeichern.
Edit: Der Fehler ist warscheinlich: Beim 2.Code habe ich bemerkt, dass am Ende der Befehl SYSTEM/END nicht ausgeführt wird. Ich denke mal, das deswegen immer die Fehlermeldung kommt. |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 09.12.2008, 23:42 Titel: |
|
|
Inzwischen noch der Sendeteil herausgegraben:
http://beilagen.dreael.ch/QB/SERTRANS_2.BAS
http://beilagen.dreael.ch/QB/SERTRANS_3.BAS
Wie bereits gesagt wurde er auf einem Commodore Amiga entwickelt, seinerzeit unter Verwendung des BASIC-Dialekts MaxonBASIC. Sollte sich aber in weiten Teilen 1:1 für QB übernehmen lassen.
Damals arbeitete ich mit einer Named Pipe (dies hatte AmigaOS bereits!), wo der Tar-Befehl seine Daten hineinschrieb und das Sendeprogramm von dort diese Daten ausgelesen hat und mit dem bereits vorher erwähnten seriellen Protokoll übertragen hat. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
Dos5.0
Anmeldungsdatum: 07.12.2008 Beiträge: 30
|
Verfasst am: 28.12.2008, 17:17 Titel: |
|
|
Also ich habe es nun geschafft Dateien zu übertragen. Bloß hat der eine Computer sehr viel weniger Leistung als der andere. Anscheinend kommt es deswegen dazu, dass der langsamere Computer nicht mitkommt. Vom langsamen auf den schnellen zu übertragen funktioniert problemlos. Bloß umgekehrt halt nicht. Ich habe nun eine FOR...NEXT Schleife eingefügt. Funktioniert das nicht noch anders? Weil nun dauert es viel länger. Wenn ich die FOR...NEXT Schleife weglasse, bricht der langsamere Computer das Programm ab und zeigt den Fehler "Kommunikationspuffer Überlauf" an. Um den lansameren Computer handelt es sich um einen sehr alten DOS 5.0 Laptop und beim schnellen Computern um einen 4 Jahre alten Windows XP. Der Dos hat warscheinlich 1/2000 der Leistung des XP.
Sendeteil:
Code: |
DEFINT A-Z
DIM Buffer AS STRING * 1
DIM Groesse AS INTEGER
OPEN "t1.fas" FOR BINARY AS #1
OPEN "COM1:9600,N,8,1,DS0,CS0,CD0,BIN" FOR RANDOM AS #2
Groesse% = LOF(1)
PRINT Groesse% * 2 'Diese Zahl muss beim Empfangteil eingetragen werden
FOR q = 0 TO Groesse% - 1
GET #1, , Buffer
PRINT #2, Buffer
NEXT
CLOSE
CLOSE
END
|
Empfangsteil:
Code: |
OPEN "COM1:9600,N,8,1,DS0,CS0,CD0,BIN" FOR RANDOM AS #2
FOR i = 1 TO 200 '200 muss durch die Zahl die beim Sendeteil ausgegeben wird ersetzt werden
tmp$ = INPUT$(1, #2)
t$ = t$ + tmp$
NEXT
CLOSE
OPEN "DATEI.BAS" FOR OUTPUT AS #1
PRINT #1, t$
CLOSE
END
|
Anmerkung: Das Programm ist nicht grade Benutzerfreundlich |
|
Nach oben |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
Verfasst am: 28.12.2008, 17:33 Titel: |
|
|
Um das Programm etwas komfortabler zu machen, könntest du die DAteilänge an den Empfänger schicken, damit man diese nicht manuell im Programm ändern muss.
Mit der Funktion MKI$(Groesse) kannst du die Zahl in eine (bei Integer 2-Byte lange) Zeichenkette konvertieren, und im Empfängerteil mit CVI(Zeichenkette) wieder rückkonvertieren.
Die so ermittelte Dateigroesse verwendest du dann in der FOR-Schleife. _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
|
Dos5.0
Anmeldungsdatum: 07.12.2008 Beiträge: 30
|
Verfasst am: 28.12.2008, 17:44 Titel: |
|
|
Die Benutzerfreundlichkeit steht bei mir zurzeit an zweiter Stelle. Erstaml muss es richtig funktionieren. |
|
Nach oben |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
Verfasst am: 28.12.2008, 19:18 Titel: |
|
|
Dein Problem mit dem Buffer-Überlauf könntest du folgendermaßen lösen:
Zähle in der Schleife des Senders und Empfängers mit und nach einer bestimmten Anzahl an Übertragenen Bytes (etwas weniger als die eingestellte Buffergröße wäre sinnvoll) lass den Empfänger ein OK-Signal (definiere selbst ein Zeichen dafür(z.B. CHR$(0)) senden und den Empfänger warten, bis er dieses Signal erhält. Dies verlangsamt natürlich die Übertragung.
Wie du sicher schon weiß (--> QBX Hilfe) kann man mit RB[n] bzw. TB[n] die Größe des Sende-/Empfangsbuffers (Standardwert von 512Bytes) verändern und somit die Anzahl der nötigen Rückmeldungen des Empfängers verkleinern. _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
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.
|
|