#!/usr/bin/python
|
# -*-coding: utf-8 -*-
|
|
from asyncio import sleep
|
from collections import deque
|
from distutils.log import debug
|
from multiprocessing.connection import wait
|
from pickle import FALSE
|
from tracemalloc import start
|
import serial
|
import threading
|
from datetime import datetime
|
import socketio
|
import time
|
import csv
|
# import pysnooper
|
|
|
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('')
|
|
# @pysnooper.snoop()
|
def read_data(self):
|
global is_exit
|
global data_bytes,data_list,csv_writer,int_list
|
while True:
|
while not is_exit:
|
count = self.port.inWaiting()
|
if count > 0:
|
rec_str = self.port.read(count)
|
# data_list.append(rec_str)
|
for byte in rec_str:
|
# print('----------------------------',type(byte),byte)
|
int_list.append(byte)
|
# data_bytes = data_bytes+rec_str
|
# print(str(datetime.now()),':','当前数据接收总字节数:'+str(len(data_bytes))+' 本次接收字节数:'+str(len(rec_str)))
|
# wait(10000)
|
# try:
|
# # writedata ='{}'.format(data_list.popleft())
|
# # Note.write(writedata.encode('hex'))
|
# csv_writer.writerow(rec_str)
|
# except Exception as e:
|
# raise e
|
# @pysnooper.snoop()
|
def write_data(self):
|
global data_L,index_,is_exit,send_list,int_list,sio,serialPort
|
start_array = False
|
while True:
|
while not is_exit:
|
if len(int_list)<1:
|
continue
|
x = int_list.popleft()
|
if(not start_array and x==60):
|
if len(int_list)<3:
|
int_list.appendleft(x)
|
break
|
else:
|
y = int_list.popleft()
|
z = int_list.popleft()
|
m = int_list.popleft()
|
if (y == 170 and z == 85 and m==65):
|
data_L=[[],[],[],[]]
|
index_ =(abs(69-m)%4)
|
data_L[index_].append(x)
|
data_L[index_].append(y)
|
data_L[index_].append(z)
|
data_L[index_].append(m)
|
start_array = True
|
else:
|
data_L[index_].append(x)
|
int_list.appendleft(m)
|
int_list.appendleft(z)
|
int_list.appendleft(y)
|
else:
|
if(len(data_L[index_]) == 61):
|
index_ = (index_+1)%4
|
data_L[index_].append(x)
|
else:
|
data_L[index_].append(x)
|
if(len(data_L[3]) == 61):
|
# send_list.append(data_L)
|
if(data_L[0][3] != 65):
|
start_array = False
|
break
|
try:
|
for r in data_L:
|
csv_writer.writerow(r)
|
except Exception as e:
|
raise e
|
ret = [[],[],[],[]]
|
i = 0
|
while(i<4):
|
if(len(data_L[i]) != 61):
|
continue
|
j = 5
|
while(j<61):
|
ret[i].append(data_L[i][j+1]*256 + data_L[i][j])
|
j = j+2
|
i = i+1
|
# print(parse_data(send_list.popleft()))
|
if sio.connected:
|
dt = datetime.now()
|
nowtime_str = dt.strftime('%Y-%m-%d %H:%M:%S.%f') # 时间
|
sio.emit("msg",{"time": nowtime_str,"serialport":serialPort,"data":ret})
|
data_L = [[],[],[],[]]
|
index_ = 0
|
|
def send_data(self):
|
global send_list,sio
|
while True:
|
while not is_exit:
|
if sio.connected:
|
dt = datetime.now()
|
nowtime_str = dt.strftime('%Y-%m-%d %H:%M:%S.%f') # 时间
|
sio.emit("msg",{"time": nowtime_str,"data":send_list.popleft()})
|
# try:
|
# for r in data_L:
|
# csv_writer.writerow(r)
|
# except Exception as e:
|
# raise e
|
|
def test(self):
|
global is_exit
|
while True:
|
sleep(10)
|
is_exit = False
|
sleep(10)
|
is_exit = True
|
|
serialPort = '/dev/tty.usbserial-14110' # 串口
|
baudRate = 115200 # 波特率
|
socketurl_ = "http://127.0.0.1:3001"
|
is_exit = False
|
data_bytes = bytearray()
|
data_list = deque()
|
send_list = deque()
|
int_list= deque()
|
L = []
|
base_length = 61
|
data_L = [[],[],[],[]]
|
index_ = 0 #第 A/B/C/D 组数据
|
sio = socketio.Client(logger=True, engineio_logger=True)
|
# sio = socketio.Client()
|
start_timer = None
|
csv_writer = None
|
is_data_header = False
|
|
@sio.event
|
def connect():
|
print('connected to server')
|
|
|
@sio.event
|
def pong_from_server():
|
global start_timer
|
latency = time.time() - start_timer
|
print('latency is {0:.2f} ms'.format(latency * 1000))
|
sio.sleep(1)
|
if sio.connected:
|
print(' reconnected')
|
|
|
@sio.on('command_msg')
|
def command_msg(data):
|
global is_exit
|
if data['command'] == 'stop':
|
is_exit = True
|
if data['command'] == 'start':
|
is_exit = False
|
|
def parse_data(data):
|
ret = [[],[],[],[]]
|
i = 0
|
while(i<4):
|
j = 5
|
arr = data[i]
|
print(arr)
|
while(j<61):
|
print('------------------',i,j,arr[j],'----------------------')
|
# ret[i].append(data[i][j+1]*256 + data[i][j])
|
j = j+2
|
i = i+1
|
return ret
|
|
|
if __name__ == '__main__':
|
# serialPort = input("请输入串口字符串")
|
# 打开串口
|
mSerial = SerialPort(serialPort, baudRate)
|
|
# 文件写入操作
|
# filename = input('请输入文件名:比如test.csv:')
|
filename = 'test.csv'
|
dt = datetime.now()
|
nowtime_str = dt.strftime('%y-%m-%d %I-%M-%S') # 时间
|
filename = nowtime_str+'_'+filename
|
out = open(filename, 'w')
|
csv_writer = csv.writer(out)
|
# txt写入
|
# Note=open(nowtime_str+'_test.txt',mode='w')
|
|
# 开始数据读取线程
|
t1 = threading.Thread(target=mSerial.read_data)
|
t1.setDaemon(True)
|
t1.start()
|
|
# 连接socketio
|
sio.connect(socketurl_)
|
# 开始写数据
|
t2 = threading.Thread(target=mSerial.write_data())
|
t2.setDaemon(True)
|
t2.start()
|
|
# sio.wait() #sio事件处理
|
t4 = threading.Thread(target=sio.wait())
|
print('------------------------------------------------------------------------')
|
t4.setDaemon(True)
|
t4.start()
|
|
# 连接socket
|
# remote_IP='192.168.0.225'
|
# remote_port=5000
|
# remote_addr=(remote_IP,remote_port)
|
# socket_=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
|
# socket_.connect(remote_addr)
|