def parseBuffer(msg): if len(msg) == 1 and msg[0] == 0x06: #print("0x06 ACK from HP") return () cmd = msg[3] datalen = int(msg[4]) data = msg[5:5 + datalen] crc = msg[5 + datalen] #mysteryByte = msg[6+datalen] calcCrc = ChecksumXor8() calcCrc.process(msg[1:datalen + 6 - 1]) if calcCrc.final() != crc: print("CRC failed for 0x" + msg.hex()) handleFrame(cmd, data)
def getReadRequest(register): # 0xc0: not a clue # 0x69: command? (read request) # command length # register byte1 # register byte 2 # checksum msg = bytes([0xc0, 0x69, 0x02]) msg += register.to_bytes(2, "little") calcCrc = ChecksumXor8() calcCrc.process(msg) msg += calcCrc.finalbytes() print("Generated READ request for ", register,":", msg.hex() ) return(msg)
def getWriteRequest(register, value): registerDefinition = definition[register] mode = registerDefinition[9] if mode != "R/W": return(bytes()) msg = bytes([0xc0, 0x6b, 0x06]) msg += register.to_bytes(2, "little") factor = int( registerDefinition[5] ) dataType = registerDefinition[4] signed = { "u8":False, "s8":True, "u16":False, "s16":True, "u32":False, "s32":True } msg += (value*factor).to_bytes(4, "little", signed=signed[dataType]) calcCrc = ChecksumXor8() calcCrc.process(msg) msg += calcCrc.finalbytes() print("Generated WRITE request for ", register,"<-",value,":", msg.hex() ) return(msg)
def parseBuffer(self, msg): # while len(self.buf) >= 6: #at least 6 bytes # if self.buf[0:3] != bytes([0x5c, 0x00, 0x20]): # start message # print("Skipping spurious bytes: ", self.buf[0:3].hex()) ## this should not happen!!! # self.buf = self.buf[ 3:len(self.buf) ] # continue cmd = msg[3] datalen = int(msg[4]) # if len(self.buf) < datalen + 6: # print("Wait until buffer fills..") # break #incomplete message, wait until buffer fills data = msg[5:5+datalen] crc = msg[ 5+datalen ] mysteryByte = msg[6+datalen] calcCrc = ChecksumXor8() calcCrc.process(msg[1:datalen+6-1]) # print("Frame received ", msg.hex(), " length ", len(msg),": calcCrc=", calcCrc.finalhex() ) if calcCrc.final() != crc: print("CRC failed") self.handleFrame(cmd, data)
def readPosition(numberReps, updateRate=0.2): data = bytearray.fromhex("5042") data.append(ChecksumXor8.calc(data)) print('Attempting to make ', numberReps, ' read attemps with intervall of ', updateRate, ' seconds') try: ser.open() except Exception as e: print("error open serial port: " + str(e)) exit() if ser.isOpen(): try: ser.flushInput() #flush input buffer, discarding all its contents ser.flushOutput() #flush output buffer, aborting current output # ser.write(data) # time.sleep(0.010) #give the serial port sometime to receive the data numOfLines = 1 while True: ser.write(data) time.sleep(0.01) response = ser.read(7) print('>> Cycle #' + str(numOfLines)) print('Response raw:', binascii.hexlify(response)) position = int.from_bytes(response[2:6], 'big', signed=False) print('Absolute Position 32bit unsigned:', position) print('>> End cycle') numOfLines = numOfLines + 1 time.sleep(updateRate) if (numOfLines >= numberReps + 1): break ser.close() print('>> Finished reading') except Exception as e1: print("error communicating...: " + str(e1)) else: print("cannot open serial port ")
readPosition(10, 0.2) # # Manual Mode # # Enter adress of encoder: 40 is default, FF is broadcast - current encoder: 50 adr = bytearray.fromhex("FF") # Enter command as per list of hiperface commands (52 is status, 42 read position) # See hiperface spec for details # # https://cdn.sick.com/media/docs/5/65/865/operating_instructions_specification_hiperface%C2%AE_motor_feedback_protocol_en_im0064865.pdf cmd = bytearray.fromhex("52") # Enter masterdata if required (code, register requests), otherwise leave empty masterData = bytearray.fromhex("") data = adr + cmd + masterData data.append(ChecksumXor8.calc(data)) # Enter the number of payload bytes you expect # value is increased by 3 to account for adress, command ACK and checksum readNumberOfBytes = 4 readNumberOfBytes += 3 # Sleep time before response is read sleepTime = 0.01 try: ser.open() except Exception as e: print("error open serial port: " + str(e)) exit() if ser.isOpen(): try: ser.flushInput() #flush input buffer, discarding all its contents