如何转换7f => 02十六进制

时间:2016-11-23 14:55:04

标签: python

我正在通过" Modbus RTU"与伺服交谈,但是为了理解我需要打印接收的十六进制数字的确切情况,并进行适当的转换,如下所示。

以这种方式转换接收值:

  1. hex 7f转换为bin给出(01111111)
  2. 接下来否定值(10000000)
  3. rol 2-place给出(00000010)
  4. 并返回到十六进制给出(02)
  5. 这是家庭指挥后伺服的结果:

    007f7d5fefff858f007f7d5f2fe0076f0000000000000000000000000000
    

    这是我的代码:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import serial
    import time
    import numpy
    
    port= serial.Serial('/dev/ttyS0', 9600, timeout=2,   
    xonxoff=False, rtscts=False, dsrdtr=False) 
    port.flushInput()
    port.flushOutput()
    time.sleep(0.01)
    if port.isOpen():
        print(port.name + ' is open...')
        flag = port.isOpen()
        print flag
        #MODBUS_ACTIVE=b"\x01\x05\x04\x27\xFF\x00\x3D\x01"  
        #port.write(MODBUS_ACTIVE)
        #print    
        "sending=>MODBUS_ACTIVE<=>",MODBUS_ACTIVE.encode("hex")
        time.sleep(0.01)
        command=raw_input('Enter your command ie.home: ')
        if( command == 'home' ):
        HOME_INITIAL=b"\x01\x05\x04\x0B\x00\x00\xBD\x38"      
        #command home first time
        port.write(HOME_INITIAL)
        print "sending=>HOME",HOME_INITIAL.encode("hex")
        time.sleep(0.5)
        HOME_FINAL=b"\x01\x05\x04\x0B\xFF\x00\xFC\xC8"   
        #command home second time
        port.write(HOME_FINAL)
        time.sleep(0.5)
        #While True:
        rcv = port.read(30)
        print type(rcv)
        rcv = rcv.encode('hex')
        #rcv = int(rcv,16)
        #rcv = "{0:012b}".format(0xfff ^ rcv)
        #numpy.right_shift(rcv, 30)
        #format(rcv if rcv >= 0 else (1 << 16) + rcv, '016b'
        #binary_repr(rcv)
        #time.sleep(0.1)
        #rcv = bin(rcv^1)
        #print bin(str(rcv))
        #''.join(format(ord(c), '08b') for c in 'rcv')
        #rcv = str(rcv)
        #rcv = rcv >>= 1
        #print type(rcv)
        #print int('rcv')+1
        #print 'rcv'
        #int(''.join(bin(x)[:1:-1]), 2)
        #bin((i ^ (2 ** (i.bit_length()+1) - 1)))[3:]
        #bin((rcv ^ (2 ** (rcv.bit_length()+1) - 1)))[3:]
        #bin((int(s, 2) ^ (2**(len(s)+1) - 1)))[3:]
        #bin((int(rcv, 16) ^ (2**(len(rcv)+1) - 1)))[3:]
        #s.replace('1', '2').replace('0', '1').replace('2', '0')
        #rcv.replace('1', '0').replace('0', '1').replace('2',     '0')
        #bin((rcv ^ (2 ** (rcv.bit_length()+1) - 1)))[3:]
        print ''.join('1' if x == '0' else '0' for x in 'rcv')
        #flip = {'1':'0', '0':'1'}; ''.join(flip[b] for b in s)
        #rcv = {'1':'0', '0':'1'}; ''.join(rcv[b] for b in rcv)
        #print "{0:012b}".format(2**12-1-a)
    
    
        #result = int(a, 16) ^ int(b, 16) # convert to integers     and xor them 
        #return '{:x}'.format(result)     # convert back to     hexadecimal
        #result = int(rcv, 16) ^ int(rcv, 16)
        #print rcv.encode('hex')
        #print format('rcv')
        #print (rcv)
        command=raw_input('Enter your command ie.home: ')
    

    正如你所看到的,我尝试了许多方法在屏幕上打印转换后的值,但没有很好的结果。

1 个答案:

答案 0 :(得分:1)

根据代码中print的不一致用法(有些带有括号和有些没有括号),您似乎正在使用Python 2.7。使用encode转换为十六进制可能不是一个好主意,它可能只适用于Python 3.

而是使用binascii模块来获取从串行端口读取的字节的转换。见binascii

>>> binascii.hexlify('test')
'74657374'

如果您希望自己进行位操作,可以使用下面的示例代码。请注意,这些位向右移位6位而不是向左移位2位,因此您不必担心单个字节的整数转换。

>>> abyte = 0x7f
>>> bin(abyte)
'0b1111111'
>>> b = abs(~abyte)
>>> bin(b)
'0b10000000'
>>> c = b >> 6
>>> bin(c)
'0b10'
>>> hex(c)
'0x2'