/** * \brief 从套接口中接受数据,并且拆包进行处理,在调用这个函数之前保证已经对套接口进行了轮询 * * \param needRecv 是否需要真正从套接口接受数据,false则不需要接收,只是处理缓冲中剩余的指令,true需要实际接收数据,然后才处理 * \return 接收是否成功,true表示接收成功,false表示接收失败,可能需要断开连接 */ bool zTCPTask::ListeningRecv(bool needRecv) { //Zebra::logger->debug("zTCPTask::ListeningRecv"); int retcode = 0; if (needRecv) { retcode = mSocket.recvToBuf_NoPoll(); } //struct timeval tv_2; if (-1 == retcode) { Zebra::logger->debug("zTCPTask::ListeningRecv -1"); Zebra::logger->error("zTCPTask::remoteport= %u localport = %u",mSocket.getPort(),mSocket.getLocalPort()); return false; } else { do { BYTE pstrCmd[zSocket::MAX_DATASIZE]; int nCmdLen = mSocket.recvToCmd_NoPoll(pstrCmd,sizeof(pstrCmd)); if (nCmdLen <= 0) //这里只是从缓冲取数据包,所以不会出错,没有数据直接返回 break; else { Cmd::t_NullCmd *pNullCmd = (Cmd::t_NullCmd *)pstrCmd; if (Cmd::CMD_NULL == pNullCmd->cmd && Cmd::PARA_NULL == pNullCmd->para) { //返回的测试指令,需要递减计数 //Zebra::logger->debug("服务端收到返回测试信号"); clearTick(); } else { msgParse(pNullCmd,nCmdLen); /* analysis.add(pNullCmd->cmd,pNullCmd->para,nCmdLen); // */ } } } while(true); } return true; }
int main(void) { static uint8_t oldPosition; static uint8_t divVal, modVal; cli(); wdt_disable(); set_sleep_mode( SLEEP_MODE_IDLE ); initDevice(); DDRD = 0b11111111; DDRB = 0b11111111; initTimer2(); initTimer0(); sei(); startTimer2(); startTimer0(); frame = buf1; buffer = buf2; CLEAR_BUFFER( frame ); CLEAR_BUFFER( buffer ); setAnimationFunction( anim_fillDot, TRUE, TRUE ); animation.loop = TRUE; while ( 1 ) { if( animation.tick ) { animationTick(); clearTick(); } if( currentScanPixel == 0 ) { if( animation.nextFrameReady ) { animationBufferSwap(); } } if( oldPosition != currentScanPixel ) { modVal = currentScanPixel % 8; //we need to change columns only so often if( modVal == 0 ) { divVal = currentScanPixel / 8; COL_PIXEL( divVal ); } if( frame[ divVal ] & _BV( modVal ) ) { ROW_PIXEL( modVal ); } else { ROW_OFF(); } oldPosition = currentScanPixel; } //if( TIME TO SLEEP ) { sleep_mode(); } } }