python 下串口數據的讀取,解析,和保存-

#!/usr/bin/python # -*-coding: utf-8 -*-

import serial import threading import binascii from datetime import datetime import struct import csv class SerialPort: def __init__(self, port, buand): self.port = serial.Serial(port, buand) self.port.close() if not self.port.isOpen(): self.port.open() def port_open(self): if not self.port.isOpen(): self.port.open() def port_close(self): self.port.close() def send_data(self): self.port.write('') def read_data(self): global is_exit global data_bytes while not is_exit: count = self.port.inWaiting() if count > 0: rec_str = self.port.read(count) data_bytes=data_bytes+rec_str #print('當前數據接收總字節數:'+str(len(data_bytes))+' 本次接收字節數:'+str(len(rec_str)))
                #print(str(datetime.now()),':',binascii.b2a_hex(rec_str))
 serialPort = 'COM6'  # 串口
baudRate = 115200  # 波特率
is_exit=False data_bytes=bytearray() if __name__ == '__main__': #打開串口
    mSerial = SerialPort(serialPort, baudRate) #文件寫入操做
    filename=input('請輸入文件名:好比test.csv:') dt=datetime.now() nowtime_str=dt.strftime('%y-%m-%d %I-%M-%S')  #時間
    filename=nowtime_str+'_'+filename out=open(filename,'a+') csv_writer=csv.writer(out) #開始數據讀取線程
    t1 = threading.Thread(target=mSerial.read_data) t1.setDaemon(True) t1.start() while not is_exit: #主線程:對讀取的串口數據進行處理
        data_len=len(data_bytes) i=0 while(i<data_len-1): if(data_bytes[i]==0xFF and data_bytes[i+1]==0x5A): frame_code=data_bytes[i+2] frame_len=struct.unpack('<H',data_bytes[i+4:i+6])[0] frame_time=struct.unpack('<I',data_bytes[i+6:i+10])[0] print('幀類型:',frame_code,'幀長度:',frame_len,'時間戳:',frame_time) #print(frame_code,frame_len,frame_time)
                if frame_code==0x03:   #判斷幀類型
                    #struct 解析數據幀
 accelerated_x,accelerated_y,accelerated_z,angular_x,angular_y,angular_z,tem,speed_x,speed_y,speed_z,\ angular_v_x,angular_v_y,angular_v_z=struct.unpack('<fffffffffffff',data_bytes[i+12:i+12+frame_len-6]) dt=datetime.now() nowtime_str=dt.strftime('%y-%m-%d %I:%M:%S')  #時間
                    loc_str=[nowtime_str,frame_time,accelerated_x,accelerated_y,accelerated_z,angular_x,angular_y,angular_z,tem,speed_x,speed_y,speed_z,\ angular_v_x,angular_v_y,angular_v_z] #寫入csv文件
                    try: csv_writer.writerow(loc_str) except Exception as e: raise e i=i+6+frame_len+3
            else: i=i+1 data_bytes[0:i]=b''

代碼簡介:本代碼主要用來處理陀螺儀發送過來的串口數據,主線程用struct模塊對串口數據進行解析,用csv模塊對解析出來的數據進行保存,子線程用來進行讀取串口數據,並將數據以字節流的方式存儲到全局變量data_bytespython

筆記:數組

struct模塊,用於解析字節流spa

binascii模塊,用於十六進制形式的顯示線程

bytearray.fromhex():將十六進制字符串轉爲字節數組code

相關文章
相關標籤/搜索