Python .readline()
Posted
技术标签:
【中文标题】Python .readline()【英文标题】: 【发布时间】:2013-07-27 14:12:28 【问题描述】:首先让我先介绍一下我是 python 新手,这里没有自我。我有这个代码,我从各个站点拼凑而成,最终目标是将十六进制代码输出到 OBD-II 芯片并等待响应。此响应(也是 HEX)被转换为十进制处理并发送到输出。很简单吧?
嗯,有两个问题。
其中一个是 .readline() 删除响应的第一个字母。
例如,如果我想要 ">Elm327",我会返回 ">lm327"。
另一个更大的问题是当我使用 .readline() 时,如果我使用下面的代码,我只会收到我发送的请求:
serialport.write("01 0D \r")
speed_hex = serialport.readline().split(' ')
speed = float(int('0x'+speed_hex[6:8], 0 ))
print 'Speed: ', speed, 'km/h'`
我想 .readline 以返回 41 0D 15
而不是我得到类似 E\r\r01 0D \r \r"
的东西
speed_hex = serialport.readline().split(' ')
这也会返回一个错误,但我会为此单独发一篇文章。
有什么想法吗?谢谢
【问题讨论】:
【参考方案1】:我怀疑您的串行端口设置与主板的设置不完全匹配尝试使用终端,直到您获得确切的设置然后使用这些设置。
注意,您不需要预先添加 0x 来转换可以使用 int(s, 16) 的十六进制值,其中 s 是您的子字符串。
【讨论】:
串行是 minicom 中的精品。我会尝试简单的 int 代替。有没有办法选择我想阅读的信息?或者例如,如果我在E/r/r41 0D 15/r/r
中阅读,我怎样才能抓住15
?
但是究竟是波特率、奇偶校验、字长、停止位等的设置 - 你需要复制它们全部 完全来自你的python程序。一旦获得一致的结果,您就可以选择使用正则表达式,或者像嵌入式系统通常的情况一样,您需要的数据位于字符串中的一致位置,只是简单的字符串切片。另外不要忘记 '\r' 在某些系统上可以是换行符。
好的。我在这里得到了一些不错的数字。感谢您的系列建议。 time.sleep(5) serialport.write("01 0C \r") serialport.flushInput() serialport.flushOutput() time.sleep(.5) rpm_hex = serialport.readline().split(' ') print rpm_hex rpm = float(int('0x'+rpm_hex[1], 0 )) rpm = rpm/4 print 'Tach: ', rpm, 'rpm'
这输出 ['01', '0C', '\r41', '0C', '20', '34', '\r\r>'] 12.0 Tach: 3.0 rpm Which the 12.0 is equal to the hex value of **0C** which is the second part it reads in
['01', '0C', '\r41', '0C', '20', '34', '\r\r>']` .
问题是:假设0C是rpm
的值。如何选择我想要的十六进制数?例如,从名为rpm_hex=['01', '0C', '\r41', '0C', '20', '34', '\r\r>']
的字符串中,我想选择'20' 或'34' 作为'rpm' 的值? float(int('0x'+rpm_hex[1],0)) 是否选择值? rpm = float(int('0x'+rpm_hex[4], 0 ))
是否选择 '20?
您需要查看芯片的文档以了解第 5 条回复中的字段含义是您需要的,然后 float(int(rpm_hex[4], 16)) 将做这个伎俩。以上是关于Python .readline()的主要内容,如果未能解决你的问题,请参考以下文章
python中read()readline()readlines()函数
read()readline()readlines() -- Python
python中read(),readline(),和readlines()
Python中的read(), readline(), readlines()