CRC16 en rebol
cr882520-Jul-2012/9:03:19+2:00
hello,
ayant mis en place des panneaux photovoltaiques
je voudrais maintenant récupérer automatiquement les données de ma production via les onduleurs SMA avec REBOL.
la connexion ce fait en bluetooth. j'ai donc configuré le RFCOMM sous linux pour avoir accès en serial au port RFCOMM0 de mon onduleur SMA.
pour ce faire j'ai trouvé un exemple de code via
https://code.google.com/p/sma-bluetooth/
il me manque la génération du checksum !!!
pourriez me dire si le code rebol est bien comme le code C
de la fonction pppfsc16 ci-dessous

merci d'avance
Rebol[]

fcstab: [#{0000} #{1189} #{2312} #{329B} #{4624} #{57AD} #{6536} #{74BF} #{8C48} #{9DC1} #{AF5A} #{BED3} #{CA6C} #{DBE5} #{E97E} #{F8F7} #{1081} #{0108} #{3393} #{221A} #{56A5} #{472C} #{75B7} #{643E} #{9CC9} #{8D40} #{BFDB} #{AE52} #{DAED} #{CB64} #{F9FF} #{E876} #{2102} #{308B} #{0210} #{1399} #{6726} #{76AF} #{4434} #{55BD} #{AD4A} #{BCC3} #{8E58} #{9FD1} #{EB6E} #{FAE7} #{C87C} #{D9F5} #{3183} #{200A} #{1291} #{0318} #{77A7} #{662E} #{54B5} #{453C} #{BDCB} #{AC42} #{9ED9} #{8F50} #{FBEF} #{EA66} #{D8FD} #{C974} #{4204} #{538D} #{6116} #{709F} #{0420} #{15A9} #{2732} #{36BB} #{CE4C} #{DFC5} #{ED5E} #{FCD7} #{8868} #{99E1} #{AB7A} #{BAF3} #{5285} #{430C} #{7197} #{601E} #{14A1} #{0528} #{37B3} #{263A} #{DECD} #{CF44} #{FDDF} #{EC56} #{98E9} #{8960} #{BBFB} #{AA72} #{6306} #{728F} #{4014} #{519D} #{2522} #{34AB} #{0630} #{17B9} #{EF4E} #{FEC7} #{CC5C} #{DDD5} #{A96A} #{B8E3} #{8A78} #{9BF1} #{7387} #{620E} #{5095} #{411C} #{35A3} #{242A} #{16B1} #{0738} #{FFCF} #{EE46} #{DCDD} #{CD54} #{B9EB} #{A862} #{9AF9} #{8B70} #{8408} #{9581} #{A71A} #{B693} #{C22C} #{D3A5} #{E13E} #{F0B7} #{0840} #{19C9} #{2B52} #{3ADB} #{4E64} #{5FED} #{6D76} #{7CFF} #{9489} #{8500} #{B79B} #{A612} #{D2AD} #{C324} #{F1BF} #{E036} #{18C1} #{0948} #{3BD3} #{2A5A} #{5EE5} #{4F6C} #{7DF7} #{6C7E} #{A50A} #{B483} #{8618} #{9791} #{E32E} #{F2A7} #{C03C} #{D1B5} #{2942} #{38CB} #{0A50} #{1BD9} #{6F66} #{7EEF} #{4C74} #{5DFD} #{B58B} #{A402} #{9699} #{8710} #{F3AF} #{E226} #{D0BD} #{C134} #{39C3} #{284A} #{1AD1} #{0B58} #{7FE7} #{6E6E} #{5CF5} #{4D7C} #{C60C} #{D785} #{E51E} #{F497} #{8028} #{91A1} #{A33A} #{B2B3} #{4A44} #{5BCD} #{6956} #{78DF} #{0C60} #{1DE9} #{2F72} #{3EFB} #{D68D} #{C704} #{F59F} #{E416} #{90A9} #{8120} #{B3BB} #{A232} #{5AC5} #{4B4C} #{79D7} #{685E} #{1CE1} #{0D68} #{3FF3} #{2E7A} #{E70E} #{F687} #{C41C} #{D595} #{A12A} #{B0A3} #{8238} #{93B1} #{6B46} #{7ACF} #{4854} #{59DD} #{2D62} #{3CEB} #{0E70} #{1FF9} #{F78F} #{E606} #{D49D} #{C514} #{B1AB} #{A022} #{92B9} #{8330} #{7BC7} #{6A4E} #{58D5} #{495C} #{3DE3} #{2C6A} #{1EF1} #{0F78}]


;define PPPINITFCS16 0xffff /* Initial FCS value    */
;define PPPGOODFCS16 0xf0b8 /* Good final FCS value */

;/*
; * Calculate a new fcs given the current fcs and the new data.
; */
;u16 pppfcs16(u16 fcs, void *_cp, int len)
;{
;    register unsigned char *cp = (unsigned char *)_cp;
;    /* don't worry about the efficiency of these asserts here.  gcc will
;     * recognise that the asserted expressions are constant and remove them.
;     * Whether they are usefull is another question.
;     */
;
;   ASSERT(sizeof (u16) == 2);
;    ASSERT(((u16) -1) > 0);
;    while (len--)
;        fcs = (fcs >> 8) ^ fcstab[(fcs ^ *cp++) & 0xff];
;    return (fcs);
;}


PPPINITFCS16: #{ffff}

pppfcs16: func[
    fcs
    thebinary
    len
    /local
    i
    x1
    x2
    x3
    x4
][
    ;verify that => binary length is of 2
    ;verify binary > 1;
    i: 1
    while [len > 0][
        print {fcs >> 8}
        probe x1: copy/part at fcs 2 1

        print {fcs ^ *cp++}
        probe x2: fcs xor (copy/part at thebinary i 1)

        print {((fcs ^ *cp++) & 0xff}
        probe x3: x2 and #{ff}
        probe x3: to-integer x3

        print {fcstab[(fcs ^ *cp++) & 0xff}
        probe  x4: fcstab/:x3

        ;fcs = (fcs >> 8) ^ fcstab[(fcs ^ *cp++) & 0xff]
        print rejoin ["fcs " i " => " ]
        probe fcs: x1 xor x4

        i: i + 1
        len: len - 1
    ]
    return fcs
] 
cr882520-Jul-2012/10:00:59+2:00
hello
i found an exemple for crc32 in rebol
http://www.rebol.org/view-script.r?script=rebzip.r

here is than the crc16

i check with
http://www.digsys.se/JavaScript/CRC.aspx
[rebol]
crc-tab-16: [0 4489 8978 12955 17956 22445 25910 29887 35912 40385 44890 48851 51820 56293 59774 63735 4225 264 13203 8730 22181 18220 30135 25662 40137 36160 49115 44626 56045 52068 63999 59510 8450 12427 528 5017 26406 30383 17460 21949 44362 48323 36440 40913 60270 64231 51324 55797 12675 8202 4753 792 30631 26158 21685 17724 48587 44098 40665 36688 64495 60006 55549 51572 16900 21389 24854 28831 1056 5545 10034 14011 52812 57285 60766 64727 34920 39393 43898 47859 21125 17164 29079 24606 5281 1320 14259 9786 57037 53060 64991 60502 39145 35168 48123 43634 25350 29327 16404 20893 9506 13483 1584 6073 61262 65223 52316 56789 43370 47331 35448 39921 29575 25102 20629 16668 13731 9258 5809 1848 65487 60998 56541 52564 47595 43106 39673 35696 33800 38273 42778 46739 49708 54181 57662 61623 2112 6601 11090 15067 20068 24557 28022 31999 38025 34048 47003 42514 53933 49956 61887 57398 6337 2376 15315 10842 24293 20332 32247 27774 42250 46211 34328 38801 58158 62119 49212 53685 10562 14539 2640 7129 28518 32495 19572 24061 46475 41986 38553 34576 62383 57894 53437 49460 14787 10314 6865 2904 32743 28270 23797 19836 50700 55173 58654 62615 32808 37281 41786 45747 19012 23501 26966 30943 3168 7657 12146 16123 54925 50948 62879 58390 37033 33056 46011 41522 23237 19276 31191 26718 7393 3432 16371 11898 59150 63111 50204 54677 41258 45219 33336 37809 27462 31439 18516 23005 11618 15595 3696 8185 63375 58886 54429 50452 45483 40994 37561 33584 31687 27214 22741 18780 15843 11370 7921 3960]

right-shift-8: func [
   "Right-shifts the value by 8 bits and returns it."
   value [integer!] "The value to shift"
][
   either negative? value [
      -1 xor value and -256 / 256 xor -1 and 255
   ][
      -256 and value / 256
   ]
]

update-crc: func [
   "Returns the data crc."
   data [any-string!]    "Data to checksum"
   crc [integer!] "Initial value"
][
   foreach char data [
      crc: (right-shift-8 crc) xor (pick crc-tab-16 crc and 255 xor char + 1)
   ]
]

crc-16: func [
   "Returns a CRC16 checksum."
   data [any-string!] "Data to checksum"
][
   either empty? data [
      #{0000}
   ][
      load join "#{" [to-hex -1 xor update-crc data -1 "}"]
   ]
]
[/rebol]
cr882520-Jul-2012/10:04:09+2:00
crc-16: func [ 
	"Returns a CRC16 checksum." 
	data [any-string!] "Data to checksum" 
][ 
	either empty? data [
		#{0000}
	][ 
		copy/part at load join "#{" [to-hex -1 xor update-crc data -1 "}"] 3 2
	] 
]

Login required to Post.


Powered by RebelBB and REBOL 2.7.8.4.2