コード例 #1
0
ファイル: Dynamixel.cpp プロジェクト: chcbaram/OpenCM9.04
void Dynamixel::printBuffer(byte *bpPrintBuffer, byte bLength)
{
#ifdef	PRINT_OUT_TRACE_ERROR_PRINT_TO_USART2
    byte bCount;
    if(bLength == 0)
    {
        if(mTxBuffer[2] == BROADCAST_ID)
        {
            TxDStringC("\r\n No Data[at Broadcast ID 0xFE]");
        }
        else
        {
            TxDStringC("\r\n No Data(Check ID, Operating Mode, Baud rate)");//TxDString("\r\n No Data(Check ID, Operating Mode, Baud rate)");
        }
    }
    for(bCount = 0; bCount < bLength; bCount++)
    {
        TxDHex8C(bpPrintBuffer[bCount]);
        TxDByteC(' ');
    }
    TxDStringC(" LEN:");//("(LEN:")
    TxDHex8C(bLength);
    TxDStringC("\r\n");
#endif
}
コード例 #2
0
ファイル: dxl.c プロジェクト: jwatte/ROBOTIS_CM9_Series
void PrintBuffer(byte *bpPrintBuffer, byte bLength)
{
	byte bCount;
	if(bLength == 0)
	{
		if(gbpTxBuffer[2] == BROADCAST_ID)
		{
			TxDStringC("\r\n No Data[at Broadcast ID 0xFE]");
		}
		else
		{
			TxDStringC("\r\n No Data(Check ID, Operating Mode, Baud rate)");//TxDString("\r\n No Data(Check ID, Operating Mode, Baud rate)");
		}
	}
	for(bCount = 0; bCount < bLength; bCount++)
	{
		TxDHex8C(bpPrintBuffer[bCount]);
		TxDByteC(' ');
	}
	TxDStringC(" LEN:");//("(LEN:")
	TxDHex8C(bLength);
	TxDStringC("\r\n");
}
コード例 #3
0
ファイル: Dynamixel.cpp プロジェクト: chcbaram/OpenCM9.04
byte Dynamixel::txRxPacket(byte bID, byte bInst, int bTxParaLen) {

    mDXLtxrxStatus = 0;

    word bTxLen, bRxLenEx, bTryCount;

    mBusUsed = 1;
    mRxLength = bRxLenEx = bTxLen = 0;

    for(bTryCount = 0; bTryCount < gbDXLNumberTxRxAttempts; bTryCount++)//for(bTryCount = 0; bTryCount < TRY_NUM; bTryCount++)
    {
        //gbDXLReadPointer = gbDXLWritePointer;
        mDxlDevice->read_pointer = mDxlDevice->write_pointer;//[ROBOTIS]BufferClear050728
        /**************************************   Transfer packet  ***************************************************/
        bTxLen = this->txPacket(bID, bInst, bTxParaLen);

        if(mPacketType == DXL_PACKET_TYPE1) { //Dxl 1.0 Tx success ?
            if (bTxLen == (bTxParaLen+4+2))	mDXLtxrxStatus = (1<<COMM_TXSUCCESS);
        } else { //Dxl 2.0 Tx success?
            if (bTxLen == (bTxParaLen+3+7))	mDXLtxrxStatus = (1<<COMM_TXSUCCESS);
        }
        //TxDStringC("bTxLen = ");TxDHex8C(bTxLen);TxDStringC("\r\n");
        if(bInst == INST_PING) {
            if(mPacketType == DXL_PACKET_TYPE1) { //Dxl 1.0
                if(bID == BROADCAST_ID)	mRxLength = bRxLenEx = 0xff;
                else mRxLength = bRxLenEx = 6; // basic response packet length
            } else { //Dxl 2.0
                if(bID == BROADCAST_ID)	mRxLength = bRxLenEx = 0xffff;
                else mRxLength = bRxLenEx = 14;
            }

        }
        else if(bInst == INST_READ) {
            if (gbDXLStatusReturnLevel > 0) {
                if(mPacketType == DXL_PACKET_TYPE1) mRxLength = bRxLenEx = 6+mParamBuffer[1];
                else mRxLength = bRxLenEx = 11+DXL_MAKEWORD(mParamBuffer[2], mParamBuffer[3]);
            }
            else {
                mRxLength = bRxLenEx = 0;
            }

        }
        else if( bID == BROADCAST_ID ) {
            if(bInst == INST_SYNC_READ || bInst == INST_BULK_READ) mRxLength = bRxLenEx = 0xffff; //only 2.0 case
            else mRxLength = bRxLenEx = 0; // no response packet
        }
        else {
            if (gbDXLStatusReturnLevel>1) {
                if(mPacketType == DXL_PACKET_TYPE1) mRxLength = bRxLenEx = 6;//+mParamBuffer[1];
                else mRxLength = bRxLenEx = 11;
            }
            else {
                mRxLength = bRxLenEx = 0;
            }
        }


        if(bRxLenEx) {
            if(SmartDelayFlag == 1)
                delay(150);
            /**************************************   Receive packet  ***************************************************/
            mRxLength = this->rxPacket(bRxLenEx);

        }//bRxLenEx is exist
    } //for() gbDXLNumberTxRxAttempts

    //TxDStringC("\r\n TEST POINT 2");//TxDString("\r\n Err ID:0x");
    mBusUsed = 0;

    if((mRxLength != bRxLenEx) && (mTxBuffer[mPktIdIndex] != BROADCAST_ID))
    {
        //TxDByteC('3');//
        //TxDStringC("Rx Error\r\n");//TxDString("\r\n Err ID:0x");
#ifdef	PRINT_OUT_COMMUNICATION_ERROR_TO_USART2
        //TxDString("\r\n Err ID:0x");
        //TxDHex8(bID);
        TxDStringC("\r\n ->[DXL]Err: ");
        printBuffer(mTxBuffer,bTxLen);
        TxDStringC("\r\n <-[DXL]Err: ");
        printBuffer(mRxBuffer,mRxLength);
#endif

#ifdef	PRINT_OUT_TRACE_ERROR_PRINT_TO_USART2
        //TxDString("\r\n {[ERROR:");TxD16Hex(0x8100);TxDByte(':');TxD16Hex(bID);TxDByte(':');TxD8Hex(bInst);TxDByte(']');TxDByte('}');
        //TxDByte(bID);TxDByte(' ');
        //TxDByte(bInst);TxDByte(' ');
        //TxDByte(gbpParameter[0]);TxDByte(' ');
        //TxDByte(gbpParameter[1]);TxDByte(' ');
#endif
        return 0;
    } else if((mRxLength == 0) && (mTxBuffer[mPktInstIndex] == INST_PING)) { //[ROBOTIS] 2013-11-22 correct response for ping instruction
        //return 0;
    }
    //TxDString("\r\n TEST POINT 4");//TxDString("\r\n Err ID:0x");
#ifdef PRINT_OUT_PACKET_TO_USART2
    TxDStringC("\r\n ->[TX Buffer]: ");
    printBuffer(mTxBuffer,bTxLen);
    TxDStringC("\r\n <-[RX Buffer]: ");
    printBuffer(mRxBuffer,mRxLength);
#endif
    mDXLtxrxStatus = (1<<COMM_RXSUCCESS);

    //gbLengthForPacketMaking =0;
    return 1;
}
コード例 #4
0
ファイル: Dynamixel.cpp プロジェクト: chcbaram/OpenCM9.04
byte Dynamixel::rxPacket(int bRxLength) {
    unsigned long ulCounter, ulTimeLimit;
    word bCount, bLength, bChecksum;
    byte bTimeout;


    bTimeout = 0;
    if(bRxLength == 255 || bRxLength == 0xffff) //2014-04-03
        ulTimeLimit = RX_TIMEOUT_COUNT1;
    else
        ulTimeLimit = RX_TIMEOUT_COUNT2;
    for(bCount = 0; bCount < bRxLength; bCount++)
    {
        ulCounter = 0;
        while(mDxlDevice->read_pointer == mDxlDevice->write_pointer)
        {
            nDelay(NANO_TIME_DELAY); //[ROBOTIS] porting ydh
            if(ulCounter++ > ulTimeLimit)
            {
                bTimeout = 1;
                //TxDStringC("Timeout\r\n");
                break;
            }
            uDelay(0); //[ROBOTIS] porting ydh added  //if exist DXL 1.0 -> ok DXL 2.0 -> ok, if not exist 1.0 not ok, 2.0 ok
        }
        if(bTimeout) break;
        mRxBuffer[bCount] = mDxlDevice->data_buffer[mDxlDevice->read_pointer++ & DXL_RX_BUF_SIZE]; // get packet data from USART device
        //TxDStringC("mRxBuffer = ");TxDHex8C(mRxBuffer[bCount]);TxDStringC("\r\n");
    }

    bLength = bCount;
    bChecksum = 0;
    if( mTxBuffer[mPktIdIndex] != BROADCAST_ID )
    {
        if(bTimeout && bRxLength != 255)
        {
#ifdef PRINT_OUT_COMMUNICATION_ERROR_TO_USART2
            TxDStringC("Rx Timeout");
            TxDByteC(bLength);
#endif
            mDXLtxrxStatus |= (1<<COMM_RXTIMEOUT);
            clearBuffer();
            //TxDStringC("Rx Timeout");
            return 0;
        }
        if(bLength > 3) //checking available length.
        {
            /*if(mPacketType == 1){
            	if(mRxBuffer[0] != 0xff || mRxBuffer[1] != 0xff ) mDXLtxrxStatus |= (1<<COMM_RXCORRUPT);//RXHEADER);
            	else if(mRxBuffer[mPktIdIndex] != mTxBuffer[mPktIdIndex] ) mDXLtxrxStatus |= (1<<COMM_RXCORRUPT);//RXID);
            	else if(mRxBuffer[mPktLengthIndex] != bLength-mPktInstIndex) mDXLtxrxStatus |= (1<<COMM_RXCORRUPT);//RXLENGTH);
            	else{
            		for(bCount = 2; bCount < bLength; bCount++){
            			bChecksum += mRxBuffer[bCount]; //Calculate checksum of received data for compare
            		}
            		if(bChecksum != 0xff) mDXLtxrxStatus |= (1<<COMM_RXCORRUPT);//RXCHECKSUM);
            		return 0;
            	}
            }else{
            	if(mRxBuffer[0] != 0xff || mRxBuffer[1] != 0xff || mRxBuffer[2] != 0xfd)  mDXLtxrxStatus |= (1<<COMM_RXCORRUPT);//RXHEADER);
            	else if(mRxBuffer[mPktIdIndex] != mTxBuffer[mPktIdIndex] ) mDXLtxrxStatus |= (1<<COMM_RXCORRUPT);//RXID);
            	else if(mRxBuffer[mPktLengthIndex] != bLength-mPktInstIndex) mDXLtxrxStatus |= (1<<COMM_RXCORRUPT);//RXLENGTH);
            	else{
            		bChecksum = DXL_MAKEWORD(mRxBuffer[bRxLength-2], mRxBuffer[bRxLength-1]);
            		if(update_crc(0, mRxBuffer, bRxLength-2) != bChecksum) mDXLtxrxStatus |= (1<<COMM_RXCORRUPT);//RXCHECKSUM);
            		return 0;
            	}
            }
            */
            if(mPacketType == 1) { //Dxl 1.0 header check
                if(mRxBuffer[0] != 0xff || mRxBuffer[1] != 0xff ) {
#ifdef PRINT_OUT_COMMUNICATION_ERROR_TO_USART2
                    TxDStringC("Wrong Header");//[Wrong Header]
#endif
                    mDXLtxrxStatus |= (1<<COMM_RXCORRUPT);//RXHEADER);
                    clearBuffer();
                    return 0;
                }
            } else { // Dxl 2.0 header check
                if(mRxBuffer[0] != 0xff || mRxBuffer[1] != 0xff || mRxBuffer[2] != 0xfd)
                {
#ifdef PRINT_OUT_COMMUNICATION_ERROR_TO_USART2
                    TxDStringC("Wrong Header");//[Wrong Header]
#endif
                    mDXLtxrxStatus |= (1<<COMM_RXCORRUPT);//RXHEADER);
                    clearBuffer();
                    return 0;
                }
            }

            if(mRxBuffer[mPktIdIndex] != mTxBuffer[mPktIdIndex] )  //id check
            {
#ifdef PRINT_OUT_COMMUNICATION_ERROR_TO_USART2
                TxDStringC("[Error:TxID != RxID]");
#endif
                mDXLtxrxStatus |= (1<<COMM_RXCORRUPT);//RXID);
                clearBuffer();
                return 0;
            }

            if(mRxBuffer[mPktLengthIndex] != bLength-mPktInstIndex) // status packet length check
            {
#ifdef PRINT_OUT_COMMUNICATION_ERROR_TO_USART2
                TxDStringC("RxLength Error");
#endif
                mDXLtxrxStatus |= (1<<COMM_RXCORRUPT);//RXLENGTH);
                clearBuffer();
                return 0;
            }

            if(mPacketType == 1 && mRxBuffer[mPktErrorIndex] != 0) {										//140512 shin
#ifdef PRINT_OUT_COMMUNICATION_ERROR_TO_USART2
                for(bTryCount = 0; bTryCount<= 6; bTryCount++) {
                    if((mRxBuffer[mPktErrorIndex] & (1<<bTryCount)) == TRUE) {
                        switch(bTryCount) {
                        case 0:
                            TxDStringC("InputVoltage Error");
                            break;
                        case 1:
                            TxDStringC("Angle Limit Error");
                            break;
                        case 2:
                            TxDStringC("Overheating Error");
                            break;
                        case 3:
                            TxDStringC("Range Error");
                            break;
                        case 4:
                            TxDStringC("Checksum Error");
                            break;
                        case 5:
                            TxDStringC("Overload Error");
                            break;
                        case 6:
                            TxDStringC("Instruction Error");
                            break;
                        }
                    }
                }
#endif
            } else {																					//140512 shin
#ifdef PRINT_OUT_COMMUNICATION_ERROR_TO_USART2
                for(bTryCount = 1; bTryCount<= 7; bTryCount++) {
                    if((mRxBuffer[mPktErrorIndex]) == bTryCount) {
                        switch(bTryCount) {
                        case 1:
                            TxDStringC("Result Fail");
                            break;
                        case 2:
                            TxDStringC("Instruction Error");
                            break;
                        case 3:
                            TxDStringC("CRC Error");
                            break;
                        case 4:
                            TxDStringC("DataRange Error");
                            break;
                        case 5:
                            TxDStringC("DataLength Error");
                            break;
                        case 6:
                            TxDStringC("DataLimit Error");
                            break;
                        case 7:
                            TxDStringC("Accrss Error");
                            break;
                        }
                    }
                }
#endif
            }

            if(mPacketType == 1) { // Dxl 1.0 checksum
                for(bCount = 2; bCount < bLength; bCount++) {
                    bChecksum += mRxBuffer[bCount]; //Calculate checksum of received data for compare
                }
                if(bChecksum != 0xff)
                {
#ifdef PRINT_OUT_COMMUNICATION_ERROR_TO_USART2
                    TxDStringC("[RxChksum Error]");
#endif
                    mDXLtxrxStatus |= (1<<COMM_RXCORRUPT);//RXCHECKSUM);
                    clearBuffer();
                    return 0;
                }
            } else { // Dxl 2.0 checksum
                bChecksum = DXL_MAKEWORD(mRxBuffer[bRxLength-2], mRxBuffer[bRxLength-1]);
                if(update_crc(0, mRxBuffer, bRxLength-2) == bChecksum) { // -2 : except CRC16
                    return bLength;
                }
                else {
#ifdef PRINT_OUT_COMMUNICATION_ERROR_TO_USART2
                    TxDStringC("CRC-16 Error\r\n");
#endif
                    return 0;
                }
            }//end of checksum
        }//(bLength > 3)
    }//end of Rx status packet check

    return bLength;
}
コード例 #5
0
ファイル: Dynamixel.cpp プロジェクト: tician/ROBOTIS-OpenCM
byte Dynamixel::txRxPacket(byte bID, byte bInst, byte bTxParaLen){

//#define TRY_NUM 2//;;2

	mDXLtxrxStatus = 0;

	byte bTxLen, bRxLenEx, bTryCount;

	mBusUsed = 1;
	mRxLength = bRxLenEx = 0;

	for(bTryCount = 0; bTryCount < gbDXLNumberTxRxAttempts; bTryCount++)//for(bTryCount = 0; bTryCount < TRY_NUM; bTryCount++)
	{
		//gbDXLReadPointer = gbDXLWritePointer;
		mDxlDevice->read_pointer = mDxlDevice->write_pointer;//[ROBOTIS]BufferClear050728
		bTxLen = this->txPacket(bID, bInst, bTxParaLen);

		if (bTxLen == (bTxParaLen+4+2)){
			mDXLtxrxStatus = (1<<COMM_TXSUCCESS);
		}
//		else{
//			return 0;
//		}

		if(bInst == INST_PING){
			if(bID == BROADCAST_ID){
				mRxLength = bRxLenEx = 255; //
			}
			else{
				mRxLength = bRxLenEx = 6; // basic response packet length
			}
		}
		else if(bInst == INST_READ){
			//mRxLength = bRxLenEx = 6+mParamBuffer[1]; // basic response packet length + requested data length in read instruction
			if (gbDXLStatusReturnLevel>0)
				mRxLength = bRxLenEx = 6+mParamBuffer[1];
			else
				mRxLength = bRxLenEx = 0;

		}
		else if( bID == BROADCAST_ID ){
			mRxLength = bRxLenEx = 0; // no response packet in case broadcast id
			break;
		}
		else{
			//mRxLength = bRxLenEx = 6; //basic response packet length
			if (gbDXLStatusReturnLevel>1)
				mRxLength = bRxLenEx = 6+mParamBuffer[1];
			else
				mRxLength = bRxLenEx = 0;
		}


		if(bRxLenEx){//(gbpValidServo[bID] > 0x81 || bInst != INST_WRITE)) //ValidServo = 0x80|RETURN_LEVEL
			mRxLength = this->rxPacket(bRxLenEx);
			//TxDStringC("gbRxLength = ");TxDHex8C(mRxLength);TxDStringC("\r\n");
			//TxDStringC("bRxLenEx = ");TxDHex8C(bRxLenEx);TxDStringC("\r\n");
			//      if(gbRxLength != bRxLenEx) //&& bRxLenEx != 255) before Ver 1.11e
			if((mRxLength != bRxLenEx) && (bRxLenEx != 255)) // after Ver 1.11f
			{
				//TxDStringC(" Length mismatch!!\r\n");
				unsigned long ulCounter;
				word wTimeoutCount;
				ulCounter = 0;
				wTimeoutCount = 0;
				//TxDStringC("\r\n TEST POINT 0");
				while(ulCounter++ < RX_TIMEOUT_COUNT2)
				{
					//if(gbDXLReadPointer != gbDXLWritePointer)
					if(this->available())  //data is available in dxl bus
					{
						mDxlDevice->read_pointer = mDxlDevice->write_pointer;// gbDXLWritePointer; //BufferClear
						ulCounter = 0;
						if(wTimeoutCount++ > 100 )
						{
							//uDelay(0);// porting ydh added
							break; //porting ydh 100->245 //;;;;;; min max µÚ¹Ù²ñ found at Ver 1.11e
						}
						nDelay(NANO_TIME_DELAY);// porting ydh added 20120210.
					}
					//uDelay(0);// porting ydh added
					nDelay(NANO_TIME_DELAY);// porting ydh added

				}
				//TxDStringC("\r\n TEST POINT 111");
				mDxlDevice->read_pointer = mDxlDevice->write_pointer; //BufferClear
			}
			else{
				//TxDStringC("\r\n TEST POINT 6");
				break;
			}
		}//bRxLenEx is exist
	}

	//TxDStringC("\r\n TEST POINT 2");//TxDString("\r\n Err ID:0x");
	mBusUsed = 0;

	if((mRxLength != bRxLenEx) && (mTxBuffer[2] != BROADCAST_ID))
	{
		//TxDByteC('3');//
		//TxDStringC("Rx Error\r\n");//TxDString("\r\n Err ID:0x");
#ifdef	PRINT_OUT_COMMUNICATION_ERROR_TO_USART2
		//TxDString("\r\n Err ID:0x");
		//TxDHex8(bID);
		TxDStringC("\r\n ->[DXL]Err: ");
		PrintBuffer(mTxBuffer,bTxLen);
		TxDStringC("\r\n <-[DXL]Err: ");
		PrintBuffer(mRxBuffer,mRxLength);
#endif

#ifdef	PRINT_OUT_TRACE_ERROR_PRINT_TO_USART2
		//TxDString("\r\n {[ERROR:");TxD16Hex(0x8100);TxDByte(':');TxD16Hex(bID);TxDByte(':');TxD8Hex(bInst);TxDByte(']');TxDByte('}');
		//TxDByte(bID);TxDByte(' ');
		//TxDByte(bInst);TxDByte(' ');
		//TxDByte(gbpParameter[0]);TxDByte(' ');
		//TxDByte(gbpParameter[1]);TxDByte(' ');
#endif
		return 0;
	}else if((mRxLength == 0) && (mTxBuffer[4] == INST_PING)){  //[ROBOTIS] 2013-11-22 correct response for ping instruction
		return 0;
	}
	//TxDString("\r\n TEST POINT 4");//TxDString("\r\n Err ID:0x");
#ifdef PRINT_OUT_PACKET_TO_USART2
	TxDStringC("\r\n ->[TX Buffer]: ");
	printBuffer(mTxBuffer,bTxLen);
	TxDStringC("\r\n <-[RX Buffer]: ");
	printBuffer(mRxBuffer,mRxLength);
#endif
	mDXLtxrxStatus = (1<<COMM_RXSUCCESS);

	//gbLengthForPacketMaking =0;
	return 1;
}
コード例 #6
0
ファイル: Dynamixel.cpp プロジェクト: tician/ROBOTIS-OpenCM
byte Dynamixel::rxPacket(byte bRxLength){
	unsigned long ulCounter, ulTimeLimit;
	byte bCount, bLength, bChecksum;
	byte bTimeout;

	bTimeout = 0;
	if(bRxLength == 255)
		ulTimeLimit = RX_TIMEOUT_COUNT1;
	else
		ulTimeLimit = RX_TIMEOUT_COUNT2;
	for(bCount = 0; bCount < bRxLength; bCount++)
	{
		ulCounter = 0;
		while(mDxlDevice->read_pointer == mDxlDevice->write_pointer)
		{
			nDelay(NANO_TIME_DELAY); //[ROBOTIS] porting ydh
			if(ulCounter++ > ulTimeLimit)
			{
				bTimeout = 1;
				//TxDStringC("Timeout\r\n");
				break;
			}
			uDelay(0); //[ROBOTIS] porting ydh added
		}
		if(bTimeout) break;
		mRxBuffer[bCount] = mDxlDevice->data_buffer[mDxlDevice->read_pointer++]; // get packet data from USART device
		//TxDStringC("mRxBuffer = ");TxDHex8C(mRxBuffer[bCount]);TxDStringC("\r\n");
	}

	bLength = bCount;
	bChecksum = 0;


	if( mTxBuffer[2] != BROADCAST_ID )
	{
		if(bTimeout && bRxLength != 255)
		{
#ifdef PRINT_OUT_COMMUNICATION_ERROR_TO_USART2
			TxDStringC("Rx Timeout");
			TxDByteC(bLength);
#endif
			mDXLtxrxStatus |= (1<<COMM_RXTIMEOUT);
			clearBuffer();
			//TxDStringC("Rx Timeout");
			return 0;
		}
		if(bLength > 3) //checking available length.
		{
			if(mRxBuffer[0] != 0xff || mRxBuffer[1] != 0xff )
			{
#ifdef PRINT_OUT_COMMUNICATION_ERROR_TO_USART2
				TxDStringC("Wrong Header");//[Wrong Header]
#endif
				mDXLtxrxStatus |= (1<<COMM_RXCORRUPT);//RXHEADER);
				clearBuffer();
				return 0;
			}
			if(mRxBuffer[2] != mTxBuffer[2] )
			{
#ifdef PRINT_OUT_COMMUNICATION_ERROR_TO_USART2
				TxDStringC("[Error:TxID != RxID]");
#endif
				mDXLtxrxStatus |= (1<<COMM_RXCORRUPT);//RXID);
				clearBuffer();
				return 0;
			}
			if(mRxBuffer[3] != bLength-4)
			{
#ifdef PRINT_OUT_COMMUNICATION_ERROR_TO_USART2
				TxDStringC("RxLength Error");
#endif
				mDXLtxrxStatus |= (1<<COMM_RXCORRUPT);//RXLENGTH);
				clearBuffer();
				return 0;
			}
			for(bCount = 2; bCount < bLength; bCount++){
				bChecksum += mRxBuffer[bCount]; //Calculate checksum of received data for compare
			}
			if(bChecksum != 0xff)
			{
#ifdef PRINT_OUT_COMMUNICATION_ERROR_TO_USART2
				TxDStringC("[RxChksum Error]");
#endif
				mDXLtxrxStatus |= (1<<COMM_RXCORRUPT);//RXCHECKSUM);
				clearBuffer();
				return 0;
			}
		}
	}

	return bLength;
}
コード例 #7
0
ファイル: dxl.c プロジェクト: jwatte/ROBOTIS_CM9_Series
//갯수에 맞게 받는 이유 : 통신에러가 나오면 Length가 틀릴 가능성이 무척 높기 때문
byte rx_Packet(byte bRxLength){
	unsigned long ulCounter, ulTimeLimit;
	byte bCount, bLength, bChecksum;
	byte bTimeout;

	bTimeout = 0;
	if(bRxLength == 255) ulTimeLimit = RX_TIMEOUT_COUNT1;
	else ulTimeLimit = RX_TIMEOUT_COUNT2;
	for(bCount = 0; bCount < bRxLength; bCount++)
	{
		ulCounter = 0;
		while(gbDXLReadPointer == gbDXLWritePointer)
		{
			nDelay(NANO_TIME_DELAY); // porting ydh
			if(ulCounter++ > ulTimeLimit)
			{
				bTimeout = 1;

				break;
			}
			uDelay(0); //porting ydh added
		}
		if(bTimeout) break;
		gbpRxBuffer[bCount] = gbpDXLDataBuffer[gbDXLReadPointer++];
		//TxDStringC("gbpRxBuffer = ");TxDHex8C(gbpRxBuffer[bCount]);TxDStringC("\r\n");
	}


	bLength = bCount;
	bChecksum = 0;

	if( gbpTxBuffer[2] != BROADCAST_ID )
	{
		if(bTimeout && bRxLength != 255)
		{
#ifdef PRINT_OUT_COMMUNICATION_ERROR_TO_USART2
			TxDString("Rx Timeout");
			TxDByte(bLength);
#endif
			clearBuffer256();

			//return 0;
		}
		if(bLength > 3) //checking available length.
		{
			if(gbpRxBuffer[0] != 0xff || gbpRxBuffer[1] != 0xff )
			{
#ifdef PRINT_OUT_COMMUNICATION_ERROR_TO_USART2
				TxDStringC("Wrong Header");//[Wrong Header]
#endif
				clearBuffer256();
				return 0;
			}
			if(gbpRxBuffer[2] != gbpTxBuffer[2] )
			{
#ifdef PRINT_OUT_COMMUNICATION_ERROR_TO_USART2
				TxDStringC("[Error:TxID != RxID]");
#endif
				clearBuffer256();
				return 0;
			}
			if(gbpRxBuffer[3] != bLength-4)
			{
#ifdef PRINT_OUT_COMMUNICATION_ERROR_TO_USART2
				TxDStringC("RxLength Error");
#endif
				clearBuffer256();
				return 0;
			}
			for(bCount = 2; bCount < bLength; bCount++) bChecksum += gbpRxBuffer[bCount];
			if(bChecksum != 0xff)
			{
#ifdef PRINT_OUT_COMMUNICATION_ERROR_TO_USART2
				TxDStringC("[RxChksum Error]");
#endif
				clearBuffer256();
				return 0;
			}
		}
	}

	return bLength;
}
コード例 #8
0
ファイル: dxl.c プロジェクト: jwatte/ROBOTIS_CM9_Series
byte txrx_Packet(byte bID, byte bInst, byte bTxParaLen){
	#define TRY_NUM 2//;;2

	byte bTxLen, bRxLenEx, bTryCount;

	gbBusUsed = 1;


	for(bTryCount = 0; bTryCount < TRY_NUM; bTryCount++)
	{
		gbDXLReadPointer = gbDXLWritePointer; //BufferClear050728
		bTxLen = tx_Packet(bID, bInst, bTxParaLen);

		if(bInst == INST_PING)
		{
			if(bID == BROADCAST_ID)
			{
				gbRxLength = bRxLenEx = 255;
			}
			else
			{
				gbRxLength = bRxLenEx = 6;
			}
		}
		else if(bInst == INST_READ)
		{
			gbRxLength = bRxLenEx = 6+gbpParameter[1];
		}
		else if( bID == BROADCAST_ID )
		{
			gbRxLength = bRxLenEx = 0;
			break;
		}
		else
		{
			gbRxLength = bRxLenEx = 6;
		}


		if(bRxLenEx)//(gbpValidServo[bID] > 0x81 || bInst != INST_WRITE)) //ValidServo = 0x80|RETURN_LEVEL
		{
			gbRxLength = rx_Packet(bRxLenEx);
			//TxDStringC("gbRxLength = ");TxD_Dec_U8C(gbRxLength);TxDStringC("\r\n");
			//TxDStringC("bRxLenEx = ");TxD_Dec_U8C(bRxLenEx);TxDStringC("\r\n");
			//      if(gbRxLength != bRxLenEx) //&& bRxLenEx != 255) before Ver 1.11e
			if((gbRxLength != bRxLenEx) && (bRxLenEx != 255)) // after Ver 1.11f
			{
				unsigned long ulCounter;
				word wTimeoutCount;
				ulCounter = 0;
				wTimeoutCount = 0;
				//TxDByteC('0');//TxDStringC("\r\n TEST POINT 0");//TxDString("\r\n Err ID:0x");
				while(ulCounter++ < RX_TIMEOUT_COUNT2)
				{
					if(gbDXLReadPointer != gbDXLWritePointer) {
						gbDXLReadPointer = gbDXLWritePointer; //BufferClear
						ulCounter = 0;
						if(wTimeoutCount++ > 100 )
						{
							//uDelay(0);// porting ydh added
							break; //porting ydh 100->245 //;;;;;; min max 뒤바뀜 found at Ver 1.11e
						}
						nDelay(NANO_TIME_DELAY);// porting ydh added 20120210.
					}
					//uDelay(0);// porting ydh added
					nDelay(NANO_TIME_DELAY);// porting ydh added

				}
				//TxDByteC('1');//TxDStringC("\r\n TEST POINT 1");//TxDString("\r\n Err ID:0x");
				gbDXLReadPointer = gbDXLWritePointer; //BufferClear
			}
			else
			{
				//TxDByteC('6');//TxDStringC("\r\n TEST POINT 6");//TxDString("\r\n Err ID:0x");
				break;
			}
		}
	}

	//TxDByteC('2');//TxDStringC("\r\n TEST POINT 2");//TxDString("\r\n Err ID:0x");
	gbBusUsed = 0;

	if((gbRxLength != bRxLenEx) && (gbpTxBuffer[2] != BROADCAST_ID))
	{
		//TxDByteC('3');//TxDStringC("\r\n TEST POINT 3");//TxDString("\r\n Err ID:0x");
#ifdef	PRINT_OUT_COMMUNICATION_ERROR_TO_USART2
		//TxDString("\r\n Err ID:0x");
		//TxDHex8(bID);
		//TxDString("\r\n ->[DXL]Err: ");
		PrintBuffer(gbpTxBuffer,bTxLen);
		//TxDString("\r\n <-[DXL]Err: ");
		PrintBuffer(gbpRxBuffer,gbRxLength);
#endif

#ifdef	PRINT_OUT_TRACE_ERROR_PRINT_TO_USART2
		//TxDString("\r\n {[ERROR:");TxD16Hex(0x8100);TxDByte(':');TxD16Hex(bID);TxDByte(':');TxD8Hex(bInst);TxDByte(']');TxDByte('}');
		//TxDByte(bID);TxDByte(' ');
		//TxDByte(bInst);TxDByte(' ');
		//TxDByte(gbpParameter[0]);TxDByte(' ');
		//TxDByte(gbpParameter[1]);TxDByte(' ');
#endif
		return 0;
	}

	//TxDString("\r\n TEST POINT 4");//TxDString("\r\n Err ID:0x");
#ifdef PRINT_OUT_PACKET_TO_USART2
	TxDStringC("\r\n ->[TX Buffer]: ");
	PrintBuffer(gbpTxBuffer,bTxLen);
	TxDStringC("\r\n <-[RX Buffer]: ");
	PrintBuffer(gbpRxBuffer,gbRxLength);
#endif

	//gbLengthForPacketMaking =0;
	return 1;
}