我想取一些數據OBD並試圖像通過this article 的製品(使用python 2.7)中描述道:的Python OBD編碼
的ELM327裝置HEX返回值。
爲了讀你在Python類型speed_hex = ser.readline剛要求的值()分裂( ' ')
轉換的HEX通過使用爲十進制:速度=浮子(INT('。0X' + speed_hex [3],0))
但我從我的OBD得到的答案不包含任何空格,而且他們看起來並不像他們有任何意義。
['\xd0MA\r?\r\r>\xd0\x15\r?\r\r>\x981\xf0\n']
所以我放棄了這種方法,而是改爲使用Python 3。
然後我寫了由this SO post
激發了小腳本但是我改成了定期拉大量的數據,並添加時間戳,一起被保存到CSV文件 - 作爲路徑意味着我的工作Windows(準確的說是10),COM配置正確,並且汽車符合OBD標準。
現在,當我運行我的腳本將打印出它的閱讀:
b'h\xf4\rSTOPPED\r\r>'
,然後告訴我
Traceback (most recent call last):
File "python3test.py", line 36, in <module> r.decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf4 in position 1:
invalid continuation byte
我不明白,編碼肯定是一個問題,但這個字符串不很有意義。即使我仔細看看0xf4 - 它只會是244(十進制),這不是靠近明智的RPM數據的地方。
爲什麼它在the other script工作呢?它不能成爲Windows的問題,可以嗎?
任何人都可以請幫助我理解這裏發生了什麼?
這是我的代碼。
import serial
import time
import string
import io
import os
import sys
import datetime as dt
ser = serial.Serial("COM1")
ser.baudrate = 38400
ser.write(bytes('ATSP0\r\n', encoding = 'utf-8'))
ser.timeout = 1
ser.write(bytes('ATE0\r\n', encoding = 'utf-8'))
ser.timeout = 1
def millis_interval(start, end):
'''start and end are datetime instances'''
diff = end - start
millis = diff.days * 24 * 60 * 60 * 1000
millis += diff.seconds * 1000
millis += diff.microseconds/1000
return millis
Testtime = str(dt.datetime.now()).split(' ')
PIDs = ["0C","0D","43","04","11","5C","05","10","46"]
response = []
''' open file and create header row'''
with open("C:/test/test_"+Testtime[0]+"_"+Testtime[1].replace(":","-")+".csv", "a") as myfile:
myfile.write("Time,Timestep,RPM,Speed, AbsLoad, CalcLoad, ThrottlePos, CoolTemp, OilTemp, MAF, AmbAirTemp")
start = dt.datetime.now() # need initial value
while 1:
end = dt.datetime.now()
myfile.write("\n"+str(dt.datetime.now())+','+str(millis_interval(start,end))+)
count = 0
for s in PIDs:
start = dt.datetime.now()
ser.write(bytes(("01" + s) + '\r\n', encoding = 'utf-8'))
ser.timeout = 1
''' if answer not finished but new information sent OBD will stop writing and listen to UART *'''
r = ser.read(999)
while ">" not in r
r = r + ser.read(999)
print(r) # debug
r.decode('utf-8')
response[count] = r
print(response[count]) #see what it looks like in utf-8
myfile.write(str(','+response[count]))
count +=1
ser.close()
如果是的任何權益:我使用通過USB接口,這似乎與SCANTOOL軟件flawlesly工作的ELM327兼容的設備,我的車是內置2000和ECU是大衆的。對已停止信息