Funzione Format(Hex(n(a)),"00") mi azzera gli esa 1A 2A fino a 9A

di il
10 risposte

Funzione Format(Hex(n(a)),"00") mi azzera gli esa 1A 2A fino a 9A

<ho un array di 255 byte e se cerco di scriverlo in un file con la funzione format(hex(numero),"00") mi azzera codici 1A 2A ecc

b = 0
x = 0
tablelfile = App.Path & "\" & "TABLELfile.txt"
Open tablelfile For Output As #1
Print #1, Format(x, "000"); ") ";
For x = 0 To 255
    b = b + 1
    Print #1, Format(CRCTL(x), "000"); " ";
    If b = 15 Then
        Print #1, vbCrLf
        Print #1, Format(x + 1, "000"); ") ";
        b = 0
    End If
Next x
Print #1, vbCrLf

b = 0
x = 0
Print #1, Format(x, "000"); ") ";
For x = 0 To 255
    b = b + 1
    Print #1, Format(Hex(CRCTL(x)), "00"); " ";
    If b = 15 Then
        Print #1, vbCrLf
        Print #1, Format(x + 1, "000"); ") ";
        b = 0
    End If
Next x

Close #1

000) 000 192 193 001 195 003 002 194 198 006 007 199 005 197 196 

015) 004 204 012 013 205 015 207 206 014 010 202 203 011 201 009 

030) 008 200 216 024 025 217 027 219 218 026 030 222 223 031 221 

045) 029 028 220 020 212 213 021 215 023 022 214 210 018 019 211 

060) 017 209 208 016 240 048 049 241 051 243 242 050 054 246 247 

075) 055 245 053 054 244 060 252 253 061 255 063 062 254 250 058 

090) 059 251 057 249 248 056 040 232 233 041 235 043 042 234 238 

105) 046 047 239 045 237 236 044 228 036 037 229 039 231 230 038 

120) 034 226 227 035 225 033 032 224 160 096 097 161 099 163 162 

135) 098 102 166 167 103 165 101 100 164 108 172 173 109 175 111 

150) 110 174 170 106 107 171 105 169 168 104 120 184 185 121 187 

165) 123 122 186 190 126 127 191 125 189 188 124 180 116 117 181 

180) 119 183 182 118 114 178 179 115 177 113 112 176 080 144 145 

195) 081 147 083 082 146 150 086 087 151 085 149 148 084 156 092 

210) 093 157 095 159 158 094 090 154 155 091 153 089 088 152 136 

225) 072 073 137 075 139 138 074 078 142 143 079 141 077 076 140 

240) 068 132 133 069 135 071 070 134 130 066 067 131 065 129 128 

255) 064 

000) 00 C0 C1 01 C3 03 02 C2 C6 06 07 C7 05 C5 C4 

015) 04 CC C D CD F CF CE E A CA CB B C9 09 

030) 08 C8 D8 18 19 D9 1B DB DA 00 1E DE DF 1F DD 

045) 1D 1C DC 14 D4 D5 15 D7 17 16 D6 D2 12 13 D3 

060) 11 D1 D0 10 F0 30 31 F1 33 F3 F2 32 36 F6 F7 

075) 37 F5 35 36 F4 3C FC FD 3D FF 3F 3E FE FA 00 

090) 3B FB 39 F9 F8 38 28 E8 E9 29 EB 2B 00 EA EE 

105) 2E 2F EF 2D ED EC 2C E4 24 25 E5 27 E7 E6 26 

120) 22 E2 E3 23 E1 21 20 E0 A0 60 61 A1 63 A3 A2 

135) 62 66 A6 A7 67 A5 65 64 A4 6C AC AD 6D AF 6F 

150) 6E AE AA 00 6B AB 69 A9 A8 68 78 B8 B9 79 BB 

165) 7B 00 BA BE 7E 7F BF 7D BD BC 7C B4 74 75 B5 

180) 77 B7 B6 76 72 B2 B3 73 B1 71 70 B0 50 90 91 

195) 51 93 53 52 92 96 56 57 97 55 95 94 54 9C 5C 

210) 5D 9D 5F 9F 9E 5E 00 00 9B 5B 99 59 58 98 88 

225) 48 49 89 4B 8B 00 00 4E 8E 8F 4F 8D 4D 4C 8C 

240) 44 84 85 45 87 47 46 86 82 42 43 83 41 81 80 

255) 40

10 Risposte

  • Re: Funzione Format(Hex(n(a)),"00") mi azzera gli esa 1A 2A fino a 9A

    Non va bene in quel modo con la Format.

    Usa

    Right("00" & Hex(numero), 2)
  • Re: Funzione Format(Hex(n(a)),"00") mi azzera gli esa 1A 2A fino a 9A

    Grazie oregon

    in effetti così funziona e risolve anche il problema dei caratteri 0C 0D 0E 0F ecc stampati male

    ecco il codice corretto ed il risultato il mio scopo era tradure in VB6 questo.

    forse c' era un modo più semplice, hai qualche idea ? 

    FUNZIONI PER IL CALCOLO DI CRC - Con tabella
    Tutti i possibili valori CRC sono precaricati in due schieramenti, che sono semplicemente indicizzati mentre
    la funzione incrementa attraverso il buffer del messaggio. Uno schieramento contiene tutti i 256 valori CRC
    possibili per il byte high del campo CRC a 16 bit, e l’altro schieramento contiene tutti i valori per il byte low.
    Indicizzando in questo modo il CRC è possibile avere un’esecuzione più veloce rispetto a quella ottenuta dal
    calcolo di un nuovo valore CRC con ogni carattere nuovo dal buffer del messaggio.

    
    /*CRC table for calculate with polynom 0xA001 with init value 0xFFFF, High half word*/
    rom unsigned char CRC_Table_Hi[] = {
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
    0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
    0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
    0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,
    0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
    0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
    0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
    0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
    0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
    0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
    0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
    0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
    0x40
    };
    /*CRC table for calculate with polynom 0xA001 with init value 0xFFFF, Low half word*/
    rom unsigned char CRC_Table_Lo[] = {
    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, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD,
    0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
    0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7,
    0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
    0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE,
    0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
    0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2,
    0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
    0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB,
    0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
    0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91,
    0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
    0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88,
    0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
    0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80,
    0x40
    };
    unsigned short ModBus_CRC16( unsigned char * Buffer, unsigned short Length )
    {
    unsigned char CRCHi = 0xFF;
    unsigned char CRCLo = 0xFF;
    int Index;
    unsigned short ret;
    while( Length-- )
    {
    Index = CRCLo ^ *Buffer++ ;
    CRCLo = CRCHi ^ CRC_Table_Hi[Index];
    CRCHi = CRC_Table_Lo[Index];
    }
    ret=((unsigned short)CRCHi << 8);
    ret|= (unsigned short)CRCLo;
    return ret;
    }
    
    'CRC table for calculate with polynom 0xA001 with init value 0xFFFF, High half word
    Public CRCTH(255) As Byte
    'CRC table for calculate with polynom 0xA001 with init value 0xFFFF, Low half word
    Public CRCTL(255) As Byte
    
    

    non riuscendo a passare i buffer delle seriali ho creato tre funzioni diverse per le tre seriali

    Function calccrc1(Lenght, mode) As Long
    
    Dim CRCHi As Byte
    Dim CRCLo As Byte
    Dim Index As Byte
    Dim i As Byte
    Dim curcrc As Long
    
    CRCHi = 255
    CRCLo = 255
    i = 0
    
    If mode = 0 Then ' trasmit
        While (i < Lenght)
            Index = CRCLo Xor buftc1(i)
            CRCLo = CRCHi Xor CRCTH(Index)
            CRCHi = CRCTL(Index)
            i = i + 1
        Wend
    Else
        While (i < Lenght - 2)
            Index = CRCLo Xor bufrc1(i)
            CRCLo = CRCHi Xor CRCTH(Index)
            CRCHi = CRCTL(Index)
            i = i + 1
        Wend
        If ((CRCLo = bufrc1(i)) And (CRCHi = bufrc1(i + 1))) Then
            crcok1 = True
        Else
            crcok1 = False
        End If
    End If
    
    crch1 = CRCHi
    crcl1 = CRCLo
    
    curcrc = 256
    curcrc = curcrc * CRCHi + CRCLo
    calccrc1 = curcrc
    
    End Function
    
    Function calccrc2(Lenght, mode) As Long
    
    Dim CRCHi As Byte
    Dim CRCLo As Byte
    Dim Index As Byte
    Dim i As Byte
    Dim curcrc As Long
    
    CRCHi = 255
    CRCLo = 255
    i = 0
    
    If mode = 0 Then ' trasmit
        While (i < Lenght)
            Index = CRCLo Xor buftc2(i)
            CRCLo = CRCHi Xor CRCTH(Index)
            CRCHi = CRCTL(Index)
            i = i + 1
        Wend
    Else
        While (i < Lenght - 2)
            Index = CRCLo Xor bufrc2(i)
            CRCLo = CRCHi Xor CRCTH(Index)
            CRCHi = CRCTL(Index)
            i = i + 1
        Wend
        If ((CRCLo = bufrc2(i)) And (CRCHi = bufrc2(i + 1))) Then
            crcok2 = True
        Else
            crcok2 = False
        End If
    End If
    
    crch2 = CRCHi
    crcl2 = CRCLo
    
    curcrc = 256
    curcrc = curcrc * CRCHi + CRCLo
    calccrc2 = curcrc
    
    End Function
    
    Function calccrc3(Lenght, mode) As Long
    
    Dim CRCHi As Byte
    Dim CRCLo As Byte
    Dim Index As Byte
    Dim i As Byte
    Dim curcrc As Long
    
    CRCHi = 255
    CRCLo = 255
    i = 0
    
    If mode = 0 Then ' trasmit
        While (i < Lenght)
            Index = CRCLo Xor buftc3(i)
            CRCLo = CRCHi Xor CRCTH(Index)
            CRCHi = CRCTL(Index)
            i = i + 1
        Wend
    Else
        While (i < Lenght - 2)
            Index = CRCLo Xor bufrc3(i)
            CRCLo = CRCHi Xor CRCTH(Index)
            CRCHi = CRCTL(Index)
            i = i + 1
        Wend
        If ((CRCLo = bufrc3(i)) And (CRCHi = bufrc3(i + 1))) Then
            crcok3 = True
        Else
            crcok3 = False
        End If
    End If
    
    crch3 = CRCHi
    crcl3 = CRCLo
    
    curcrc = 256
    curcrc = curcrc * CRCHi + CRCLo
    calccrc3 = curcrc
    
    End Function
    
    b = 0
    x = 0
    tablehfile = App.Path & "\" & "TABLEHfile.txt"
    Open tablehfile For Output As #1
    Print #1, Format(x, "000"); ") ";
    For x = 0 To 255
        b = b + 1
        Print #1, Format(CRCTH(x), "000"); " ";
        'Debug.Print Format(x, "000"); " "; Format(CRCTH(x), "000")
        If b = 15 Then
            Print #1, vbCrLf
            Print #1, Format(x + 1, "000"); ") ";
            b = 0
        End If
    Next x
    Print #1, vbCrLf
    
    b = 0
    x = 0
    Print #1, Format(x, "000"); ") ";
    For x = 0 To 255
        b = b + 1
        'Print #1, Format(Hex(CRCTH(x)), "00"); " ";
        Print #1, Right("00" & Hex(CRCTH(x)), 2); " ";
        'Debug.Print Format(x, "000"); " "; Format(CRCTH(x), "000")
        If b = 15 Then
            Print #1, vbCrLf
            Print #1, Format(x + 1, "000"); ") ";
            b = 0
        End If
    Next x
    Close #1
    
    b = 0
    x = 0
    tablelfile = App.Path & "\" & "TABLELfile.txt"
    Open tablelfile For Output As #1
    Print #1, Format(x, "000"); ") ";
    For x = 0 To 255
        b = b + 1
        Print #1, Format(CRCTL(x), "000"); " ";
        If b = 15 Then
            Print #1, vbCrLf
            Print #1, Format(x + 1, "000"); ") ";
            b = 0
        End If
    Next x
    Print #1, vbCrLf
    
    b = 0
    x = 0
    Print #1, Format(x, "000"); ") ";
    For x = 0 To 255
        b = b + 1
        'Print #1, Format(Hex(CRCTL(x)), "00"); " ";
        Print #1, Right("00" & Hex(CRCTL(x)), 2); " ";
        If b = 15 Then
            Print #1, vbCrLf
            Print #1, Format(x + 1, "000"); ") ";
            b = 0
        End If
    Next x
    
    Close #1
    

    aggiungo anche l' inizializzazione degli array

    'CRC table for calculate with polynom 0xA001 with init value 0xFFFF, High half word
    
    CRCTH(0) = 0
    CRCTH(1) = 193
    CRCTH(2) = 129
    CRCTH(3) = 64
    CRCTH(4) = 1
    CRCTH(5) = 192
    CRCTH(6) = 128
    CRCTH(7) = 65
    CRCTH(8) = 1
    CRCTH(9) = 192
    CRCTH(10) = 128
    CRCTH(11) = 65
    CRCTH(12) = 0
    CRCTH(13) = 193
    CRCTH(14) = 129
    CRCTH(15) = 64
    CRCTH(16) = 1
    CRCTH(17) = 192
    CRCTH(18) = 128
    CRCTH(19) = 65
    CRCTH(20) = 0
    CRCTH(21) = 193
    CRCTH(22) = 129
    CRCTH(23) = 64
    CRCTH(24) = 0
    CRCTH(25) = 193
    CRCTH(26) = 129
    CRCTH(27) = 64
    CRCTH(28) = 1
    CRCTH(29) = 192
    CRCTH(30) = 128
    CRCTH(31) = 65
    CRCTH(32) = 1
    CRCTH(33) = 192
    CRCTH(34) = 128
    CRCTH(35) = 65
    CRCTH(36) = 0
    CRCTH(37) = 193
    CRCTH(38) = 129
    CRCTH(39) = 64
    CRCTH(40) = 0
    CRCTH(41) = 193
    CRCTH(42) = 129
    CRCTH(43) = 64
    CRCTH(44) = 1
    CRCTH(45) = 192
    CRCTH(46) = 128
    CRCTH(47) = 65
    CRCTH(48) = 0
    CRCTH(49) = 193
    CRCTH(50) = 129
    CRCTH(51) = 64
    CRCTH(52) = 1
    CRCTH(53) = 192
    CRCTH(54) = 128
    CRCTH(55) = 65
    CRCTH(56) = 1
    CRCTH(57) = 192
    CRCTH(58) = 128
    CRCTH(59) = 65
    CRCTH(60) = 0
    CRCTH(61) = 193
    CRCTH(62) = 129
    CRCTH(63) = 64
    CRCTH(64) = 1
    CRCTH(65) = 192
    CRCTH(66) = 128
    CRCTH(67) = 65
    CRCTH(68) = 0
    CRCTH(69) = 193
    CRCTH(70) = 129
    CRCTH(71) = 64
    CRCTH(72) = 0
    CRCTH(73) = 193
    CRCTH(74) = 129
    CRCTH(75) = 64
    CRCTH(76) = 1
    CRCTH(77) = 192
    CRCTH(78) = 128
    CRCTH(79) = 65
    CRCTH(80) = 0
    CRCTH(81) = 193
    CRCTH(82) = 129
    CRCTH(83) = 64
    CRCTH(84) = 1
    CRCTH(85) = 192
    CRCTH(86) = 128
    CRCTH(87) = 65
    CRCTH(88) = 1
    CRCTH(89) = 192
    CRCTH(90) = 128
    CRCTH(91) = 65
    CRCTH(92) = 0
    CRCTH(93) = 193
    CRCTH(94) = 129
    CRCTH(95) = 64
    CRCTH(96) = 0
    CRCTH(97) = 193
    CRCTH(98) = 129
    CRCTH(99) = 64
    CRCTH(100) = 1
    CRCTH(101) = 192
    CRCTH(102) = 128
    CRCTH(103) = 65
    CRCTH(104) = 1
    CRCTH(105) = 192
    CRCTH(106) = 128
    CRCTH(107) = 65
    CRCTH(108) = 0
    CRCTH(109) = 193
    CRCTH(110) = 129
    CRCTH(111) = 64
    CRCTH(112) = 1
    CRCTH(113) = 192
    CRCTH(114) = 128
    CRCTH(115) = 65
    CRCTH(116) = 0
    CRCTH(117) = 193
    CRCTH(118) = 129
    CRCTH(119) = 64
    CRCTH(120) = 0
    CRCTH(121) = 193
    CRCTH(122) = 129
    CRCTH(123) = 64
    CRCTH(124) = 1
    CRCTH(125) = 192
    CRCTH(126) = 128
    CRCTH(127) = 65
    CRCTH(128) = 1
    CRCTH(129) = 192
    CRCTH(130) = 128
    CRCTH(131) = 65
    CRCTH(132) = 0
    CRCTH(133) = 193
    CRCTH(134) = 129
    CRCTH(135) = 64
    CRCTH(136) = 0
    CRCTH(137) = 193
    CRCTH(138) = 129
    CRCTH(139) = 64
    CRCTH(140) = 1
    CRCTH(141) = 192
    CRCTH(142) = 128
    CRCTH(143) = 65
    CRCTH(144) = 0
    CRCTH(145) = 193
    CRCTH(146) = 129
    CRCTH(147) = 64
    CRCTH(148) = 1
    CRCTH(149) = 192
    CRCTH(150) = 128
    CRCTH(151) = 65
    CRCTH(152) = 1
    CRCTH(153) = 192
    CRCTH(154) = 128
    CRCTH(155) = 65
    CRCTH(156) = 0
    CRCTH(157) = 193
    CRCTH(158) = 129
    CRCTH(159) = 64
    CRCTH(160) = 0
    CRCTH(161) = 193
    CRCTH(162) = 129
    CRCTH(163) = 64
    CRCTH(164) = 1
    CRCTH(165) = 192
    CRCTH(166) = 128
    CRCTH(167) = 65
    CRCTH(168) = 1
    CRCTH(169) = 192
    CRCTH(170) = 128
    CRCTH(171) = 65
    CRCTH(172) = 0
    CRCTH(173) = 193
    CRCTH(174) = 129
    CRCTH(175) = 64
    CRCTH(176) = 1
    CRCTH(177) = 192
    CRCTH(178) = 128
    CRCTH(179) = 65
    CRCTH(180) = 0
    CRCTH(181) = 193
    CRCTH(182) = 129
    CRCTH(183) = 64
    CRCTH(184) = 0
    CRCTH(185) = 193
    CRCTH(186) = 129
    CRCTH(187) = 64
    CRCTH(188) = 1
    CRCTH(189) = 192
    CRCTH(190) = 128
    CRCTH(191) = 65
    CRCTH(192) = 0
    CRCTH(193) = 193
    CRCTH(194) = 129
    CRCTH(195) = 64
    CRCTH(196) = 1
    CRCTH(197) = 192
    CRCTH(198) = 128
    CRCTH(199) = 65
    CRCTH(200) = 1
    CRCTH(201) = 192
    CRCTH(202) = 128
    CRCTH(203) = 65
    CRCTH(204) = 0
    CRCTH(205) = 193
    CRCTH(206) = 129
    CRCTH(207) = 64
    CRCTH(208) = 1
    CRCTH(209) = 192
    CRCTH(210) = 128
    CRCTH(211) = 65
    CRCTH(212) = 0
    CRCTH(213) = 193
    CRCTH(214) = 129
    CRCTH(215) = 64
    CRCTH(216) = 0
    CRCTH(217) = 193
    CRCTH(218) = 129
    CRCTH(219) = 64
    CRCTH(220) = 1
    CRCTH(221) = 192
    CRCTH(222) = 128
    CRCTH(223) = 65
    CRCTH(224) = 1
    CRCTH(225) = 192
    CRCTH(226) = 128
    CRCTH(227) = 65
    CRCTH(228) = 0
    CRCTH(229) = 193
    CRCTH(230) = 129
    CRCTH(231) = 64
    CRCTH(232) = 0
    CRCTH(233) = 193
    CRCTH(234) = 129
    CRCTH(235) = 64
    CRCTH(236) = 1
    CRCTH(237) = 192
    CRCTH(238) = 128
    CRCTH(239) = 65
    CRCTH(240) = 0
    CRCTH(241) = 193
    CRCTH(242) = 129
    CRCTH(243) = 64
    CRCTH(244) = 1
    CRCTH(245) = 192
    CRCTH(246) = 128
    CRCTH(247) = 65
    CRCTH(248) = 1
    CRCTH(249) = 192
    CRCTH(250) = 128
    CRCTH(251) = 65
    CRCTH(252) = 0
    CRCTH(253) = 193
    CRCTH(254) = 129
    CRCTH(255) = 64
    
    
    'CRC table for calculate with polynom 0xA001 with init value 0xFFFF, Low half word
    
    CRCTL(0) = 0
    CRCTL(1) = 192
    CRCTL(2) = 193
    CRCTL(3) = 1
    CRCTL(4) = 195
    CRCTL(5) = 3
    CRCTL(6) = 2
    CRCTL(7) = 194
    CRCTL(8) = 198
    CRCTL(9) = 6
    CRCTL(10) = 7
    CRCTL(11) = 199
    CRCTL(12) = 5
    CRCTL(13) = 197
    CRCTL(14) = 196
    CRCTL(15) = 4
    CRCTL(16) = 204
    CRCTL(17) = 12
    CRCTL(18) = 13
    CRCTL(19) = 205
    CRCTL(20) = 15
    CRCTL(21) = 207
    CRCTL(22) = 206
    CRCTL(23) = 14
    CRCTL(24) = 10
    CRCTL(25) = 202
    CRCTL(26) = 203
    CRCTL(27) = 11
    CRCTL(28) = 201
    CRCTL(29) = 9
    CRCTL(30) = 8
    CRCTL(31) = 200
    CRCTL(32) = 216
    CRCTL(33) = 24
    CRCTL(34) = 25
    CRCTL(35) = 217
    CRCTL(36) = 27
    CRCTL(37) = 219
    CRCTL(38) = 218
    CRCTL(39) = 26
    CRCTL(40) = 30
    CRCTL(41) = 222
    CRCTL(42) = 223
    CRCTL(43) = 31
    CRCTL(44) = 221
    CRCTL(45) = 29
    CRCTL(46) = 28
    CRCTL(47) = 220
    CRCTL(48) = 20
    CRCTL(49) = 212
    CRCTL(50) = 213
    CRCTL(51) = 21
    CRCTL(52) = 215
    CRCTL(53) = 23
    CRCTL(54) = 22
    CRCTL(55) = 214
    CRCTL(56) = 210
    CRCTL(57) = 18
    CRCTL(58) = 19
    CRCTL(59) = 211
    CRCTL(60) = 17
    CRCTL(61) = 209
    CRCTL(62) = 208
    CRCTL(63) = 16
    CRCTL(64) = 240
    CRCTL(65) = 48
    CRCTL(66) = 49
    CRCTL(67) = 241
    CRCTL(68) = 51
    CRCTL(69) = 243
    CRCTL(70) = 242
    CRCTL(71) = 50
    CRCTL(72) = 54
    CRCTL(73) = 246
    CRCTL(74) = 247
    CRCTL(75) = 55
    CRCTL(76) = 245
    CRCTL(77) = 53
    CRCTL(78) = 54
    CRCTL(79) = 244
    CRCTL(80) = 60
    CRCTL(81) = 252
    CRCTL(82) = 253
    CRCTL(83) = 61
    CRCTL(84) = 255
    CRCTL(85) = 63
    CRCTL(86) = 62
    CRCTL(87) = 254
    CRCTL(88) = 250
    CRCTL(89) = 58
    CRCTL(90) = 59
    CRCTL(91) = 251
    CRCTL(92) = 57
    CRCTL(93) = 249
    CRCTL(94) = 248
    CRCTL(95) = 56
    CRCTL(96) = 40
    CRCTL(97) = 232
    CRCTL(98) = 233
    CRCTL(99) = 41
    CRCTL(100) = 235
    CRCTL(101) = 43
    CRCTL(102) = 42
    CRCTL(103) = 234
    CRCTL(104) = 238
    CRCTL(105) = 46
    CRCTL(106) = 47
    CRCTL(107) = 239
    CRCTL(108) = 45
    CRCTL(109) = 237
    CRCTL(110) = 236
    CRCTL(111) = 44
    CRCTL(112) = 228
    CRCTL(113) = 36
    CRCTL(114) = 37
    CRCTL(115) = 229
    CRCTL(116) = 39
    CRCTL(117) = 231
    CRCTL(118) = 230
    CRCTL(119) = 38
    CRCTL(120) = 34
    CRCTL(121) = 226
    CRCTL(122) = 227
    CRCTL(123) = 35
    CRCTL(124) = 225
    CRCTL(125) = 33
    CRCTL(126) = 32
    CRCTL(127) = 224
    CRCTL(128) = 160
    CRCTL(129) = 96
    CRCTL(130) = 97
    CRCTL(131) = 161
    CRCTL(132) = 99
    CRCTL(133) = 163
    CRCTL(134) = 162
    CRCTL(135) = 98
    CRCTL(136) = 102
    CRCTL(137) = 166
    CRCTL(138) = 167
    CRCTL(139) = 103
    CRCTL(140) = 165
    CRCTL(141) = 101
    CRCTL(142) = 100
    CRCTL(143) = 164
    CRCTL(144) = 108
    CRCTL(145) = 172
    CRCTL(146) = 173
    CRCTL(147) = 109
    CRCTL(148) = 175
    CRCTL(149) = 111
    CRCTL(150) = 110
    CRCTL(151) = 174
    CRCTL(152) = 170
    CRCTL(153) = 106
    CRCTL(154) = 107
    CRCTL(155) = 171
    CRCTL(156) = 105
    CRCTL(157) = 169
    CRCTL(158) = 168
    CRCTL(159) = 104
    CRCTL(160) = 120
    CRCTL(161) = 184
    CRCTL(162) = 185
    CRCTL(163) = 121
    CRCTL(164) = 187
    CRCTL(165) = 123
    CRCTL(166) = 122
    CRCTL(167) = 186
    CRCTL(168) = 190
    CRCTL(169) = 126
    CRCTL(170) = 127
    CRCTL(171) = 191
    CRCTL(172) = 125
    CRCTL(173) = 189
    CRCTL(174) = 188
    CRCTL(175) = 124
    CRCTL(176) = 180
    CRCTL(177) = 116
    CRCTL(178) = 117
    CRCTL(179) = 181
    CRCTL(180) = 119
    CRCTL(181) = 183
    CRCTL(182) = 182
    CRCTL(183) = 118
    CRCTL(184) = 114
    CRCTL(185) = 178
    CRCTL(186) = 179
    CRCTL(187) = 115
    CRCTL(188) = 177
    CRCTL(189) = 113
    CRCTL(190) = 112
    CRCTL(191) = 176
    CRCTL(192) = 80
    CRCTL(193) = 144
    CRCTL(194) = 145
    CRCTL(195) = 81
    CRCTL(196) = 147
    CRCTL(197) = 83
    CRCTL(198) = 82
    CRCTL(199) = 146
    CRCTL(200) = 150
    CRCTL(201) = 86
    CRCTL(202) = 87
    CRCTL(203) = 151
    CRCTL(204) = 85
    CRCTL(205) = 149
    CRCTL(206) = 148
    CRCTL(207) = 84
    CRCTL(208) = 156
    CRCTL(209) = 92
    CRCTL(210) = 93
    CRCTL(211) = 157
    CRCTL(212) = 95
    CRCTL(213) = 159
    CRCTL(214) = 158
    CRCTL(215) = 94
    CRCTL(216) = 90
    CRCTL(217) = 154
    CRCTL(218) = 155
    CRCTL(219) = 91
    CRCTL(220) = 153
    CRCTL(221) = 89
    CRCTL(222) = 88
    CRCTL(223) = 152
    CRCTL(224) = 136
    CRCTL(225) = 72
    CRCTL(226) = 73
    CRCTL(227) = 137
    CRCTL(228) = 75
    CRCTL(229) = 139
    CRCTL(230) = 138
    CRCTL(231) = 74
    CRCTL(232) = 78
    CRCTL(233) = 142
    CRCTL(234) = 143
    CRCTL(235) = 79
    CRCTL(236) = 141
    CRCTL(237) = 77
    CRCTL(238) = 76
    CRCTL(239) = 140
    CRCTL(240) = 68
    CRCTL(241) = 132
    CRCTL(242) = 133
    CRCTL(243) = 69
    CRCTL(244) = 135
    CRCTL(245) = 71
    CRCTL(246) = 70
    CRCTL(247) = 134
    CRCTL(248) = 130
    CRCTL(249) = 66
    CRCTL(250) = 67
    CRCTL(251) = 131
    CRCTL(252) = 65
    CRCTL(253) = 129
    CRCTL(254) = 128
    CRCTL(255) = 64
    
    
  • Re: Funzione Format(Hex(n(a)),"00") mi azzera gli esa 1A 2A fino a 9A

    Perfetto il risultato

    000) 000 192 193 001 195 003 002 194 198 006 007 199 005 197 196 
    
    015) 004 204 012 013 205 015 207 206 014 010 202 203 011 201 009 
    
    030) 008 200 216 024 025 217 027 219 218 026 030 222 223 031 221 
    
    045) 029 028 220 020 212 213 021 215 023 022 214 210 018 019 211 
    
    060) 017 209 208 016 240 048 049 241 051 243 242 050 054 246 247 
    
    075) 055 245 053 054 244 060 252 253 061 255 063 062 254 250 058 
    
    090) 059 251 057 249 248 056 040 232 233 041 235 043 042 234 238 
    
    105) 046 047 239 045 237 236 044 228 036 037 229 039 231 230 038 
    
    120) 034 226 227 035 225 033 032 224 160 096 097 161 099 163 162 
    
    135) 098 102 166 167 103 165 101 100 164 108 172 173 109 175 111 
    
    150) 110 174 170 106 107 171 105 169 168 104 120 184 185 121 187 
    
    165) 123 122 186 190 126 127 191 125 189 188 124 180 116 117 181 
    
    180) 119 183 182 118 114 178 179 115 177 113 112 176 080 144 145 
    
    195) 081 147 083 082 146 150 086 087 151 085 149 148 084 156 092 
    
    210) 093 157 095 159 158 094 090 154 155 091 153 089 088 152 136 
    
    225) 072 073 137 075 139 138 074 078 142 143 079 141 077 076 140 
    
    240) 068 132 133 069 135 071 070 134 130 066 067 131 065 129 128 
    
    255) 064 
    
    000) 00 C0 C1 01 C3 03 02 C2 C6 06 07 C7 05 C5 C4 
    
    015) 04 CC 0C 0D CD 0F CF CE 0E 0A CA CB 0B C9 09 
    
    030) 08 C8 D8 18 19 D9 1B DB DA 1A 1E DE DF 1F DD 
    
    045) 1D 1C DC 14 D4 D5 15 D7 17 16 D6 D2 12 13 D3 
    
    060) 11 D1 D0 10 F0 30 31 F1 33 F3 F2 32 36 F6 F7 
    
    075) 37 F5 35 36 F4 3C FC FD 3D FF 3F 3E FE FA 3A 
    
    090) 3B FB 39 F9 F8 38 28 E8 E9 29 EB 2B 2A EA EE 
    
    105) 2E 2F EF 2D ED EC 2C E4 24 25 E5 27 E7 E6 26 
    
    120) 22 E2 E3 23 E1 21 20 E0 A0 60 61 A1 63 A3 A2 
    
    135) 62 66 A6 A7 67 A5 65 64 A4 6C AC AD 6D AF 6F 
    
    150) 6E AE AA 6A 6B AB 69 A9 A8 68 78 B8 B9 79 BB 
    
    165) 7B 7A BA BE 7E 7F BF 7D BD BC 7C B4 74 75 B5 
    
    180) 77 B7 B6 76 72 B2 B3 73 B1 71 70 B0 50 90 91 
    
    195) 51 93 53 52 92 96 56 57 97 55 95 94 54 9C 5C 
    
    210) 5D 9D 5F 9F 9E 5E 5A 9A 9B 5B 99 59 58 98 88 
    
    225) 48 49 89 4B 8B 8A 4A 4E 8E 8F 4F 8D 4D 4C 8C 
    
    240) 44 84 85 45 87 47 46 86 82 42 43 83 41 81 80 
    
    255) 40
  • Re: Funzione Format(Hex(n(a)),"00") mi azzera gli esa 1A 2A fino a 9A

    Per quale strano motivo non passi i buffer ad una sola funzione?

    E poi, i valori degli array puoi scriverli in esadecimale in una stringa e usare un ciclo con poche righe per inizializzare i due array

  • Re: Funzione Format(Hex(n(a)),"00") mi azzera gli esa 1A 2A fino a 9A

    Esatto perchè ci ho perso due giorni su questa cosa invece di chiedere prima

    questa come la tradurresti in VB6

    unsigned short ModBus_CRC16( unsigned char * Buffer, unsigned short Length )

    a parte le variabili unsigned che non si capisce perchè in VB non esistono per un INT da 16 bit si deve usare un long

  • Re: Funzione Format(Hex(n(a)),"00") mi azzera gli esa 1A 2A fino a 9A

    Perchè

    curcrc = CRCHi * 256 + CRCLo

    genera overflow error

    invece

    scritta così non genera errore

    curcrc = 256
    curcrc = curcrc * CRCHi + CRCLo

    sono inizzializzate e dichiarate così

    Dim CRCHi As Byte
    Dim CRCLo As Byte
    Dim curcrc As Long

  • Re: Funzione Format(Hex(n(a)),"00") mi azzera gli esa 1A 2A fino a 9A

    VB6 e C sono linguaggi diversi, con diversi target, ovviamente non puoi avere le stesse caratteristiche.

    Un esempio da cui prendere spunto

    Public Sub test()
        Dim buffer(0 To 255) As Byte
        Dim i As Integer
        
        For i = 0 To 255
            buffer(i) = i
        Next i
        
        Call CRC(buffer, 256)
    End Sub
    
    Public Sub CRC(arr() As Byte, arLen As Long)
        Dim i As Integer
        
        For i = 0 To arLen - 1
            Debug.Print Hex(arr(i)); " ";
        Next i
    End Sub
    
  • Re: Funzione Format(Hex(n(a)),"00") mi azzera gli esa 1A 2A fino a 9A

    Per generare l'array, puoi scrivere (ad esempio per la parte alta)

        Dim R As String
        Dim i As Integer
        
        R = "00C1814001C0804101C0804100C18140" & _
            "01C0804100C1814000C1814001C08041" & _
            "01C0804100C1814000C1814001C08041" & _
            "00C1814001C0804101C0804100C18140" & _
            "01C0804100C1814000C1814001C08041" & _
            "00C1814001C0804101C0804100C18140" & _
            "00C1814001C0804101C0804100C18140" & _
            "01C0804100C1814000C1814001C08041" & _
            "01C0804100C1814000C1814001C08041" & _
            "00C1814001C0804101C0804100C18140" & _
            "00C1814001C0804101C0804100C18140" & _
            "01C0804100C1814000C1814001C08041" & _
            "00C1814001C0804101C0804100C18140" & _
            "01C0804100C1814000C1814001C08041" & _
            "01C0804100C1814000C1814001C08041" & _
            "00C1814001C0804101C0804100C18140"
    
        For i = 0 To 511 Step 2
            CRCTH(i \ 2) = Val("&H" & Mid(R, i + 1, 2))
        Next i
    
  • Re: Funzione Format(Hex(n(a)),"00") mi azzera gli esa 1A 2A fino a 9A

    Ancora grazie oregon

    tanti spunti interessanti

    ultima cosa l' errore overflow

    a cosa è dovuto ? 

    essendo curcrc una variabile long

    non potrebbe dare overflow 255 * 256 = 65280 + 255 = 65535

  • Re: Funzione Format(Hex(n(a)),"00") mi azzera gli esa 1A 2A fino a 9A

    Quando hai quell'errore? Mostra sempre la riga di codice.

    P.S. per il prossimo problema apri una nuova discussione altrimenti diventa una chat. 

    Nel forum, un problema, una discussione

Devi accedere o registrarti per scrivere nel forum
10 risposte