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:

Ein vorh. Protokoll in QB umsetzen.. Bytes, Checksummen,...

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Frank Haas



Anmeldungsdatum: 10.09.2004
Beiträge: 10
Wohnort: Hamburg

BeitragVerfasst am: 05.10.2005, 13:23    Titel: Ein vorh. Protokoll in QB umsetzen.. Bytes, Checksummen,... Antworten mit Zitat

Tach in die Runde..
habe ein "kleines" Problem.. bin etwas eingerostet was Programmierung betrifft. Vor allem benötige ich etwas Starthilfe bezüglich Bytes/Bit/Hex usw..
Also folgendes Problem:
Ich habe ein System welches ich über ein vorhandenes "VDCP"-Protokoll ansteuern muss. Dieses Protokol: http://www.headarrangement.de/qbasic/vdcp.pdf steht der Allgemeinheit als PDF-File zur Verfügung.. die Allgemeinheit bietet allerdings keine DLLs oder Codes an.. deshalb muss ich das Protokoll selbst in ein Programm umsetzen..
Die Seiten 8 und 9 des PDF-Files sind zunächst interessant.. denn diese beschreiben die Grundlage des Protokolls.. also in etwa so:

Die Kommando-Zeile ist wie folgt aufgebaut:
(variabel zwischen 2 und 256 Bytes lang)
Grundgerüst:
STX | BC | Type/UA | CMD-2 | DATA-1 | DATA-2 | DATA-N | CHECKSUM

STX: "Start of Text Code" (ist immer Hex: 02)

Byte 1: "BC" (Byte Count): Die Anzahl der Bytes zwischen "BC" und "CHECKSUM"

Hier wäre schon mal das erste "kleine" Problem..
Wie bilde ich die Checksumme ?
Vielleicht kann mir auch jemand vorab erklären wie ich einzelne Bytes zu einem String zusammenfüge oder wie das grundsätzlich läuft..
Das ganze soll über die Serielle Schnittstelle laufen.. den Port öffnen bekomme ich noch hin.. wie sende ich die Hex-Daten als eine Zeichenkette ?
also &02 + &"BC" + &"Type" ...+&"CHECKSUM"

Wird jetzt n bischen unübersichtlich..
also wäre sehr nett wenn wir uns da Schritt für Schritt durchboxen könnten,.. brauche nur etwas Starthilfe.
Vielen Dank
gruß
Frank
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 05.10.2005, 14:39    Titel: Antworten mit Zitat

Ich vermute mal für die Checksumme gibts ne eigene spezifikation..

bytes verbinden mit chr$(byte1)+chr$(byte2)...
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 05.10.2005, 14:43    Titel: Antworten mit Zitat

Hallo.

Erst mal herzlich willkommen zurück in der QB-Community! lächeln

Ich habe mir die 58seitigen Protokollspezifikationen jetzt nicht durchgelesen. Daher kann ich nur spekulieren, was für eine Prüfsumme du gerne hättest. Gut geeignet für solche Sachen ist IMO CRC16 oder CRC32. Das ABC Archiv hält dazu den folgenden nützlichen Source bereit:
Code:
'===========================================================================
' Subject: CALCULATING CRC BLOCKS             Date: Unknown Date (00:00)   
'  Author: Unknown Author(s)                  Code: QB, QBasic, PDS       
'  Origin: CALCULATING,CRC,BLOCKS           Packet: ALGOR.ABC
'===========================================================================
'=== BEGIN: CRC.BAS ===
DECLARE FUNCTION CRC16& (Block$)
DECLARE FUNCTION CRC32& (Block$)
'=== END ===

DEFINT A-Z
FUNCTION CRC16& (B$)      'Calculates CRC for Each Block

DIM Power(0 TO 7)                              'For the 8 Powers of 2
DIM CRC AS LONG

FOR I = 0 TO 7                                 'Calculate Once PerBlock to
   Power(I) = 2 ^ I                            ' Increase Speed Within FOR J
NEXT I                                         ' Loop
CRC = 0                                        'Reset for Each Text Block
FOR I = 1 TO LEN(B$)                           'Calculate for Length of Block
   ByteVal = ASC(MID$(B$, I, 1))
   FOR J = 7 TO 0 STEP -1
      TestBit = ((CRC AND 32768) = 32768) XOR ((ByteVal AND Power(J)) = Power(J))
      CRC = ((CRC AND 32767&) * 2&)
      IF TestBit THEN CRC = CRC XOR &H1021&     ' <-- This for 16 Bit CRC
   NEXT J
NEXT I
CRC16& = CRC                               'Return the Word Value
END FUNCTION

DEFSNG A-Z
FUNCTION CRC32& (B$)      'Calculates CRC for Each Block

DIM Power(0 TO 7)                              'For the 8 Powers of 2
DIM CRC AS LONG

FOR I = 0 TO 7                                 'Calculate Once Per Block to
   Power(I) = 2 ^ I                            ' Increase Speed Within FOR J
NEXT I                                         ' Loop
CRC = 0                                        'Reset for Each Text Block
FOR I = 1 TO LEN(B$)                           'Calculate for Length of Block
   ByteVal = ASC(MID$(B$, I, 1))
   FOR J = 7 TO 0 STEP -1
      TestBit = ((CRC AND 32768) = 32768) XOR ((ByteVal AND Power(J)) = Power(J))
      CRC = ((CRC AND 32767&) * 2&)
      IF TestBit THEN CRC = CRC XOR &H8005&     ' <-- This for 32 Bit CRC
   NEXT J
NEXT I
CRC32& = CRC                               'Return the Word Value
END FUNCTION


Und so fügt man Bytes zusammen:
Code:
DIM MeineBytes(2) As Integer
DIM Zeichenkette As String
MeineBytes%(0) = &H42
MeineBytes%(1) = &H4C
MeineBytes%(2) = &H41
FOR i%=LBOUND(MeineBytes%) TO UBOUND(MeineBytes%)
 Zeichenkette=Zeichenkette+CHR$(MeineBytes%(i%))
NEXT i%
PRINT Zeichenkette
SLEEP: END


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
Frank Haas



Anmeldungsdatum: 10.09.2004
Beiträge: 10
Wohnort: Hamburg

BeitragVerfasst am: 05.10.2005, 15:34    Titel: Antworten mit Zitat

Ja, Thx Sebastian..
n gutes Jahr her seit dem letzten Besuch.. hat sich ja einiges Verändert..
Gibt's das alte Forum gar nicht mehr ? Hab im "2.QBForum" keine meiner Sachen gefunden.. hm..

Dein Quellcode ist ja nicht ohne.. hab's mir einfacher vorgestellt..
Wenn man jetzt von einem Bsp aus dem PDF File ausgeht.. wie würde man dann über die serielle Schnittstelle folgende HEX Werte rausschicken ?

&02 &02 &10 &01 &EF -> PLAY-Befehl (aus der Anleitung)

Also erstmal den Port öffnen..

Code:

OPEN "COM1:9600,N,8,1" FOR RANDOM AS #1:

Jetzt der interessante Part:
Code:

PRINT #1, &02
PRINT #1, &02
PRINT #1, &10
PRINT #1, &01
PRINT #1, &EF
CLOSE #1


Wäre das grundsätzlich richtig ? Eventuell müsste man bei den "Prints" n Semicolon verwenden, da sonst die Zeichenkette durch ein Carriage Return unterbrochen wird ?!

Kann das morgen bei der Arbeit erst testen..
Frank
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 05.10.2005, 22:03    Titel: Antworten mit Zitat

nein, du musst immer
print #1, chr$(&hwert);
schreiben.. chr$ damit nicht die Zahl sondern das Zeichen übermittelt wird und das ; am ende unterdrückt den sonst mtigesendeten Zeilenumbruch. sonst ok..
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Frank Haas



Anmeldungsdatum: 10.09.2004
Beiträge: 10
Wohnort: Hamburg

BeitragVerfasst am: 05.10.2005, 22:06    Titel: Antworten mit Zitat

Thx!
Werde das morgen sofort testen..
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum 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