接收处理
- /*帧检测*/
- 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 ) ;
- }
|