接收处理
/*帧检测*/
u8 frm_cheak(_serialbuf_st *rx, _mbfrm_st *pfrm)
{
u16 t,len;
if( rx->len < 4 ) return res_ERR1;
len=rx->len;
rx->len = 0 ;
pfrm->addr=rx->buf[0];
if( pfrm->addr != local_addr ) return res_ERR2;
pfrm->crc= (u16)(rx->buf[ len-1]<<8) + (rx->buf[ len-2]) ;
t= usMBCRC16( rx->buf, len-2 );
if( pfrm->crc != t ) return res_ERR3;
pfrm->cmd=rx->buf[1];
pfrm->start=( u16)(rx->buf[2] <<8 ) + rx->buf[3] ;
pfrm->rlen= ( u16)(rx->buf[4] <<8 ) + rx->buf[5] ;
if( pfrm->start > 0x7d) return res_ERR4;//超出地址
if( pfrm->rlen + pfrm->start > 0x7d) return res_ERR5;//超出长度
return res_OK;
}
//接收
u8 smb_recvHoldingReg( _mbdata_st *pmb )
{
u8 rel;
u16 temp ;
_mbfrm_st frm;
rel=frm_cheak( &serialRXbuf_st , &frm);
if( rel == res_OK)
{
mb_setMODRXorTX(0);//转为发送模式
//延时,给主机准备时间
delay_ms(10);
pmb->len = frm.rlen;
pmb->start = frm.start;
switch( frm.cmd)
{
case 0x03://读寄存器
mb_sentfor_readHoldingReg( *pmb );
break ;
case 0x10://写寄存器
mb_sentfor_writeHoldingReg( pmb);
break ;
}
mb_setMODRXorTX(0);//转为接收模式
}
else
if(rel == res_ERR3)
{
mb_sentACK( frm.cmd , rel) ;
}
return rel;
}
/*主循环调用*/
void mb_poll()
{
smb_recvHoldingReg( &HoldingReg_st ) ;
}
|