OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3680|回复: 2

在STM32上移植FreeModbus,发送部分CRC校验的疑问

[复制链接]

3

主题

8

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-11-3
在线时间
4 小时
发表于 2016-1-3 19:38:59 | 显示全部楼层 |阅读模式
在STM32上移植FreeModbus,发现了个问题:当收到一帧数据,解析其中数据,并作相应处理,然后发送数据应答。在发送的数据里要做CRC校验,FreeModbus中应答CRC校验值是这样处理的,程序如下eMBErrorCode eMBRTUSend( UCHAR ucSlaveAddress, const UCHAR * pucFrame, USHORT usLength )
{

        pucSndBufferCur = ( UCHAR * ) pucFrame - 1;
        usSndBufferCount = 1;

        /* Now copy the Modbus-PDU into the Modbus-Serial-Line-PDU. */
        pucSndBufferCur[MB_SER_PDU_ADDR_OFF] = ucSlaveAddress;
        usSndBufferCount += usLength;

        /* Calculate CRC16 checksum for Modbus-Serial-Line-PDU. */
        usCRC16 = usMBCRC16( ( UCHAR * ) pucSndBufferCur, usSndBufferCount );
        ucRTUBuf[usSndBufferCount++] = ( UCHAR )( usCRC16 & 0xFF );    //CRC校验值应该放在pucSndBufferCur[usSndBufferCount++]
        ucRTUBuf[usSndBufferCount++] = ( UCHAR )( usCRC16 >> 8 );


}
程序没贴完,只截取主要部分。问题是:CRC校验值应该放在pucSndBufferCur[usSndBufferCount++] ,然后通过xMBPortSerialPutByte( ( CHAR )*pucSndBufferCur )发送出去才对呀!?
源码里是ucRTUBuf[usSndBufferCount++],发送函数没有发送ucRTUBuf[usSndBufferCount++]他呀!
反而是,在数据接收部分    if( ( usRcvBufferPos >= MB_SER_PDU_SIZE_MIN ) && ( usMBCRC16( ( UCHAR * ) ucRTUBuf, usRcvBufferPos ) == 0 ) )用到了ucRTUBuf


请教各位大侠!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-1-3 21:37:16 | 显示全部楼层
调试能用就行,没深究这个
回复 支持 反对

使用道具 举报

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2017-8-11
在线时间
14 小时
发表于 2018-3-24 19:05:21 | 显示全部楼层
最近在看这个,CRC校验部分没用弄懂,不知道能不能现在给指导下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 08:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表