我有一台连接到串行通讯端口的仪器。我在Windows XP中使用Python 3.2,加上pySerial模块。我执行一个脚本时遇到问题,该脚本由一系列语句组成,这些语句打开通信端口,配置它,向其写入字符串并从中接收字符串。 Thoese strings aer指示与仪器相关的命令(控制)或来自仪器的响应(响应)。
当这些语句以交互方式在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
更新(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脚本表现得像按顺序运行?
答案 0 :(得分: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()将立即返回。尝试set comport.timeout = 10.
答案 1 :(得分:1)
我会尝试将每个命令字符串粘贴到自己的函数中,然后按顺序调用它们,并暂停。
或者,如果您知道输出数据字符串的长度,可以将read()
/ readlines()
设置为在经过多个字节后停止读取,或者如果读取字符串则设置为任意数字是可变长度。
答案 2 :(得分:0)
尝试在每个time.sleep(1)
后暂停一下(例如comport.write
)。这将使设备有时间在您查找响应之前响应每个命令。
作为HYRY points out,将timeout
设置为0
会立即返回,因此它不会按照您的想法执行操作。除此之外,当您一次执行一个语句时,在每行输入时会有一个延迟。当您在脚本中执行它们时,它们之间没有太大差距。