PySerial:创建没有打开端口的串行对象

时间:2013-08-15 10:48:48

标签: cgi arduino pyserial

我在Arduino上运行一些代码,我的网站有一个滑块,它使用cgi脚本将值传递给Python。然后python脚本使用pySerial将值发送到控制电机的Arduino。

计划是使用网站上的滑块控制电机速度。

然而,每当我更改网站上的值,导致电机停止时,我似乎遇到了Arduino重置的问题。有没有办法解决?我的python代码如下。

#!/usr/bin/env python
import cgi
form=cgi.FieldStorage()

import json

ser = serial.Serial('dev/ttyACM0', 9600) 
#I think there should be a sleep here for 1.5 seconds
ser.write("%s\n" % (form["value"]))
ser.close()

print "Content-type: application/json"
print
print(json.JSONEncoder().encode({"status":"ok"}))

所以,假设我的电机以50%的速度运行,然后在网站上更改一个值,它运行这个执行serial.Serial('dev/ttyACM0', 9600) 命令的脚本。这将打开重置arduino的端口,在传递新命令之前停止电机。

有没有办法在没有刚刚打开端口的情况下将 ser.write("%s\n" % (form["value"])) 传递给arduino?比如在python会话之间打开端口?

如果没有,是否还有其他方法解决这个问题?

2 个答案:

答案 0 :(得分:2)

我认为重置是由于您正在使用的特定Arduino设备的硬件设计。我建议使用Arduino Micro或Leonardo板。它们使用虚拟串行端口,每次打开串行端口时都不应重新启动草图。这是来自Arduino网站:

  

<强> No reset when you open the serial port.

     

与Arduino Uno不同,Leonardo和Micro不会重启你的   在计算机上打开串行端口时草绘。那意味着你   不会看到已经发送到计算机的串行数据   board,包括例如setup()函数中发送的大多数数据。

     

重置时的序列重新枚举。

     

由于电路板没有专用芯片来处理串行   通信,这意味着串口是虚拟的 - 它是一个   软件例程,包括操作系统和板上   本身。就像您的计算机创建串行端口的实例一样   当你插入任何Arduino驱动程序时,Leonardo / Micro会创建一个   串行实例运行其引导加载程序时。董事会是一个   USB连接设备类(CDC)驱动程序的实例。这意味着   每次重置电路板时,USB串行连接都会   破碎并重新建立。董事会将从名单中消失   串口,列表将重新枚举。任何有节目的节目   打开与莱昂纳多的串行连接将失去其连接。这个   与Arduino Uno相反,您可以使用它重置主要部分   处理器(ATmega328P)没有关闭USB连接(哪个   由辅助ATmega8U2或ATmega16U2处理器维护。   这种差异会影响驱动程序的安装,上传,   和沟通......

答案 1 :(得分:0)

我可以使用setDTR(False),但我已经测试过了。不久前,他们修复了最初与setDTR相关的错误。您使用什么操作系统?

ser = serial.Serial('dev/ttyACM0', 9600)
ser.timeout = 1
ser.setDTR(False)

如果这不起作用,请告诉我们。