【发布时间】:2018-09-14 13:23:07
【问题描述】:
我有从 2 个设备获取串行数据并写入 .txt 文件的 python 代码。每 4-15 分钟,.txt 文件中就会丢失大约 30-45 秒的数据,这对于我们的用例来说是不可接受的。我花了几个小时在谷歌上搜索和搜索关于多处理和串行端口数据采集的 SO,但还没有提出解决方案。
这是我的代码
gpsser = input(("Enter GPS comport as 'COM_': "))
ser = serial.Serial(port=gpsser,
baudrate=38400,
timeout=2,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS)
root = Tk()
root.title("DualEM DAQ")
path = filedialog.asksaveasfilename() + ".txt"
file = glob.glob(path)
filename = path
with open(filename, 'wb') as f:
w = csv.writer(f, dialect='excel')
w.writerow(['header'])
def sensor():
while True:
try:
NMEA1 = dser.readline().decode("ascii")
while dser.inWaiting() == 0:
pass
NMEA1_array = NMEA1.split(',')
NMEA2_array = NMEA2.split(',')
NMEA3_array = NMEA3.split(',')
NMEA4_array = NMEA4.split(',')
if NMEA1_array[0] == '$PDLGH':
value1 = NMEA1_array[2]
value2 = NMEA1_array[4]
if NMEA1_array[0] == '$PDLG1':
value3 = NMEA1_array[2]
value4 = NMEA1_array[4]
if NMEA1_array[0] == '$PDLG2':
value5 = NMEA1_array[2]
value6 = NMEA1_array[4]
return (float(value1), float(value2), float(value3),
float(value4), float(value5), float(value6),
except (IndexError, NameError, ValueError, UnicodeDecodeError):
pass
def gps():
while True:
try:
global Status, Latitude, Longitude, Speed, Truecourse, Date
global GPSQuality, Satellites, HDOP, Elevation, Time
while ser.inWaiting() == 0:
pass
msg = ser.readline()
pNMEA = pynmea2.parse(msg)
if isinstance(pNMEA, pynmea2.types.talker.RMC):
Latitude = pynmea2.dm_to_sd(pNMEA.lat)
Longitude = -(pynmea2.dm_to_sd(pNMEA.lon))
Date = pNMEA.datestamp
Time = datetime.datetime.now().time()
if () is not None:
return (Longitude, Latitude, Date, Time)
except (ValueError, UnboundLocalError, NameError):
pass
while True:
try:
with open(filename, "ab") as f:
data = [(gps() + sensor())]
writer = csv.writer(f, delimiter=",", dialect='excel')
writer.writerows(data)
f.flush()
print(data)
except (AttributeError, TypeError) as e:
pass
程序正在写入文件,但我需要帮助了解为什么我经常丢失 30-45 秒的数据。导致这种情况发生的瓶颈在哪里?
以下是休息时间的示例,请注意在这种情况下休息时间约为 50 秒。
数据库
【问题讨论】:
-
if () is not None:---> 什么?为什么会有ser.flushInput; ser.flushOutput()...;里面? -
1.关于 if () is not none 的思考过程是查看函数是否返回一个值以返回该值,如果它是 none,则不返回任何内容。我猜我可能不需要那个声明? 2.ser.flushinput()是清空传入串口数据的缓冲区。这有意义吗?
-
编辑了更新的代码并添加了上下文的时间中断图片。
标签: python-2.7 csv serial-port multiprocessing pyserial