我有一个连接到串行通信端口的仪器。我在 Windows XP 中使用 Python 3.2,外加 pySerial 模块。当我执行一个由一系列语句组成的脚本时遇到问题,这些语句打开通信端口、配置它、写入字符串并从中接收字符串。这些字符串要么是与仪器相关的命令(控制),要么是来自仪器的响应(响应)。
当这些语句在 python 解释器中以交互方式执行时(在 >>> 处),我得到了我所期望的结果,结果是好的和正确的。但是,当我在解释器或 shell 中执行脚本时,我没有得到我想要的。脚本中的语句与我在交互式解释器中使用的相同。
为什么我会出现奇怪的行为,如何更改脚本以使其表现得像交互式解释器?
def read(comport):
wrt_str=b'movt 3000'+b'\r\n'
ret_str=comport.write(wrt_str)
wrt_str=b'scan'+b'\r\n'
ret_str=comport.write(wrt_str)
rsp_str=comport.readlines() #########1
wrt_str=b'hllo'+b'\r\n'
ret_str=comport.write(wrt_str)
rsp_str=comport.readlines()#########2
问题在于上面带有####### 的行。在交互模式下,#1 有大约 1 秒的延迟,#2 有 9 秒的延迟。我在那里得到正确的回应。但是,如果我执行上面的脚本,则完全没有延迟,并且我得到不正确的结果(垃圾)。我在通讯端口设置中将读取超时设置为 0,如
comport.timeout=0
因此,如果它等待行尾或文件结束,则该comport应该处于阻塞模式。
更新(2011 年 8 月 19 日)
我对几天前发布的原始帖子进行了更新。我想我知道问题是什么,并想知道是否有人有解决方案:
在每条语句后加上“print”和“time.sleep(delay)”后,我发现当脚本运行时,它似乎围绕着pyserial语句,例如“comport.write(..)”或“comport.readlines” (...)" 在执行 pyserial 命令时(表现为等待和忙于做某事,你知道串口很慢)。例如,当我在 python 交互式 shell 中执行所有语句时,如果没有返回前一个语句,我将无法键入和运行新语句。好吧,如果 comport.readlines() 没有返回,我就无法键入并运行下一个 comport.write(...) statemtn。但是,在正在运行的脚本中,如果 comport.readlines() 正忙于读取,则下一条语句正在运行,如果下一条语句恰好是 comport.write() 将中止读取。
有没有办法强制 python 脚本表现得像完全按顺序运行?