/* * SCS.cpp * 飞特串行舵机通信层协议程序 * 日期: 2019.12.18 * 作者: */ #include #include "SCS.h" SCS::SCS() { Level = 1;//除广播指令所有指令返回应答 Error = 0; } SCS::SCS(u8 End) { Level = 1; this->End = End; Error = 0; } SCS::SCS(u8 End, u8 Level) { this->Level = Level; this->End = End; Error = 0; } //1个16位数拆分为2个8位数 //DataL为低位,DataH为高位 void SCS::Host2SCS(u8 *DataL, u8* DataH, u16 Data) { if(End){ *DataL = (Data>>8); *DataH = (Data&0xff); }else{ *DataH = (Data>>8); *DataL = (Data&0xff); } } //2个8位数组合为1个16位数 //DataL为低位,DataH为高位 u16 SCS::SCS2Host(u8 DataL, u8 DataH) { u16 Data; if(End){ Data = DataL; Data<<=8; Data |= DataH; }else{ Data = DataH; Data<<=8; Data |= DataL; } return Data; } void SCS::writeBuf(u8 ID, u8 MemAddr, u8 *nDat, u8 nLen, u8 Fun) { u8 msgLen = 2; u8 bBuf[6]; u8 CheckSum = 0; bBuf[0] = 0xff; bBuf[1] = 0xff; bBuf[2] = ID; bBuf[4] = Fun; if(nDat){ msgLen += nLen + 1; bBuf[3] = msgLen; bBuf[5] = MemAddr; writeSCS(bBuf, 6); }else{ bBuf[3] = msgLen; writeSCS(bBuf, 5); } CheckSum = ID + msgLen + Fun + MemAddr; u8 i = 0; if(nDat){ for(i=0; i10){ return 0; } } return 1; } int SCS::Ack(u8 ID) { Error = 0; if(ID!=0xfe && Level){ if(!checkHead()){ return 0; } u8 bBuf[4]; if(readSCS(bBuf, 4)!=4){ return 0; } if(bBuf[0]!=ID){ return 0; } if(bBuf[1]!=2){ return 0; } u8 calSum = ~(bBuf[0]+bBuf[1]+bBuf[2]); if(calSum!=bBuf[3]){ return 0; } Error = bBuf[2]; } return 1; } int SCS::syncReadPacketTx(u8 ID[], u8 IDN, u8 MemAddr, u8 nLen) { syncReadRxPacketLen = nLen; u8 checkSum = (4+0xfe)+IDN+MemAddr+nLen+INST_SYNC_READ; u8 i; writeSCS(0xff); writeSCS(0xff); writeSCS(0xfe); writeSCS(IDN+4); writeSCS(INST_SYNC_READ); writeSCS(MemAddr); writeSCS(nLen); for(i=0; i=syncReadRxPacketLen){ return -1; } return syncReadRxPacket[syncReadRxPacketIndex++]; } int SCS::syncReadRxPacketToWrod(u8 negBit) { if((syncReadRxPacketIndex+1)>=syncReadRxPacketLen){ return -1; } int Word = SCS2Host(syncReadRxPacket[syncReadRxPacketIndex], syncReadRxPacket[syncReadRxPacketIndex+1]); syncReadRxPacketIndex += 2; if(negBit){ if(Word&(1<