如何从Arduino向Python发送值,然后使用该值

|| 我正在构建一个使用Python进行远程控制的机器人,以通过简单的GUI通过Internet发送控制消息。 GUI和控制系统使我的代码工作得很好,但是我陷入了困境。我正在尝试使用视差ping传感器来获取与Arduino Mega的对象信息的距离,并将该值发送到我的Python控制脚本以显示在远程GUI上。 我遇到的主要问题是如何将将使用已建立的COM端口与Arduino集成的Python代码,并发送一条消息以通知Arduino轮询ping传感器,然后发送至将接收该值的Python程序,然后让我将该值插入到GUI中。 我已经有了这段代码来控制Arduino,并且可以通过我的简单GUI来工作。
import serial
ser = serial.Serial(\'/dev/ttyUSB0\', 9600)

from PythonCard import model

class MainWindow(model.Background):
    def on_SpdBtn_mouseClick(self, event):
       spd = self.components.SpdSpin.value
    def on_FBtn_mouseClick(self, event):
       spd = self.components.SpdSpin.value
       ser.write(\'@\')
       ser.write(\'F\')
       ser.write(chr(spd))
    def on_BBtn_mouseClick(self, event):
       spd = self.components.SpdSpin.value
       ser.write(\'@\')
       ser.write(\'B\')
       ser.write(chr(spd))
    def on_LBtn_mouseClick(self, event):
       spd = self.components.SpdSpin.value
       ser.write(\'@\')
       ser.write(\'L\')
       ser.write(chr(spd))
    def on_RBtn_mouseClick(self, event):
       spd = self.components.SpdSpin.value
       ser.write(\'@\')
       ser.write(\'R\')
       ser.write(chr(spd))
    def on_SBtn_mouseClick(self, event):
       spd = self.components.SpdSpin.value
       ser.write(\'@\')
       ser.write(\'S\')
       ser.write(\'0\')
    def on_PngDisBtn_mouseClick(self, event):
       ser.write(\'~\')
       ser.write(\'P1\')
       ser.write(\'p2\')

app = model.Application(MainWindow)
app.MainLoop()
我真正想做的是改进上面的代码,并添加一个按钮以单击以告诉Python向Arduino发送一条消息,以检查ping传感器并返回值。 我非常了解Arduino代码,但最近两周才开始使用Python。     
已邀请:
基本上,就像您已经在做的一样,您只需要向Arduino发送一个合适的命令,然后等待Arduino将东西发送回来即可。 python的结尾可能看起来像这样
ser.write(\'foo\')
retval = ser.readline() # read a complete line (\\r\\n or \\n terminated), 
    #or you could use read(n) where n is the number of bytes you want (default=1)
ping_data = retval.strip() # strip out the newline, if you read an entire line
当然,这会让您得到一个字符串,您可能希望将其转换为int或float以便在以后的计算中使用它(将int(ping_data)或float(ping_data)用于字符串或struct) .unpack,以防其字节序列需要先解压缩为合理的东西,但这完全取决于您如何表示传感器数据。     
也许看看Pyduino项目:   pyduino是一个库,通过该库,您可以从Python内部与装有Firmata协议的Arduino板进行通信。它当前支持Firmata协议的版本2。     
首先,我想说,先前的答案是好的,有用的,直接相关的。我的评论较为笼统,适用于实现往返Arduino的双向数据流的任何人。基本思想是设计数据流,以使输入Arudino草图的数据可以人类键入,而来自Arduino草图的数据则可以人类读取。这并非总是可能的,但经常是这样。 关键思想是用串行监视器运行Arduino草图几次。您可以在IDE菜单中的“工具”下找到“串行监视器”。您也可以键入Ctrl-Shift-M来调用串行监视器。 串行监视器显示Arduino草图发送回给您的内容。但是,它也允许您键入要发送到Arduino草图的数据。换句话说,仅使用串行监视器即可测试和调试串行数据流的两端。 看看出现了什么。假设您的草图尝试通过Serial.print()发送回数据,这通常会很有帮助。一些注意事项。绝对确保在串行监视器中设置的波特率与草图中的波特率完全匹配(9600在几乎所有情况下都是不错的选择)。 第二点很重要。调出串行监视器会强制在Arduino板上复位。您的草图重新开始(总是)。这是一件好事,因为它每次都会为您提供全新的运行。请注意,仅通过将波特率设置为9600(即使已经是9600),也可以强制进行重置。这使您可以在串行监视器中运行许多测试,而不必每次都重新启动串行监视器     

要回复问题请先登录注册