python - 如何在python中等待关闭的端口
问题描述
我使用INA219传感器和Arduino制作了一个跟踪电池放电电压的设备,Arduino收集的信息然后通过串行通信发送到Raspberry pi,并针对python编码和matplotlib,drawow模块,输出将被绘制在 LCD 上实时显示,我已经为 Arduino 设置了一个看门狗功能,如果它无论如何冻结都会重置,但与此同时,我如何使用 pyserial 模块等待关闭的端口再次打开而不被终止?在下面你可以看到我的python代码:
import serial
from datetime import datetime, timedelta
import matplotlib.pyplot as plt
from matplotlib.ticker import AutoMinorLocator
from matplotlib.dates import AutoDateLocator, AutoDateFormatter
from drawnow import *
#import csv
Voltage_0 = [0]
Current_0 = [0]
ResInt_0 = [0]
Power_0 = [0]
Voltage_1 = [0]
Current_1 = [0]
ResInt_1 = [0]
Power_1 = [0]
Voltage_4 = [0]
Current_4 = [0]
ResInt_4 = [0]
Power_4 = [0]
Voltage_5 = [0]
Current_5 = [0]
ResInt_5 = [0]
Power_5 = [0]
Time = []
StartTime = 0
PlotTime = 0
PresentTime = 0
i = 0
if __name__ == '__main__':
arduino = serial.Serial('/dev/ttyUSB0', 115200, timeout=1)
plt.ion()
StartTime = datetime.now()
h = StartTime.hour
m = StartTime.minute
s = StartTime.second
PresentTime = StartTime + timedelta(seconds=5)
PlotTime = PresentTime - timedelta(hours= h,minutes= m, seconds= s)
Time.append(PlotTime)
def CreatePlot():
plt.suptitle('Type AA Battery Discharge Window')
ax0 = plt.subplot(2,2,1)
plt.grid(True)
plt.plot(Time, Voltage_0,'#ff0400', label='V0')
ax0.set(xlabel='Time', ylabel='Voltage')
plt.legend(loc='upper center')
plt.subplots_adjust(wspace=0.05, hspace=0.07)
locator = AutoDateLocator()
ax0.xaxis.set_major_locator(locator)
formatter = AutoDateFormatter(locator)
ax0.xaxis.set_major_formatter(formatter)
ax0.xaxis.set_minor_locator(AutoMinorLocator())
plt.xticks(rotation=45, ha='right')
plt.subplots_adjust(bottom=0.30)
plt.ylim(0,1.7)
ax0.label_outer()
ax1 = plt.subplot(2,2,2)
plt.grid(True)
plt.plot(Time, Voltage_1,'#ffaa00', label='V1')
ax1.set(xlabel='Time', ylabel='Voltage')
plt.legend(loc='upper center')
plt.subplots_adjust(wspace=0.05, hspace=0.07)
locator = AutoDateLocator()
ax1.xaxis.set_major_locator(locator)
formatter = AutoDateFormatter(locator)
ax1.xaxis.set_major_formatter(formatter)
ax1.xaxis.set_minor_locator(AutoMinorLocator())
plt.xticks(rotation=45, ha='right')
plt.subplots_adjust(bottom=0.30)
plt.ylim(0,1.7)
ax1.label_outer()
ax2 = plt.subplot(2,2,3)
plt.grid(True)
plt.plot(Time,Voltage_4, '#fff200', label='V4')
ax2.set(xlabel='Time', ylabel='Voltage')
plt.legend(loc='upper center')
plt.subplots_adjust(wspace=0.05, hspace=0.07)
locator = AutoDateLocator()
ax2.xaxis.set_major_locator(locator)
formatter = AutoDateFormatter(locator)
ax2.xaxis.set_major_formatter(formatter)
ax2.xaxis.set_minor_locator(AutoMinorLocator())
plt.xticks(rotation=45, ha='right')
plt.subplots_adjust(bottom=0.30)
plt.ylim(0,1.7)
ax2.label_outer()
ax3 = plt.subplot(2,2,4)
plt.grid(True)
plt.plot(Time,Voltage_5, '#0af219', label='V5')
ax3.set(xlabel='Time', ylabel='Voltage')
plt.legend(loc='upper center')
plt.subplots_adjust(wspace=0.05, hspace=0.07)
locator = AutoDateLocator()
ax3.xaxis.set_major_locator(locator)
formatter = AutoDateFormatter(locator)
ax3.xaxis.set_major_formatter(formatter)
ax3.xaxis.set_minor_locator(AutoMinorLocator())
plt.xticks(rotation=45, ha='right')
plt.subplots_adjust(bottom=0.30)
plt.ylim(0,1.7)
ax3.label_outer()
while True:
if arduino.in_waiting > 0:
arduinoString = arduino.readline().decode('UTF-8').rstrip()
PresentTime = datetime.now()
dataArray = arduinoString.split(',')
vol_0 = float( dataArray[0])
cur_0 = float( dataArray[1])
res_0 = float( dataArray[2])
pow_0 = float( dataArray[3])
Voltage_0.append(vol_0)
Current_0.append(cur_0)
ResInt_0.append(res_0)
Power_0.append(pow_0)
vol_1 = float( dataArray[4])
cur_1 = float( dataArray[5])
res_1 = float( dataArray[6])
pow_1 = float( dataArray[7])
Voltage_1.append(vol_1)
Current_1.append(cur_1)
ResInt_1.append(res_1)
Power_1.append(pow_1)
vol_4 = float( dataArray[8])
cur_4 = float( dataArray[9])
res_4 = float( dataArray[10])
pow_4 = float( dataArray[11])
Voltage_4.append(vol_4)
Current_4.append(cur_4)
ResInt_4.append(res_4)
Power_4.append(pow_4)
vol_5 = float( dataArray[12])
cur_5 = float( dataArray[13])
res_5 = float( dataArray[14])
pow_5 = float( dataArray[15])
Voltage_5.append(vol_5)
Current_5.append(cur_5)
ResInt_5.append(res_5)
Power_5.append(pow_5)
ArdTime = float( dataArray[16])
PlotTime = PresentTime - timedelta(hours= h,minutes= m, seconds= s)
Time.append(PlotTime)
with open('AA_OUTPUT.csv', 'a') as f:
if i==0:
f.write('Time,Voltage_0 (V),Current_0 (mA), Internal Resistance_0 (mohm), Power_0 (mW),'
'Voltage_1 (V),Current_1 (mA), Internal Resistance_1 (mohm), Power_1 (mW),'
'Voltage_4 (V),Current_4 (mA), Internal Resistance_4 (mohm), Power_4 (mW),'
'Voltage_5 (V),Current_5 (mA), Internal Resistance_5 (mohm), Power_5 (mW)\n')
f.write('{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}\n'.format(ArdTime,
Voltage_0[-1],Current_0[-1],ResInt_0[-1],Power_0[-1],
Voltage_1[-1],Current_1[-1],ResInt_1[-1],Power_1[-1],
Voltage_4[-1],Current_4[-1],ResInt_4[-1],Power_4[-1],
Voltage_5[-1],Current_5[-1],ResInt_5[-1],Power_5[-1])) #for Python2 users
i+=1
else:
#f.write(f'{PlotTime},{vol_0},{cur_0},{res_0},{pow_0},{vol_1},{cur_1},{res_1},
# {pow_1},{vol_4},{cur_4},{res_4},{pow_4},{vol_5},{cur_5},{res_5},{pow_5}\n') #for Python3 users
f.write('{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}\n'.format(ArdTime,
Voltage_0[-1],Current_0[-1],ResInt_0[-1],Power_0[-1],
Voltage_1[-1],Current_1[-1],ResInt_1[-1],Power_1[-1],
Voltage_4[-1],Current_4[-1],ResInt_4[-1],Power_4[-1],
Voltage_5[-1],Current_5[-1],ResInt_5[-1],Power_5[-1])) #for Python2 users
drawnow(CreatePlot)
plt.pause(0.0001)
解决方案
is_open
pySerial 模块中的可用于检索它的当前状态。
while True:
if arduino.is_open:
if arduino.in_waiting > 0:
# rest of your code
drawnow(CreatePlot)
plt.pause(0.0001)
else:
arduino.open()
推荐阅读
- mysql - 成功认证后不保存快速会话
- python - 无法使用 Python 3.6 安装 py7zlib 包
- java - 无法将 xml 字符串解组为 java 对象
- apache-kafka - 消费者存在于不同的服务器中
- authentication - Auth0 的主要目的是对您的应用隐藏身份提供者的实现吗?
- polymer-3.x - 在 Polymer 3 中的组件之间传递数据
- python - 添加辅助 y 轴
- string - 查找和替换文本并在“href”中换行
- sql-server - 有没有办法使用 gsqlcmd 导出具有 time(7) 数据类型的表?
- java - 在 RecyclerView 滚动监听器中实现 On click 监听器