Python从串口读取

时间:2016-11-15 13:45:25

标签: python serial-port

我有一个读卡连接到ttyUSB0设备,我需要制作一个python脚本,当运行时将等待(例如30s)一张卡通过并在它通过后接收一行数据关闭脚本和仅打印带有数据的行。如果卡片未在30秒内通过,请关闭剧本。

这是脚本:

#!/usr/bin/python

import time
import serial

ser = serial.Serial(
    port='/dev/ttyUSB0',
    baudrate = 4800,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.SEVENBITS,
    timeout=1
)

counter=0

while 1:
    x=ser.readline()
    print x

有了这个,它会一直打印线直到我按Ctrl + C

编辑:找到了如何等待我想要的读取,现在,在30秒后使整个脚本超时的最佳方法是什么?

#!/usr/bin/python

import time
import serial

ser = serial.Serial(
        port='/dev/ttyUSB0',
        baudrate = 4800,
        parity=serial.PARITY_NONE,
        stopbits=serial.STOPBITS_ONE,
        bytesize=serial.SEVENBITS,
        timeout=None
)


#while 1:
x=ser.read(size=16)
print x

3 个答案:

答案 0 :(得分:0)

为了使脚本休眠30秒,只需添加以下内容:

time.sleep(30)
x = ser.read()之前

答案 1 :(得分:0)

如果插入任何东西,你肯定可以等待30秒才能完成测试(正如Fejs'回答所建议的那样),但我想你每次插入东西时都不想等待30秒

如果您想连续测试任何内容并在找到某些内容时终止脚本,您可以执行以下操作:

for x in range(30):
    if ser.read(size=16) != None:
        x = ser.read(size=16)
        #(DO WHATEVER WITH X HERE)
        break
    else:
        time.sleep(1)

这将检查连续可读的内容,每秒一次,持续30秒。如果找到了什么,它会终止for循环。

答案 2 :(得分:0)

我发现轮询串口的最简单方法是使用时间模块。这是通过计算您希望运行的结束时间点并将其用作while循环的条件来完成的。

#Set up serial connection
import time
time_end = time.time() + 30

while time.time() < time_end:
    x = ser.read(16)
    if x is not None:
        break

另外,根据pySerial api,传递超时值None表示阻塞模式。换句话说,串口位于并侦听端口,直到读取数据。我建议传递一个浮点数(其值取决于你的应用程序)。