none
[求助]如何將下列程式轉換成vb..NET(關於crc的問題) RRS feed

  • 問題

  • HI~你們好

    關於crc_code之問題,由於之前試了很多方式,但都無法設設備通訊,也找了很多相關的方法

    查表法也有試過,但都無法與設備通訊,於是想到將程式提供出來,可以請大家幫我嗎..真的謝謝你們!!

     

    以下是原廠提供的解crc的程式,但由於是c語言,自己看不太懂,所以一直無法解出來,希望大家可以幫我!!

    #define init 0x000

    #define polinomial 0x1021

    unsigned short calc_crc(unsigned short crc,unsigned short ch);

    unsigned short getcrc(unsigned char *p,unsigned short n);

     

    unsigned short calc_crc(unsigned short crc,unsigned short ch)

    {

    unsigned short i;

    ch<<8;

    for(i=8;i>0;i--){

    if((ch^crc) & 0x8000 {

    crc=(crc<<1)^ polinomial;

    } else {

       crc<<=1; }

    ch<<=1;  } 

    return crc;  }

    unsigned short getcrc(unsigned char *p,unsigned short n)

    {

    unsigned char ch;

    unsigned short i;

    unsigned short crc=INIT;

    for(i=0;i<n;i++) {

    ch=*p++;

    crc=calc_crc(crc,(unsigned short)ch);

    }

    return crc;

    }

     

    int main(void)

    {

    unsigned char transcommand[13]={0xF2,0x00,0x08,0x43,0x30,0x30,0x33,0x32,0x34,0x30,0x30,0x00,0x00}

    unsigned short textlength=11;

    unsigned short crc;

    crc=getcrc(transcommand,textlength);

    transcommand[11]=(crc>>8) & 0xFF;

    transcommand[12]=crc & 0xFF;

    return 0;

    }

    ================================以上是原始C語法======

     

    那後來自己有在網路上找到VB的方法,但卻一直無法套出正確CRC,麻煩你們,可以教我嗎..真的謝謝

    Function CRC16(ByVal data() As Byte) As Byte()

            Dim CRC16Lo As Byte, CRC16Hi As Byte   'CRC暫存器

            Dim CL As Byte, CH As Byte       

            Dim SaveHi As Byte, SaveLo As Byte

            Dim i As Integer

            Dim Flag As Integer

            CRC16Lo = &H0

            CRC16Hi = &H0

            CL = &H21

            CH = &H10

            For i = 0 To UBound(data)

                CRC16Lo = CRC16Lo Xor data(i) '每一個資料與CRC暫存器進行異或

                For Flag = 0 To 7

                    SaveHi = CRC16Hi

                    SaveLo = CRC16Lo

                    CRC16Hi = CRC16Hi / 2      '高位右移一位

                    CRC16Lo = CRC16Lo / 2      '低位右移一位

                    If ((SaveHi And &H1) = &H1) Then '如果高位字節最後一位為1

                        CRC16Lo = CRC16Lo Or &H80   '則低位字節右移後前面補1

                    End If              '否則自動補0

                    If ((SaveLo And &H1) = &H1) Then '如果LSB為1,則與多項式碼進行異或

                        CRC16Hi = CRC16Hi Xor CH

                        CRC16Lo = CRC16Lo Xor CL

                    End If

                Next

            Next

            Dim ReturnData(1) As Byte

            ReturnData(0) = CRC16Hi    'CRC高位

            ReturnData(1) = CRC16Lo    'CRC低位

            Debug.Print("data_check2=" & Hex(ReturnData(0)) & ";" & Hex(ReturnData(1)))

            CRC16 = ReturnData

        End Function

    2010年4月14日 上午 09:30

解答

所有回覆