【问题标题】:Python 2.7 Escape with keyboard from reading serial dataPython 2.7 使用键盘退出读取串行数据
【发布时间】:2014-03-03 03:52:47
【问题描述】:

我是 Python 2.7 的新手,需要一些帮助。 我想编写一个脚本,该脚本将使用串行端口从传感器读取数据,并将所有这些数据保存在一个文件中,以及一个时间戳。传感器定期发送数据。我希望应用程序完成它的循环或简单地接收数据,并在接收到预定义数量的数据或按下键盘上的键时关闭文件和端口。 (目前任何键都足够了)。

问题在于它以正确的方式将数据保存在文件中,但我无法通过按键来转义和关闭文件。我猜外壳可能被阻塞了。我不明白为什么它不起作用。任何帮助将不胜感激。我使用的是 Windows 7。

这是我的代码:

import serial
import io
from time import gmtime, strftime
import msvcrt

medidas= 10  
continuar=1
n_medidas=0

ser=serial.Serial(3,115200)
data_file=open ('data.txt','w')

fecha=strftime("(UTC) %a %d %b %Y %Hh:%Mm:%Ss",gmtime())
data_file.write('Datos enviados '+fecha+' por AP:\n')
data_file.write('Time_stamp' +'\t'+ 'EDx' +'\t'+ 'V(ADC)'+'\t'+'I(ADC)\n')

while continuar:
    tiempo=strftime("%Hh:%Mm:%Ss",gmtime())
    x=ser.readline()
    data=tiempo+'\t' +x 
    print (data)
    data_file.write(data)
    n_medidas += 1

    if msvcrt.kbhit():
        continuar=0

    if n_medidas == medidas :
        break

data_file.close()
ser.close()

谢谢。

【问题讨论】:

  • 你总是可以在 bash 中尝试 ctrl+c 来杀死一个进程,即使我不确定这是实现它的正确方法。
  • Ctrl+c 终止进程,但直到那一刻它才关闭接收到数据的文件。目的是保存所有读取的数据,直到密钥被预置在文件中。谢谢!

标签: python python-2.7 keyboard serial-port escaping


【解决方案1】:

要正确执行此操作,您应该使用模块 select 中的 select。它是一种操作系统工具,用于“等待”来自多个流(在您的情况下是传感器和键盘)的数据。

import select, sys

with open('/path/to/my/sensor') as sensorFile, \
     open('/path/to/sensorDumpFile', 'w') as sensorDump:
  while True:
    r, w, e = select.select([ sys.stdin, sensorFile ], [], [])
    if sys.stdin in r:  # data coming from keyboard?
      break  # bail out
    if sensorFile in r:
      dataFromSensor = os.read(sensorFile.fileno(), 50)  # reads what's there, at most 50 bytes
      sensorDump.write(dataFromSensor)

如果您想对单个按键做出反应,您需要先将 tty 设置为无缓冲模式,但我认为这不是您现在的主题。 (如果您也对此感兴趣,请说出来。)

【讨论】:

  • 谢谢。我忘了提到我使用的是 Windows 7。在阅读 select 的文档时,如果我理解良好的话,这似乎更适用于 Unix。
  • 不,select 不限于 Unix,如果您只使用文件和标准输入,这应该可以工作。不过,在套接字方面存在差异,AFAIK。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 2016-04-13
  • 1970-01-01
  • 2017-09-12
  • 1970-01-01
相关资源
最近更新 更多