我有一个连接到串行通信端口的仪器。我在Windows XP中使用Python 3.2,加上pySerial模块。当我执行由一系列打开通信端口,配置它,将字符串写入并从中接收字符串的语句组成的脚本时,我遇到了问题。与仪器(控制)相关的命令或与仪器响应(响应)相关的命令。如何使python脚本中的语句像在交互式shell中执行语句一样
当这些语句在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秒的延迟,9#则延迟到#2。我在那里得到正确的答复。但是,如果我执行上面的脚本,则根本没有延迟,并且得到不正确的结果(垃圾)。我读超时时间设置通信端口设置为0,因为
comport.timeout=0
所以COMPORT应该是,如果它等待行或文件结束的最后阻塞模式。
更新(2011年8月19日)
我有一个更新原来的职位,我前几天做。我想我知道问题是什么,并想知道是否有人有解决方案:
在每个语句之后放置“print”和“time.sleep(delay)”后,我发现脚本运行时在执行pyserial命令时执行pyserial语句,比如“comport.write(..)”或“comport.readlines(...)”(显示为等待并忙着做某件事,你知道串口慢)。例如,当我在python交互式shell中执行所有语句时,如果没有返回前一个语句,我将无法输入并运行新语句。让我们来看看,如果comport.readlines()没有返回,我不能键入并运行下一个comport.write(...)statemtn。但是,在正在运行的脚本中,如果comport.readlines()忙于读取,则下一个语句正在运行,如果下一个语句碰巧是comport.write()会中止读取。
有什么办法可以强制python脚本的行为准确地按顺序运行吗?
+1。文档可在http://pyserial.sourceforge.net/pyserial_api.html#classes – mtrw
不行,问题是,当语句在shell中逐一运行时,它们的行为是正确的,而它们的行为不同(结果错误)当他们通过导入文件并使用包含相同语句的函数来运行时。 – lzlu123