"Søren" <soren@FJERN_DETTEelisiussen.dk> wrote in message
news:3c975b6f$0$60175$edfadb0f@dspool01.news.tele.dk...
> Pseudo code for calculation:
> Character string
> start: SET CRCR = 0
> >>>> Char. start: SET COUNTER = 7
> SET TEMP = CHARACTER * 2
> SET CRCRhig = CRCRhig <XOR> TEMP
> >>> shift crcr: SET CRCR = CRCR * 2
> IF no carry JUMP count shift >>
> SET CRCR = CRCR <xor> CRCP
> >> Count shift: SET COUNTER = COUNTER - 1
> IF counter not zero JUMP shift crcr >>>
> SET CHARACTER = next character
> IF no end of string JUMP char. start >>>>
Hej Søren,
Har du fået kigget lidt i crc_v3?
Funktionen kunne se sådan ud i c:
unsigned short int CRC16(char* data, int len)
{
unsigned short int crc;
int s;
int t;
for (s=len, crc=0; s-->0;)
{
for (t=7, crc ^= *data++ << 9; t-->0;)
crc = (crc & 0x8000) ? crc << 1 ^ 0x8005 : crc << 1;
}
return crc;
}
Funktionen adskiller sig fra en "almindelig CRC16" ved at
operere på 7-bit karakterer. Forskellen er linien
for (t=7, crc ^= *data++ << 9; t-->0;)
som ellers ville have set sådan ud
for (t=8, crc ^= *data++ << 8; t-->0;)
> Checksummen beregnes kun af noget af strengen, fra ID til ETX
> dvs. I denne streng : <SOH>11<GS>003<GS>0<ETX>30206<EOT>
> Beregnes checksummen af : <GS>003<GS>0
> Tallet efter <SOH> (11) er ID'et.
Med funktionen bliver checksummen af
11<GS>003<GS>0
beregnet til
30206
hvad strengen mellem <etx> og <eot> indikerer er korrekt. Du skal altså have
ID'et med i beregningen. Sådan fortolker jeg den engelske beskrivelse og det
giver da også mening.
Her følger en vejledning i at få lavet en DLL med funktionen.
- Put funktionen i en fil som du kalder (f.eks.) "crc16.c".
- Lav en fil samme sted som du kalder (f.eks.) "crc16.def" med følgende
indhold:
EXPORTS CRC16
- Hent Borlands BCC55 fra deres hjemmeside. Den er gratis, men du skal vist
lige registreres først. Installer og put bcc32.exe i stien.
- Kør denne kommandolinie:
bcc32 -p -WD -LC:\progra~1\borland\bcc55\lib crc16.c
-p er for at bruge pascal kaldekonvention. Hvad bruger VB? Du skal måske
bruge en anden. Det kommer du nok til at rode lidt med selv
Her er dine
muligheder:
-p Use Pascal calling convention
-p- Use C calling convention
-pc Use C calling convention (Default: -pc, -p-)
-pm Functions without an explicit calling convention to use __msfastcall.
-pr Use fastcall calling convention for passing parameters in registers
-ps Use stdcall calling convention
-WD er for at fortælle linkeren at den skal lave en DLL.
-L... er for at fortælle linkeren hvor den kan finde filer til at linke en
DLL med. Hvis din installation er anderledes, så skal der seføli stå noget
andet i stien.
Hvis DLL'en skal bruges fra Delphi kan den importeres således:
function CRC16(s: PChar; len: Integer): Word; pascal; external 'crc16.dll';
forudsat kaldekonventionen stadig er pascal.
DLL'en skal naturligvis ligge i stien før programmet kan køres.
Importering i VB og resten af applikationen må du få nogen andre til at
lave. Rigtigt god fornøjelse med uddelegeringen af arbejde
--
BopBopBop