python3使用serial以及pyserial包读取串口数据并解析字节数组,涉及数据移位以及Python无符号整数转为有符号整数操作
生活随笔
收集整理的這篇文章主要介紹了
python3使用serial以及pyserial包读取串口数据并解析字节数组,涉及数据移位以及Python无符号整数转为有符号整数操作
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 代碼如下
import serial import serial.tools.list_ports import json import chardetgps_data = {'lat':[], 'lon':[], 'height':[], 'eulers':[], 'speed':[]} def getLatLon(data, index):lat = 0lon = 0for i in range(8):d = int(data[index+i], 16)left = i * 8lat |= (d << left)for i in range(8, 16):d = int(data[index+i], 16)left = (i - 8) * 8lon |= (d << left) lat = round(lat * 0.0000000001, 2)lon = round(lon * 0.0000000001, 2) return lat, londef convert2signed(euler):if (euler & 0x80000000) != 0:comple = euler & 0x7fffffffoppo = comple - 1ori_noSigned = oppo ^ 0x7fffffffreturn -ori_noSignedreturn eulerdef getEuler(data, index):eulers = [0, 0, 0]for i in range(4):d = int(data[index+i], 16)left = i * 8eulers[0] |= (d << left)for i in range(4, 8):d = int(data[index+i], 16)left = (i - 4) * 8eulers[1] |= (d << left) for i in range(8, 12):d = int(data[index+i], 16)left = (i - 8) * 8eulers[2] |= (d << left)eulers[0] = convert2signed(eulers[0])eulers[1] = convert2signed(eulers[1])eulers[2] = convert2signed(eulers[2])eulers[0] = round(eulers[0] * 0.000001, 2)eulers[1] = round(eulers[1] * 0.000001, 2)eulers[2] = round(eulers[2] * 0.000001, 2) return eulersdef analysisData(data):lat = 0.0lon = 0.0eulers = [0.0, 0.0, 0.0]if (len(data) < 4) or (data[0] != '59' or data[1] !='53') \or (len(data) < (int(data[4], 16) + 5)):return lat, lon, eulerselse:count_flag = 0init_index = 5datas_len = len(data)print(datas_len)while init_index < datas_len and count_flag < 2:data_id = data[init_index]data_len = int(data[init_index+1], 16)data_start = init_index + 2if(data_id == '68'):count_flag += 1lat, lon = getLatLon(data, data_start)elif(data_id == '40'):count_flag += 1eulers = getEuler(data, data_start)init_index += (2+data_len)return lat, lon, eulers def saveData(lat, lon, eulers, cnt):gps_data['lat'].append(lat)gps_data['lon'].append(lon)gps_data['height'].append('')gps_data['eulers'].append(eulers)gps_data['speed'].append('')if cnt % 10 == 0:with open('C:\\Users\\tiago\\Desktop\\gps.json', 'w') as file_f:json.dump(gps_data, file_f)def getSerialData():port_list = list(serial.tools.list_ports.comports())if len(port_list) == 0 :print('no port can use !')else:port = port_list[0][0]bps = 460800 timeout = 3ser = serial.Serial(port, bps, timeout=timeout) # rtscts=True, dsrdtr=Trueprint('serial info: ', ser.port, ser.baudrate, ser.bytesize, ser.stopbits, ser.parity)loop_cnt = 1data = []odd2even_flag = Trueodd2even = 0while True:if odd2even_flag and odd2even > 300:odd2even_flag = Falseser.read()char1 = ser.read().hex()char2 = ser.read().hex()if char1 == '59' and char2 == '53':odd2even_flag = False#print(data)lat, lon, eulers = analysisData(data)if((lat - 0.0) > 0.1 or (lon - 0.0) > 0.1):saveData(lat, lon, eulers, loop_cnt) print(lat, lon)print(eulers)data.clear()data.append('59')data.append('53')loop_cnt += 1else:data.append(char1)data.append(char2) odd2even += 1if __name__ == '__main__':getSerialData()?
總結
以上是生活随笔為你收集整理的python3使用serial以及pyserial包读取串口数据并解析字节数组,涉及数据移位以及Python无符号整数转为有符号整数操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis集群CentOS系统配置企业级
- 下一篇: Python使用proj将GPS经纬度数