Dynamixel dx-series – Robotis Dynamixel DX-117 User Manual
Page 37
36
DYNAMIXEL
DX-Series
#define RX_TIMEOUT_COUNT2 10000L //10mSec
#define RX_TIMEOUT_COUNT1 (RX_TIMEOUT_COUNT2*10L) //1Sec
unsigned long ulCounter;
byte bCount;
ulCounter = 0;
while(gbRxBufferReadPointer == gbRxBufferWritePointer)
{
if(ulCounter++ > RX_TIMEOUT_COUNT1)
{
return 0;
}
}
bCount = 0;
for(bCount = 0; bCount < 254; bCount++) //Maximum Data Length Limit : 255
{
ulCounter = 0;
while(gbRxBufferReadPointer == gbRxBufferWritePointer)
{
if(ulCounter++ > RX_TIMEOUT_COUNT2)
{
return bCount;
}
}
bpRxBuffer[bCount] = gbpInterruptRxBuffer[gbRxBufferReadPointer++];
}
return bCount;
}
byte TxPacket(byte *bpTxBuffer, byte bID, byte bInstruction, byte *bpParameter, byte bParameterLength)
{
byte bCount,bCheckSum,bPacketLength;
bpTxBuffer[0] = 0xff;
bpTxBuffer[1] = 0xff;
bpTxBuffer[2] = bID;
bpTxBuffer[3] = bParameterLength+2; //Length(Paramter,Instruction,Checksum)
bpTxBuffer[4] = bInstruction;
for(bCount = 0; bCount < bParameterLength; bCount++)
{
bpTxBuffer[bCount+5] = bpParameter[bCount];
}
bCheckSum = 0;
bPacketLength = bParameterLength+4+2;
for(bCount = 2; bCount < bPacketLength-1; bCount++) //except 0xff,checksum
{
bCheckSum += bpTxBuffer[bCount];
}
bpTxBuffer[bCount] = ~bCheckSum; //Writing Checksum with Bit Inversion
RS485_TXD; //Change 485 Direction to Transmission
for(bCount = 0; bCount < bPacketLength; bCount++)
{
TxD80(bpTxBuffer[bCount]);
}
while(!TXD_FINISH0); //Wait until TXD Shift register empty
RS485_RXD;
return(bPacketLength);
}
void PrintBuffer(byte *bpPrintBuffer, byte bLength)
{
byte bCount;
for(bCount = 0; bCount < bLength; bCount++)
Should wait until last data bit transmission is
completed.
Note.:
‘Shift register empty’ is differ from ‘Tx
Ready
’. Tx Ready just means you can load the
data to CPU UART TxD Register. There can be
several Tx Buffering registers as what kind of
CPU