python2到python3的不同之处在于字节加法和发送到serial p

2024-03-28 15:03:09 发布

您现在位置:Python中文网/ 问答频道 /正文

目前,我们正在建立一个机器人与树莓pi和AX-12 dynamixel伺服的。我们发现了一个python2库,我们目前移植到python3,我们在一个特定的方法指出了问题,给出了一个python3的错误。你知道吗

Python2的版本实际上很有魅力

AX_GOAL_LENGTH = 5
AX_WRITE_DATA = 3
AX_GOAL_POSITION_L = 30
AX_START = 255
AX_REG_WRITE = 4

def move(self, id, position):
    self.direction(Ax12.RPI_DIRECTION_TX)
    Ax12.port.flushInput()
    p = [position&0xff, position>>8]
    checksum = (~(id + Ax12.AX_GOAL_LENGTH + Ax12.AX_WRITE_DATA + Ax12.AX_GOAL_POSITION_L + p[0] + p[1]))&0xff
    outData = chr(Ax12.AX_START)
    outData += chr(Ax12.AX_START)
    outData += chr(id)
    outData += chr(Ax12.AX_GOAL_LENGTH)
    outData += chr(Ax12.AX_WRITE_DATA)
    outData += chr(Ax12.AX_GOAL_POSITION_L)
    outData += chr(p[0])
    outData += chr(p[1])
    outData += chr(checksum)
    Ax12.port.write(outData)

我们尝试的是调整这个变量:

Ax12.port.write(bytes(outData,'utf-8'))

现在脚本运行,遗憾的是伺服将不再工作。你知道吗

我们还尝试将字节放入字节数组中

result = bytes([Ax12.AX_START, Ax12.AX_START, 
                Ax12.AX_GOAL_LENGTH,Ax12.AX_REG_WRITE,
                Ax12.AX_GOAL_POSITION_L, p[0], p[1], checksum
])
Ax12.port.write(result)

脚本运行,但伺服不运行。你知道吗

我相信python3和python2对输出数据的操作是不同的。我不知道应该调整什么或者改变什么。你知道吗

有人看到我现在做错了什么吗?你知道吗


Tags: iddataportpositionaxstartlengthpython3
1条回答
网友
1楼 · 发布于 2024-03-28 15:03:09

您的字节不是UTF-8数据;对于您在0-127范围之外创建的任何chr()值,编码到UTF-8将产生两个字节。你知道吗

您是从整数值创建Unicode代码点;如果您将这些值限制为0到255之间的整数,这些代码点将创建拉丁1代码点;原则上,您可以编码到'latin1'以再次获取字节,但首先创建字节要容易得多。你知道吗

在Python3中,使用从整数列表创建的bytes类型:

def move(self, id, position):
    self.direction(Ax12.RPI_DIRECTION_TX)
    Ax12.port.flushInput()
    p = [, position>>8]
    checksum = (~(id + Ax12.AX_GOAL_LENGTH + Ax12.AX_WRITE_DATA + Ax12.AX_GOAL_POSITION_L + p[0] + p[1]))&0xff
    outData = bytes([
        Ax12.AX_START, Ax12.AX_START, id,
        Ax12.AX_GOAL_LENGTH, Ax12.AX_WRITE_DATA,
        Ax12.AX_GOAL_POSITION_L, p[0], p[1], checksum])
    Ax12.port.write(outData)

您自己的尝试没有包含id值,您使用的是AX_REG_WRITE,而不是AX_WRITE_DATA。你知道吗

您还可以使用^{} object,它允许您附加额外的字节;您可以使用它通过引用到目前为止生成的字节来计算校验和,避免重复您自己的操作(常见的错误源):

def move(self, id, position):
    self.direction(Ax12.RPI_DIRECTION_TX)
    Ax12.port.flushInput()
    outData = bytearray([
        Ax12.AX_START, Ax12.AX_START, id,
        Ax12.AX_GOAL_LENGTH, Ax12.AX_WRITE_DATA,
        Ax12.AX_GOAL_POSITION_L, position & 0xff, position >> 8])
    checksum = ~sum(outData[2:]) & 0xff
    outData.append(checksum)
    Ax12.port.write(outData)

当然,您也可以使用连接(outData = bytes([...])outData += bytes([checksum])),但是bytearray在python2中也可用,因此上面的版本与两个主要的Python版本兼容。你知道吗

相关问题 更多 >