在Python中通过串口使用扫描仪读取输入
我正在使用扫描仪读取输入,但我想先问一个问题,然后再读取输入的数据。
这是我现在的代码。
ser = serial.Serial()
ser.baudrate = 9600
PORT = 1
#for windows
ser = serial.Serial(PORT, 19200, timeout=1)
x = ser.read()
s = ser.read(11)
line = ser.readline()
#Read input
station = int(raw_input('What is the barcode? '))
有人能给我指个方向吗?
更新一下:输入设备是条形码扫描仪,输出设备是控制台窗口。
我希望输出的格式是这样的:
What is the barcode?
(would wait for scan....)
(Once scanned it would show up on the screen and stored in a variable)
This is the barcode scanned: AAA00000011
我还在使用这个页面上的示例:这个
2 个回答
这个问题的表述似乎有点不清楚。你可以使用Python的raw_input函数从标准输入读取内容来提问,如果你知道设备的波特率,就可以从串口读取字节(否则你会得到一些无用的数据)。不过从例子来看,我不太确定你到底想做什么(而且代码似乎显示你在读取一个值后再提问,这和描述不符)。
如果你知道串口设备在完成传输时会发送\n
,那么你可以使用readline()函数;否则你需要知道它的响应会有多少字节。看起来这是一个条形码扫描器,所以你要确保请求的字节数能够覆盖它可能打印的任何错误代码。如果你读取的字节数太多,就会把下次读取的数据截断;如果读取的字节数太少,就会留下数据在缓冲区里。根据这个链接,数据的字节数要么是6,要么是10,设备的数据手册会说明错误代码的字节数。
你需要的代码大概是这样的(COM1是Windows的写法,Unix系统用/dev/ttyS*):
ser = serial.Serial('COM1', 19200, timeout=1)
station = raw_input('What is the station?')
barcode = ser.read(10)
补充一下:正如Paul所说,read()调用是一个阻塞调用,它会等待直到缓冲区中有串口数据可用,或者直到构造函数中指定的超时时间到达。这意味着你需要在超时时间到期之前扫描一些东西,否则代码会出错。你要么会得到部分扫描结果,要么会得到一个空字符串。
print 'What is the barcode?'
ser = serial.Serial('COM1', 19200, timeout=1)
barcode = ser.read(11)
print 'This is the barcode scanned: ' + barcode
注意,我这里用了11个字节,因为这是你最开始使用的,我假设你的条形码扫描器的数据手册上说它会打印10个字符,然后是一个结束字节,比如\n
。
关于扫描器可能发送的错误代码的信息仍然适用,你需要在打印条形码之前自己处理这些错误。
你帖子里的链接坏了,而且你也没说你用的是什么串口设备,所以很难知道你想做什么。
我觉得raw_input可能不适合你,因为你在上面的代码中使用它的方式,会用到标准输出和标准输入。我猜你是想先打印一个问题,然后从串口连接中获取输入。
如果你确实想这样做,那么你需要把问题写到你想显示的地方,可能是用ser.write,然后再执行你的读取代码。
补充一下:sourceforge现在可以用了。read()方法是阻塞的,根据文档,所以你会先把问题打印到标准输出(可能是屏幕上),然后调用"read()"。你的程序会等待(阻塞),直到接收到正确数量的字节,在你的情况下是11个字节。我假设你发的读取字节的代码实际上是能给你想要的结果的。
print "What is the barcode?"
code = ser.read(11)