Exemple #1
0
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)
Exemple #2
0
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)
Exemple #3
0
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)
Exemple #4
0
    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)
Exemple #5
0
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 ")
Exemple #6
0
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