请教modbus协议中的lrc算法 点击:3025 | 回复:7



szais

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 7回
  • 年度积分:0
  • 历史总积分:19
  • 注册:2001年11月23日
发表于:2002-11-20 13:36:00
楼主
lrc算法通过vc来编写,是按照手册上的例子来做的,可惜结果就是不对。有哪位高手知道到底该怎样写,有例子吗?



YYFXJ

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 28回
  • 年度积分:0
  • 历史总积分:40
  • 注册:2003年11月01日
发表于:2002-05-27 14:23:00
1楼
老大: 应该是CRC校验算法吧。

szais

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 7回
  • 年度积分:0
  • 历史总积分:19
  • 注册:2001年11月23日
发表于:2002-05-28 15:00:00
2楼
哥们: 我用的是asc模式,不是rtu模式,rtu模式用的是crc算法,这个小弟已经搞定了。asc模式用的是lrc算法,小弟怎么也算不出来,见笑了。 有一例子: 某命令串为":010200000001FC" 其16进制为“3A 30 31 30 32 30 30 30 30 30 30 30 31 46 43 0D 0A”。其中第一个为起始符,2-13为数据,14-15即“FC”为LRC校验码,有人能告诉我FC是如何算出来的吗?

秋水

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 5回
  • 年度积分:0
  • 历史总积分:73
  • 注册:2002年9月02日
发表于:2002-11-20 09:21:00
3楼
这位兄长,你能不能给我通过VC编写的CRC算法,知道有些唐突,但还是希望得到你的帮助

丁喜

  • 精华:0帖
  • 求助:0帖
  • 帖子:29帖 | 924回
  • 年度积分:0
  • 历史总积分:1640
  • 注册:2002年8月30日
发表于:2002-11-20 13:24:00
4楼
将帧的内容,除去头代码,用十六进制表示,求和,模FF,然后取补码,以ASCII码表示即可。 例如:ASCII帧 3A 30 31 30 32 30 30 30 30 30 30 30 31 46 43 0D 0A 将校验内容用十六进制表示为: 00 01 00 02 00 00 00 00 00 00 00 01 将以上数值用十六进制求和,模FF: 00+01+00+02+00+00+00+00+00+00+00+01=04=0000 0100 取反:1111 1011 加1: 1111 1100 十六进制变换:F C ASCII码:46 43 LRC就是这样算出来的,明白?

gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2002-11-20 13:36:00
5楼
static unsigned char LRC(auchMsg,usDataLen) unsigned char *auchMsg ; /* 要进行计算的消息 */ unsigned short usDataLen ; /* LRC 要处理的字节的数量*/ { unsigned char uchLRC = 0 ; /* LRC 字节初始化 */ while (usDataLen--) /* 传送消息 */ uchLRC += *auchMsg++ ; /* 累加*/ return ((unsigned char)(-((char_uchLRC))) ; }

yangfan19992001

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 33回
  • 年度积分:0
  • 历史总积分:90
  • 注册:2006年11月12日
发表于:2010-01-02 13:27:11
6楼

16进制运算:01+02+00+00+00+01=04H

04H=00000100B

取反得:11111011

再加1得:11111100(2进制)=FC(16进制)

WUZHONGQING

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 8回
  • 年度积分:0
  • 历史总积分:46
  • 注册:2009年8月11日
发表于:2011-01-19 15:34:10
7楼

楼上的说的对,就是这样的


热门招聘
相关主题

官方公众号

智造工程师