2011-08-18 51 views
0

我有一个连接到串行通信端口的仪器。我在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脚本的行为准确地按顺序运行吗?

回答

2

我读pyserial的文件:

timeout = None: wait forever 
timeout = 0: non-blocking mode (return immediately on read) 
timeout = x: set timeout to x seconds (float allowed) 

如果设置comport.timeout = 0,则readlines方法()将立即返回。尝试设置comport.timeout = 10.

+0

+1。文档可在http://pyserial.sourceforge.net/pyserial_api.html#classes – mtrw

+0

不行,问题是,当语句在shell中逐一运行时,它们的行为是正确的,而它们的行为不同(结果错误)当他们通过导入文件并使用包含相同语句的函数来运行时。 – lzlu123

0

尝试在每个comport.write之后插入一个暂停(例如,time.sleep(1))。这会让设备在查找响应之前有时间响应每个命令。

由于HYRY points out,设置timeout0将立即返回,所以它不会做你认为它的作用。除此之外,当你每次执行一条语句时,每行输入时都会有延迟。当你在脚本中执行它们时,它们之间没有太大差距。

+0

我做到了。无论我放入多少延迟,都没有区别 - 运行脚本的结果仍然是错误的。设置超时并不会改变行为 - 正如我以前所评论的那样,重点在于为什么两种情况存在如此之大的差异以及如何解决它。 – lzlu123

+0

我做到了。无论我介绍多少延迟,执行脚本的结果仍然是错误的。 – lzlu123

1

我试着将每个命令字符串粘贴到它自己的函数中,然后按顺序调用它们,并暂停。或者,如果您知道输出数据字符串有多长,您可以设置您的read()/readlines()在许多字节传递后停止读取,或者如果您的读取字符串是可变长度,则可以设置为任意数字。