【问题标题】:How to get the size (in bytes) of output in Python如何在 Python 中获取输出的大小(以字节为单位)
【发布时间】:2015-12-02 18:14:23
【问题描述】:

首先,我要感谢任何帮助我的人。

- 环境

我在 Windows 8 操作系统中使用 Python v2.7。 我正在使用 COM4 通过在 Python 代码中发送一些命令来与机器人交谈。

我向机器人发送命令getversion 并假设得到一堆数据,格式如下(我省略了一些,它太长了):

组件、主要、次要、构建、辅助

APP密码,956FC721

BaseID,1.2,1.0,18000,2000,

电池类型,4,LIION_4CELL_SMART,

蜂巢网址,beehive.cloud.com

BlowerType,1,BLOWER_ORIG,

引导程序版本,27828,,,

BrushMotorType,1,BRUSH_MOTOR_ORIG,

BrushSpeed,1400,,,

BrushSpeedEco,800,,

底盘转速,1,,

云选择器,2

DropSensorType,1,DROP_SENSOR_ORIG,

液晶面板,137,240,124,

LDS CPU,F2802x/c001,,,

LDS 串口,KSH13315AA-0000153,,,

  • 我的问题是: 基于这种格式,如何得到上述结果的大小(以字节为单位)? 这个问题的原因是,只要我知道它有多大,我就可以获得完整/完整的结果。

具体来说,我的代码是:

ser.write('getver \n')   # send 'getversion' cmd to robot

ser.read(1305)   

getver 的响应大小是 1305 字节,是的,我是手动计算的,所以我想请 Python 自动告诉我它有多大。

【问题讨论】:

  • 可能类似于:data=ser.read() 然后size=len(data)
  • 答案看起来并不总是相同的大小。必须有不同的方式来读取响应。也许你应该设置一个合理的超时时间(检测结束)然后调用ser.readlines()?
  • 你可以给机器人编程吗?例如使其在其输出的末尾输出类似“END”的内容。
  • 另外,正如 zvone 提到的,你的输出可能会有不同的长度。但是,行数应该相同。为什么不继续阅读,直到你有 16 个换行符?
  • 你是对的,输出会随着不同的大小和线条而不同。所以恐怕我不能继续跟踪 16 个换行符,因为它们是不同的... =(

标签: python python-2.7


【解决方案1】:

为了能够与设备通信,您必须知道用于该通信的协议是什么。设计该协议的人必须定义一种方法让您知道要读取多少字节。如果你有一个规范,它可能涵盖了这个问题。

因此,有一种方法可以预先确定字节数或检测传输结束,例如由于存在特殊的结束字符。

没有某种规范,我们只能猜测协议是什么。

  • 响应消息的大小显然不是固定的。也许有一种方法可以询问设备“getversion 的答案的长度是多少”?
  • 某些协议会在每条消息前面加上长度信息。这里没有。或许您可以通过向设备发送一些特殊命令,将设备置​​于其他模式来处理类似的事情?
  • 您的消息看起来不像结尾标记的那样,但可能只是不可见,例如最后可能有一个空字符('\0')吗?如果有,您可以逐个字符地阅读,直到它出现为止。
  • 如果找不到任何其他解决方案,您可以尝试设置一个合理的读取超时时间 (ser = serial.Serial(..., timeout=2, ...))。然后尝试阅读所有内容。当没有更多要阅读的内容时,read 函数将无限期冻结,除非出现超时。如果您设置了相当长的超时时间并且在该时间内没有收到任何日期,则可以假设传输结束。

【讨论】:

    猜你喜欢
    • 2013-02-01
    • 1970-01-01
    • 2013-02-06
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多