void CIEC104SubLinkLayer::run_rx( PROTO_PARA_RX* rx ) { // 取数据到本地缓冲区 int iTmp; iTmp = this->m_env->m_RxBuf.GetReadableLen(); if( iTmp>0 ) { // 查找报文头 uint8 buf[MaxLen_Buf]; int len = MaxLen_Buf>iTmp?iTmp:MaxLen_Buf; int move; this->m_env->m_RxBuf.Read( buf,len, DONT_MOVEFWD ); for( move=0;move<len;move++ ) if( buf[move] == 0x68 ) break; if( move>=len ) // 没有找到报文头 { this->m_env->m_RxBuf.MoveReadP(move); return; } // 解析数据 CFrameLink frame; uint8 flag; if ((m_Flag & IEC104_FLAG_STARTDT) || m_dataTransflag) { flag = 1; } else flag = 0; KFprintf("%s-%d flag=%d\n",__FILE__,__LINE__,flag); frame.setstartDTFlag(flag); iTmp = frame.decode( buf+move,len-move ); m_StoppedRecIflagLink = frame.getStoppedRecIflag(); ////2018.5.28 zbc 开普测试 stopped状态下收到I帧要断连接 if(m_StoppedRecIflagLink != 0) if( iTmp < 0 )//错误 { // 检测是否无效帧 //if( this->m_env->m_RxBuf.GetReadableLen()>=MaxLen_Buf ) this->m_env->m_RxBuf.MoveReadP(move + ABS(iTmp)); //移动MOVE + ABS(iTmp) return; } else if( iTmp == 0 )//没有收够一个帧,不移动指针 { return; } m_env->AddRxFrames( 1,iTmp ); m_env->m_iRxRetFlag = 1; protocolCall.PutProtocolRxGram( rx->channo,buf+move,iTmp ); // 移动读指针 move +=iTmp; this->m_env->m_RxBuf.MoveReadP(move); GetUpTime(&m_lastRecvDataTime); //m_ifTestingLink = false; static int32 scount =0; // 处理.根据帧类型处理 uint8 frameType = frame.getFrameType(); if( frameType==FrameLink_Type_U ) { //通道测试确认帧 if( frame.getTestFrConf()==1 ) { m_Flag &= ~IEC104_FLAG_UT1; GetUpTime( &m_TimeOut_NoGram ); return; } //通道测试帧 if( frame.getTestFrAvai()!=0 ) { frame.setTestFrAvai( 0x00 ); frame.setTestFrConf( 0x01 ); KFprintf("%s:%d 104 m_iDataMgrNo=%d\n",__FILE__,__LINE__,m_env->m_iDataMgrNo); }
时间: 2024-04-06 16:30:39 浏览: 21
这是一个 C++ 类 `CIEC104SubLinkLayer` 的成员函数 `run_rx` 的代码实现。该函数的作用是从环境变量 `m_RxBuf` 中读取数据,并解析成 104 协议的帧数据,并将解析后的帧数据传递给上层协议处理。具体来说,该函数先通过 `m_RxBuf.GetReadableLen()` 获取当前缓冲区中可读取的字节数,并将其存储在 `iTmp` 变量中。如果 `iTmp` 大于 0,则创建一个长度为 `MaxLen_Buf` 的字节数组 `buf`,并从 `m_RxBuf` 中读取 `len` 个字节的数据到 `buf` 中。接着在 `buf` 中查找 0x68 字节,如果找到则解析帧数据,解析出错则忽略该帧。如果解析成功,则将解析得到的帧数据传递给上层协议处理,并将读指针移动到下一个待解析的数据帧的起始位置。最后,根据收到的帧类型处理,如果是测试帧则进行相应处理。
相关推荐
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)