Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Frank Haas
Anmeldungsdatum: 10.09.2004 Beiträge: 10 Wohnort: Hamburg
|
Verfasst am: 05.10.2005, 14:23 Titel: Ein vorh. Protokoll in QB umsetzen.. Bytes, Checksummen,... |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
MisterD
![](images/avatars/42860609841d97ce430990.jpg)
Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 05.10.2005, 15:39 Titel: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
Sebastian Administrator
![](images/avatars/563932275488e4d20c5ee9.jpg)
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 05.10.2005, 15:43 Titel: |
|
|
Hallo.
Erst mal herzlich willkommen zurück in der QB-Community!
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 _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Frank Haas
Anmeldungsdatum: 10.09.2004 Beiträge: 10 Wohnort: Hamburg
|
Verfasst am: 05.10.2005, 16:34 Titel: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
MisterD
![](images/avatars/42860609841d97ce430990.jpg)
Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 05.10.2005, 23:03 Titel: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
Frank Haas
Anmeldungsdatum: 10.09.2004 Beiträge: 10 Wohnort: Hamburg
|
Verfasst am: 05.10.2005, 23:06 Titel: |
|
|
Thx!
Werde das morgen sofort testen.. |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
|