本帖最后由 假石匠 于 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
请教各位大侠! |