这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 我写ModbusOnSTM32之一:CRC16

共14条 1/2 1 2 跳转至

我写ModbusOnSTM32之一:CRC16

高工
2013-03-03 21:23:43     打赏

本军爷写代码能力太弱,到现在看代码的能力远远强于写代码的能力。

比如一些东西,看文档知道了他的工作过程。可在敲键盘的时候却总是无从下手:

要定义什么样的结构体,定义什么样的变量,什么样的函数,每个函数实现什么功能,诸如这些我都不知道怎么弄。如果有人能把这些东西给我准备好,我绝对能直接填函数。可这个人不存在,俺是单打独斗的。

还是靠自己吧,找东西练手,参考别人代码写点东西的想法由此而生。

想起来年前时候看的那个MODBUS,这东西比较好玩。拿来练手应该没什么问题。


实际写起来,却又碰见了老问题了。眼高手低,写不出代码。

感觉写代码就像便秘了,憋了半天才憋出来那几行。硬着头皮写吧,便秘的人总不能一直不拉吧。。。


下边是段CRC是个参考,整个CRC的过程是这样的:

1 .装入一个16 位寄存器,所有数位均为1 。
2 .装16 位寄存器的低位字节与开始 8 位字节进行“ 异或” 运算。运算结果放入这个16 位寄
存器。
3 .把这个16 位寄存器向右移 1 位。
4 .若向右(标记位)移出的数位是 1 ,则生成多项式 1010000000000001 和这个寄存器进行
异或运算。若向右移出的数位是0 ,则返回(3 )。
5 .重复(3 )和(4 ),直到移出 8 位。
6 .另外8 位与该 16 位寄存器进行“异或” 运算。
7 .重复(3 )-(6 ),直至该报文所有字节均与 16 位寄存器进行“ 异或” 运算,并移位8 次。
8 .这个16 位寄存器的内容即是 2 字节CRC校验值。

于是有了下边的代码:

函数也是别人的,我的还没憋出来。贴这里只是为了以后的对比。

//Array: :进行校验的数据地址
//Rcvbuf    :输出CRC值的地址
//Len            :要进行CRC校验的数据字节数
//函数返回:16位CRC值
unsigned short crc_16(unsigned char *Array, unsigned char *Rcvbuf,unsigned int Len)
{
        unsigned int  IX,IY,CRC;
        CRC=0xFFFF;//16进制寄存器所有位置1

        if (Len<=0)
            CRC = 0;
        else
        {
            Len--;
            for (IX=0;IX<=Len;IX++)
            {
                CRC=CRC^(unsigned int)(Array[IX]);
                for(IY=0;IY<=7;IY++)
                {
                    if ((CRC&1)!=0 )
                        CRC=(CRC>>1)^0xA001;
                    else
                    CRC=CRC>>1;    //
                    }
                }
            }
        Rcvbuf[0] = (CRC & 0xff00)>>8;//高位置(CRCH)
        Rcvbuf[1] = (CRC & 0x00ff);  //低位置(CRCL)

        CRC= Rcvbuf[0]<<8;                    //重新获取CRC的值
        CRC+= Rcvbuf[1];
        return CRC;
}




关键词: 我写     ModbusOnSTM32     之一     CRC16    

高工
2013-03-03 21:25:08     打赏
2楼
看这行代码,跟前边的几条对比,一句一条。对的还挺合适。。。。。    

院士
2013-03-03 21:34:03     打赏
3楼

唉 军爷辛苦了。

但是代码需要提高的部分还是有的


军爷仍需要努力啊……


助工
2013-03-03 21:38:38     打赏
4楼
O(∩_∩)O~   能看懂别人的代码也是一种能力呀,O(∩_∩)O~ 

高工
2013-03-03 21:46:02     打赏
5楼
曾经有一个可以用到MODBUS的公司摆在我的面前,我没有珍惜,到了另一家公司,才后悔莫及,今天看你提起又让我伤心了,呵呵,看来这个的确用得比较多…………

高工
2013-03-03 21:57:07     打赏
6楼
看代码就想吃饭,写代码就如同拉屎。我便秘

院士
2013-03-03 21:59:25     打赏
7楼

这形容。

太牛X了...


高工
2013-03-03 22:00:16     打赏
8楼
modbus不就是个协议么?怎么还成公司了?难道还有公司专门弄modbus?

高工
2013-03-03 22:02:28     打赏
9楼
是不是很贴切?写个代码愁死了。明天准备准备串口的代码。

高工
2013-03-03 22:27:02     打赏
10楼
先顶。我可能要用51抄表头。modbus的。

共14条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]