打印
[STM32F1]

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

[复制链接]
1063|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
假石匠|  楼主 | 2016-1-3 19:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 假石匠 于 2016-1-3 19:49 编辑

在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

请教各位大侠!
沙发
diweo| | 2016-1-4 08:39 | 只看该作者
usCRC16 = usMBCRC16( ( UCHAR * ) pucSndBufferCur, usSndBufferCount );
已经把CRC的正确数值放到pucSndBufferCur对应偏移量的内存中了。
我感觉这个返回值其实用不着。

使用特权

评论回复
板凳
yklstudent| | 2016-1-4 09:05 | 只看该作者
diweo 发表于 2016-1-4 08:39
usCRC16 = usMBCRC16( ( UCHAR * ) pucSndBufferCur, usSndBufferCount );
已经把CRC的正确数值放到pucSndB ...

用不着,你去掉试试看是否还能正常工作

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝