#!/usr/bin/python
|
# -*-coding: utf-8 -*-
|
|
from asyncio import sleep
|
from collections import deque
|
from pickle import FALSE
|
from socketio_client import connect_, sio, send_msg
|
import sys
|
import serial
|
import threading
|
import binascii
|
from datetime import datetime
|
import socketio
|
import time
|
import csv
|
import socket
|
# import numpy
|
|
|
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,data_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)
|
# data_bytes = data_bytes+rec_str
|
# print(str(datetime.now()),':','当前数据接收总字节数:'+str(len(data_bytes))+' 本次接收字节数:'+str(len(rec_str)))
|
|
def write_data(self):
|
global is_exit,data_bytes,data_list,csv_writer,L,sio,start_timer,is_data_header,send_list
|
newData = False
|
while True:
|
while not is_exit:
|
i,is_60_index,is_65_index,is_68_index = 0
|
is_first = False
|
# 主线程:对读取的串口数据进行处理
|
if len(data_list)<1:
|
continue
|
dt = datetime.now()
|
nowtime_str = dt.strftime('%y-%m-%d %I:%M:%S') # 时间
|
# 写入csv文件
|
text_ = data_list.popleft()
|
print(type(text_))
|
# if len(send_list) < 1:
|
# continue
|
for each in text_:
|
L.append(int(each))
|
for i in range(len(L)):
|
if(L[i] == 60 and L[i+1]==170 and L[i+2] ==85 and not is_first):
|
is_first = True
|
is_60_first = i
|
match (L[i+3]):
|
case 65:
|
is_65_index = i
|
case 66:
|
is_68_index = 0
|
case 67:
|
is_68_index = 0
|
case 68:
|
is_68_index = i
|
|
# print('---------------------------start---------------------------------')
|
# print(L)
|
try:
|
# writedata ='{}'.format(data_list.popleft())
|
# Note.write(writedata.encode('hex'))
|
csv_writer.writerow(text_)
|
except Exception as e:
|
raise e
|
# 发送socket消息
|
# sio.emit('msg', {'response': 'my response'})
|
if sio.connected:
|
sio.emit("msg",{"time": nowtime_str,"data":L})
|
# socket_.send("msg",{"data":text_})
|
L.clear()
|
# print('-----------------------------end---------------------------------')
|
|
def test(self):
|
global is_exit
|
while True:
|
sleep(10)
|
is_exit = False
|
sleep(10)
|
is_exit = True
|
|
serialPort = 'COM4' # 串口
|
baudRate = 115200 # 波特率
|
socketurl_ = "http://192.168.0.225:5000"
|
is_exit = False
|
data_bytes = bytearray()
|
data_list = deque()
|
send_list = deque()
|
L = []
|
data_L = [[],[],[],[]]
|
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
|
|
if __name__ == '__main__':
|
# 打开串口
|
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_)
|
|
# 开始写数据
|
t3 = threading.Thread(target=mSerial.write_data())
|
t3.setDaemon(True)
|
t3.start()
|
|
# sio.wait() #sio事件处理
|
t2 = threading.Thread(target=sio.wait())
|
t2.setDaemon(True)
|
t2.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)
|