我在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会话之间打开端口?
如果没有,是否还有其他方法解决这个问题?
答案 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)
如果这不起作用,请告诉我们。