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:

Datenübertragung

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Spezielle Fragen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Dos5.0



Anmeldungsdatum: 07.12.2008
Beiträge: 30

BeitragVerfasst am: 07.12.2008, 18:02    Titel: Datenübertragung Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 07.12.2008, 21:30    Titel: Antworten mit Zitat

Ohne viel Kommentar:

http://www.dreael.ch/Deutsch/BASIC-Knowhow-Ecke/SerielleKommunikation.html

=> am besten einmal von A bis Z durcharbeiten!
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dos5.0



Anmeldungsdatum: 07.12.2008
Beiträge: 30

BeitragVerfasst am: 07.12.2008, 22:24    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 07.12.2008, 22:28    Titel: Antworten mit Zitat

Hallo,

so wie du Text verschicken kannst, kannst du auch den Inhalt von Dateien verschicken. Dazu musst du die Datei zunächst öffnen und dann zeilen- oder blockweise einlesen und übertragen, bis das Dateiende erreicht ist, und anschließend die Datei wieder schließen.

Viele Grüße!
Sebastian
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dos5.0



Anmeldungsdatum: 07.12.2008
Beiträge: 30

BeitragVerfasst am: 07.12.2008, 22:33    Titel: Antworten mit Zitat

geht das nur bei text dateien?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 07.12.2008, 23:24    Titel: Antworten mit Zitat

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 07.12.2008, 23:35, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dos5.0



Anmeldungsdatum: 07.12.2008
Beiträge: 30

BeitragVerfasst am: 07.12.2008, 23:34    Titel: Antworten mit Zitat

aber das empfangen ist doch ein problem
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 07.12.2008, 23:53    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Dos5.0



Anmeldungsdatum: 07.12.2008
Beiträge: 30

BeitragVerfasst am: 07.12.2008, 23:59    Titel: Antworten mit Zitat

das probier ich mal aus. danke
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dos5.0



Anmeldungsdatum: 07.12.2008
Beiträge: 30

BeitragVerfasst am: 08.12.2008, 19:21    Titel: Antworten mit Zitat

traurig Leider hat es nicht funktioniert. Es kam jedes mal die Meldung "Fehler beim Übertragen!". Ich habe den Code mehrmals überprüft.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 08.12.2008, 20:44    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 09.12.2008, 08:51    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dos5.0



Anmeldungsdatum: 07.12.2008
Beiträge: 30

BeitragVerfasst am: 09.12.2008, 19:24    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 09.12.2008, 22:42    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dos5.0



Anmeldungsdatum: 07.12.2008
Beiträge: 30

BeitragVerfasst am: 28.12.2008, 16:17    Titel: Antworten mit Zitat

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 zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 28.12.2008, 16:33    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Dos5.0



Anmeldungsdatum: 07.12.2008
Beiträge: 30

BeitragVerfasst am: 28.12.2008, 16:44    Titel: Antworten mit Zitat

Die Benutzerfreundlichkeit steht bei mir zurzeit an zweiter Stelle. Erstaml muss es richtig funktionieren.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 28.12.2008, 18:18    Titel: Antworten mit Zitat

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
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 -> Spezielle Fragen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
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