vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 3.0 - Professionelle Toolbars im modernen Design!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Fortgeschrittene Programmierung
Anregung: CRC16 mit Tabelle 
Autor: Wöllmi
Datum: 26.04.03 23:00

Hi,
je länger ich darüber nachdenke, frage ich mich, weshalb ich damals die
Anleitung für meine MODBUS-CRC16 Doku nicht als Tabelle umgesetzt habe.

Ich habe mich damals wohl nicht mit C++ auseinandersetzen wollen.

Ich denke mal, wenn du dir ein Bsp. mal richtig durch den Kopf gehen läßt,
könnte es dir evtl. weiterhelfen eine VB Umsetzung zu realisieren.
Knackpunkt ist ja die Berechnung der Tabelle.

Zusammengefaßt kann man es auf folgende Punkt bringen:
1. Alle möglichen Ergebnisse der CRC Berechnung müssen vorab einmalig
berechnet werden. Da spielt ja Zeit nun wirklich keine Rolle
Im richtigen programm wird dann ja nur die Tabelle verwendet.
2. Diese Ergebnisse werden dann in ein vordefiniertes Array
(in dem Beispiel in 2 Arrays, LowByte und HigByte zu je 256 Einträgen) gepackt und ...
3. der Algorithmus holt diese dann für das richtige Programm
per Index aus der Tabelle. Fertig!

Soweit die Theorie.
Nun müßte man ja nur noch rausbekommen, wie die Tabelle berechnet wird.
Und dann nach gleichem Schema auf CITT anwenden.
Hier die C++ Routine für den Tabellenzugriff
Example 
An example of a C language function performing CRC generation is shown on the 
following pages. All of the possible CRC values are preloaded into two arrays, _
  which are 
simply indexed as the function increments through the message buffer. One array 
contains all of the 256 possible CRC values for the high byte of the 16-bit CRC _
  field, and 
the other array contains all of the values for the low byte. 
Indexing the CRC in this way provides faster execution than would be achieved by 
calculating a new CRC value with each new character from the message buffer. 
Note: This function performs the swapping of the high/low CRC bytes internally. _
  The 
bytes are already swapped in the CRC value that is returned from the function. _
Therefore 
the CRC value returned from the function can be directly placed into the _
message for 
transmission.
unsigned char *puchMsg ; 	
 A pointer to the message buff. containing binary data to be used for _
   generating the CRC 
unsigned short usDataLen ; The quantity of bytes in the message buffer. 
 
The function returns the CRC as a type unsigned short. CRC Generation Function
 
unsigned short CRC16(puchMsg, usDataLen)
unsigned char *puchMsg ;		/* message to calculate CRC upon */
unsigned short usDataLen ;		/* quantity of bytes in message  */
{
	unsigned char uchCRCHi = 0xFF ;	/* high CRC byte  initialized */
	unsigned char uchCRCLo = 0xFF ;	/* low CRC byte initialized  */
	unsigned uIndex ;		/* will index into CRC lookup*/
				/* table                     */
	while (usDataLen--)		/* pass through message buffer    */
		{
		uIndex = uchCRCHi ^ *puchMsg++ ;  /* calculate the CRC   */
		uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
		uchCRCLo = auchCRCLo[uIndex] ;
		}
	return (uchCRCHi << 8 | uchCRCLo) ;
}
Es wird also nur für die Anzahl der Zeichen über die die CRC gebildet werden soll
eine schleife durchlaufen. Da kommt man ja nun wirklich nicht umhin
Und hier ein Ausschnitt aus den zugehörigen Tabellen:
High Order Byte Table 
/* Table of CRC values for high-order byte */
 
static unsigned char auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
0x00, .......
} ; 
 
Low Order Byte Table 
/* Table of CRC values for low-order byte */
 
static char auchCRCLo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 
0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 
0x08, ...........
} ;
Leider kann ich nicht alles in das Forum packen, begrenzte Nachrichtenlänge.

Vielleicht hilft es dir ja einen Ansatz zu finden.

Ich werde mir mal meine VB Routine, die auchmit vielen Schleifen funktioniert mal
vornehmen und die tabelle versuchen nachzuvollziehen.
Da läßt sich für CITT best. was ableiten.
Ansonsten kann ich das komplette C++ Bsp. incl. der zugehörigen Vorschrift auch mailen.

Tschaui
Woellmi

alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
CRC16 mit VB6 (Letzte rettung)834LonelySuicide66623.04.03 20:23
Re: CRC16 mit VB6 (Letzte rettung)4.384unbekannt23.04.03 20:40
Re: CRC16 mit VB6 (Letzte rettung)505LonelySuicide66624.04.03 20:26
Re: CRC16 mit VB6 (Letzte rettung)4.506Wöllmi23.04.03 21:53
Hier der Code4.581Wöllmi23.04.03 21:56
Re: Hier der Code Teil 24.451Wöllmi23.04.03 21:57
Re: Hier der Code498LonelySuicide66624.04.03 19:47
Re: Hier der Code4.680unbekannt24.04.03 22:03
Re: Hier der Code477LonelySuicide66625.04.03 06:00
Re: Hier der Code4.411unbekannt25.04.03 17:22
Oh Mann natürlich umgekehrt 4.292unbekannt25.04.03 17:30
Re: Oh Mann natürlich umgekehrt 488LonelySuicide66625.04.03 20:15
Re: Oh Mann natürlich umgekehrt 4.274unbekannt25.04.03 20:28
Re: Oh Mann natürlich umgekehrt 476LonelySuicide66626.04.03 12:29
Re: CRC16 mit VB6 (Letzte rettung)484Analyzer26.04.03 12:59
Noch näher an der Beschreibung:488Analyzer26.04.03 13:49
Re: Noch näher an der Beschreibung:475LonelySuicide66626.04.03 15:27
Re: Noch näher an der Beschreibung:470Analyzer26.04.03 17:12
Re: Noch näher an der Beschreibung:464LonelySuicide66626.04.03 20:56
Anregung: CRC16 mit Tabelle5.429Wöllmi26.04.03 23:00
Habe Routine für CRC16 Tabelle5.269Wöllmi27.04.03 22:39
Re: Habe Routine für CRC16 Tabelle472LonelySuicide66628.04.03 10:47
Re: Habe Routine für CRC16 Tabelle4.962Wöllmi28.04.03 22:58
&h270C muß rauskommen4.380Wöllmi28.04.03 23:00
Re: CRC16 mit VB6 (Letzte rettung)4.590Swiss Ueli30.04.03 18:26
Re: CRC16 mit VB6 (Letzte rettung) - Teil 24.487Swiss Ueli30.04.03 18:30

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2025 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel