Python.readline()

Python.readline(),python,hex,readline,pyserial,obd-ii,Python,Hex,Readline,Pyserial,Obd Ii,首先让我以我是python新手,这里没有自我为序。我从不同的站点拼凑了这段代码,其最终目标是将十六进制代码输出到OBD-II芯片并等待响应。该响应(也是十六进制)被转换为十进制,并被处理后发送到输出。很简单吧 嗯,有两个问题 其中之一是.readline()删除响应的第一个字母 例如,如果我想要“>Elm327”,我会返回“>lm327” 另一个问题(两者中较大的一个)是当我使用.readline()时,我只会收到我发送的请求,例如,如果我使用下面的代码: serialport.write("0

首先让我以我是python新手,这里没有自我为序。我从不同的站点拼凑了这段代码,其最终目标是将十六进制代码输出到OBD-II芯片并等待响应。该响应(也是十六进制)被转换为十进制,并被处理后发送到输出。很简单吧

嗯,有两个问题

其中之一是.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“

这也会返回一个错误,但我将对此单独发表一篇文章


有什么想法吗?谢谢

我怀疑您的串行端口设置与电路板的设置不完全匹配。请尝试使用终端,直到获得准确的设置,然后再使用这些设置


注意:转换十六进制值不需要在0x前面加前缀,可以使用int(s,16)其中s是您的子字符串。

串行在minicom中运行良好。我将尝试使用简单的int。是否有方法选择我要读取的信息?或者,如果我在
E/r/r41 0D 15/r/r
中读取,如何仅获取
15
?但波特率、奇偶校验、字长、停止位等的具体设置是什么?您需要的从python程序中完全复制它们。一旦获得一致的结果,您就可以选择使用正则表达式,或者像嵌入式系统通常的情况一样,如果您需要的数据在字符串中的一致位置,只需简单的字符串切片。也不要忘了'\r'可以是某些系统上的行返回ems.OK.我这里有一些不错的数字。谢谢你的串行建议。
time.sleep(5)serialport.write(“01 0C\r”)serialport.flushInput()serialport.flushOutput()time.sleep(.5)rpm\u hex=serialport.readline().split(“”)print rpm\u hex rpm=float(int('0x'+rpm\u hex[1],0))rpm=rpm/4打印“Tach:”,rpm,“rpm”
此输出
['01','0C','\r41','0C','20','34','\r>']12.0 Tach:3.0 rpm,其中12.0等于**0C**的十六进制值,这是它在
['01','0C','\r41','0C','20','34','\r\r>']`。问题是:假设0C是
rpm
的值。我如何选择所需的十六进制数?例如,从名为
rpm\u hex=['01','0C','\r41','0C','20','34','\r>']的字符串中选择'20'或'34'作为'rpm'的值?浮点值(int('0x'+rpm\u hex[1],0])是否为零选择值?Does
rpm=float(int('0x'+rpm_hex[4],0))
select'20?您需要查看芯片的文档,以了解第5个回复中的字段是什么意思,然后float(int(rpm_hex[4],16])会起作用。
speed_hex = serialport.readline().split(' ')