python2到python3的区别,增加了字节并发送到串行端口

瓦尔维

目前,我们正在构建带有覆盆子pi和AX-12 dynamixel Servo的机器人。我们找到了一个当前正在移植到python3的python2库,我们用一种在python3中给出错误的特定方法来找出问题所在。

Python 2版本实际上就像一个魅力

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'))

现在脚本已运行,可悲的是Servo将不再起作用。

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

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中对outData进行的操作是不同的。我找不到应该调整或不同的内容。

有人看到我目前在做错什么吗?

马丁·彼得斯(Martijn Pieters)

您的字节不是UTF-8数据;对于chr()您在0-127范围之外创建的任何值,编码为UTF-8会生成两个字节。

您正在从整数值创建Unicode代码点。如果将它们限制为0到255之间的整数,它们会创建Latin-1代码点;原则上,您可以进行编码以'latin1'再次获取字节,但是首先创建字节要容易得多。

在Python 3中,使用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

您也可以使用bytearray()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在Python 2中也可以使用串联,因此上述版本与两个主要的Python版本都兼容。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

打印十六进制值时,Python3增加了额外的字节

来自分类Dev

python将十六进制字符串发送到串行端口

来自分类Dev

无法通过串行端口将数据从Matlab发送到Python

来自分类Dev

使用Python的Pyserial将字符发送到Arduino串行端口

来自分类Dev

C#读取HEX串行端口数据并发送到Streamwriter

来自分类Dev

使用某些格式将字节数组发送到串行端口

来自分类Dev

Python纸浆增加了罚款

来自分类Dev

将串行通信(Ubuntu,Python)发送到Arduino

来自分类Dev

重新组装从 Arduino 发送到 Python 的串行数据

来自分类Dev

从Python2升级到Python3时出现字符串/字节问题

来自分类Dev

将数据发送到Little Endian的串行端口

来自分类Dev

Java无法正确发送到串行端口

来自分类Dev

在bash中将十六进制字节发送到串行

来自分类Dev

多线程异步s3调用增加了内存python

来自分类Dev

以与python2和python3兼容的方式将字节写入标准输出

来自分类Dev

Python为图像破裂增加了噪音PNG

来自分类Dev

发送到python3中程序的标准输入

来自分类Dev

python3:logging.basicConfig将所有内容发送到stderr吗?

来自分类Dev

Python3和Python2之间的区别-socket.send数据

来自分类Dev

使用 python3 和 python2 构建分发包的区别?

来自分类Dev

将 python 对象从 python2 脚本传递到 python3 脚本

来自分类Dev

Xamarin C#Android-将.3gpp音频转换为字节并发送到parseObject

来自分类Dev

Python将数据串行发送到微控制器STM32F4

来自分类Dev

Python将数据串行发送到微控制器STM32F4

来自分类Dev

通过串行将 32 位整数从 python 脚本发送到 arduino 以用于驱动 RGB 条

来自分类Dev

改变进口处理/模块从python2到python3?

来自分类Dev

用于捕获 AWS MQ 的 AWS 云监视日志并发送到 kinesis 的 Python Lambda 函数

来自分类Dev

“等待网络配置”增加了3到5分钟的启动时间

来自分类Dev

为什么在将char发送到串行端口时需要延迟?

Related 相关文章

  1. 1

    打印十六进制值时,Python3增加了额外的字节

  2. 2

    python将十六进制字符串发送到串行端口

  3. 3

    无法通过串行端口将数据从Matlab发送到Python

  4. 4

    使用Python的Pyserial将字符发送到Arduino串行端口

  5. 5

    C#读取HEX串行端口数据并发送到Streamwriter

  6. 6

    使用某些格式将字节数组发送到串行端口

  7. 7

    Python纸浆增加了罚款

  8. 8

    将串行通信(Ubuntu,Python)发送到Arduino

  9. 9

    重新组装从 Arduino 发送到 Python 的串行数据

  10. 10

    从Python2升级到Python3时出现字符串/字节问题

  11. 11

    将数据发送到Little Endian的串行端口

  12. 12

    Java无法正确发送到串行端口

  13. 13

    在bash中将十六进制字节发送到串行

  14. 14

    多线程异步s3调用增加了内存python

  15. 15

    以与python2和python3兼容的方式将字节写入标准输出

  16. 16

    Python为图像破裂增加了噪音PNG

  17. 17

    发送到python3中程序的标准输入

  18. 18

    python3:logging.basicConfig将所有内容发送到stderr吗?

  19. 19

    Python3和Python2之间的区别-socket.send数据

  20. 20

    使用 python3 和 python2 构建分发包的区别?

  21. 21

    将 python 对象从 python2 脚本传递到 python3 脚本

  22. 22

    Xamarin C#Android-将.3gpp音频转换为字节并发送到parseObject

  23. 23

    Python将数据串行发送到微控制器STM32F4

  24. 24

    Python将数据串行发送到微控制器STM32F4

  25. 25

    通过串行将 32 位整数从 python 脚本发送到 arduino 以用于驱动 RGB 条

  26. 26

    改变进口处理/模块从python2到python3?

  27. 27

    用于捕获 AWS MQ 的 AWS 云监视日志并发送到 kinesis 的 Python Lambda 函数

  28. 28

    “等待网络配置”增加了3到5分钟的启动时间

  29. 29

    为什么在将char发送到串行端口时需要延迟?

热门标签

归档