/* * SCS.cpp * 飞特串行舵机通信层协议程序 * 日期: 2024.12.21 * 作者: txl */ #include #include "SCS.h" SCS::SCS() { Level = 1;//除广播指令所有指令返回应答 u8Status = 0; } SCS::SCS(u8 End) { Level = 1; this->End = End; u8Status = 0; } SCS::SCS(u8 End, u8 Level) { this->Level = Level; this->End = End; u8Status = 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) { u8Error = 0; if(ID!=0xfe && Level){ if(!checkHead()){ u8Error = ERR_NO_REPLY; return 0; } u8Status = 0; u8 bBuf[4]; if(readSCS(bBuf, 4)!=4){ u8Error = ERR_NO_REPLY; return 0; } if(bBuf[0]!=ID){ u8Error = ERR_SLAVE_ID; return 0; } if(bBuf[1]!=2){ u8Error = ERR_BUFF_LEN; return 0; } u8 calSum = ~(bBuf[0]+bBuf[1]+bBuf[2]); if(calSum!=bBuf[3]){ u8Error = ERR_CRC_CMP; return 0; } u8Status = bBuf[2]; } return 1; } int SCS::syncReadPacketTx(u8 ID[], u8 IDN, u8 MemAddr, u8 nLen) { rFlushSCS(); 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){ u8Error = ERR_BUFF_LEN; return -1; } return syncReadRxPacket[syncReadRxPacketIndex++]; } int SCS::syncReadRxPacketToWrod(u8 negBit) { if((syncReadRxPacketIndex+1)>=syncReadRxPacketLen){ u8Error = ERR_BUFF_LEN; return -1; } int Word = SCS2Host(syncReadRxPacket[syncReadRxPacketIndex], syncReadRxPacket[syncReadRxPacketIndex+1]); syncReadRxPacketIndex += 2; if(negBit){ if(Word&(1<