Python 2.7使用键盘逃脱读取串行数据

时间:2014-02-06 09:35:47

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

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

问题是,它以正确的方式在文件中保存数据,但是我无法通过按键来转义和关闭文件。我猜shell可能会被阻止..我不明白为什么它不起作用。任何帮助将不胜感激。我正在使用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()

感谢。

1 个答案:

答案 0 :(得分:0)

要正确执行此操作,您应该使用模块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设置为无缓冲模式,但我认为这不是你现在的话题。 (如果您对此感兴趣,请这样说。)