2012-08-06 179 views
3

我从串行端口获取字节,代表我的PIC板上的电压。 但我不能将这些字节(字符串)转换为十进制,因为我得到上面的错误消息。 下面是函数(事实上,它与Tkinter的按钮关联)ValueError:无效文字为int()与基地16:' x0e xa3'Python

def channel8(): 
    ser.write(chr(0xFF)) 
    print "you have select channel8" 
    x=ser.read(2) 
    w=int(x, 16) 
    print w 
    print "Voltage on channel8 is:" , x 

ValueError: invalid literal for int() with base 16: '\x0e\xa3'

def channel8(): 
    ser.write(chr(0xFF)) 
    print "you have select channel8" 
    x=ser.read(2) 
    z=struct.unpack("h", x) 
    #w=int(z, 16) 
    print z 

,我得到这样的:

Voltage on channel8 is: (28942,)

能否请您解释一下我怎么得到这个值?它不匹配任何东西:d

回答

9

我认为你应该使用struct模块并解压你这样的二进制数据:

struct.unpack("h", x) 

因为int是不是真的用二进制数据,但像十六进制字符串:EF1D

当你做x=ser.read(2)您收到的二进制数据的两个字节,存在通过struct库支持两种类型的数字表示的:short(h)和unsigned short(H)。功能struct.unpack接收两个参数:

并返回与解压后的值(仅在您的情况下,一个INT)的元组。

因此,您需要将字符串w=int(x, 16)更改为w = struct.unpack("h", x)[0]或更改为w = struct.unpack("H", x)[0],这取决于数据类型。

+2

示例int *可以*为无符号(''H'),值为41742或有符号,值为-23794 .. – 2012-08-06 10:06:31

+0

感谢您的回答,请问您能解释更多吗?我是一个开始:) – safsaf88 2012-08-06 10:10:36

+1

当然,我添加一些更多的解释。 – 2012-08-06 10:19:42

相关问题