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

如何将值从Arduino发送到Python,然后使用该值,python,arduino,pyserial,pythoncard,Python,Arduino,Pyserial,Pythoncard,我正在建造一个机器人,它可以使用Python远程控制,通过简单的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.

我正在建造一个机器人,它可以使用Python远程控制,通过简单的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()
我的部分代码工作得很好,GUI和控制系统,但我被卡住了。我正在尝试使用视差ping传感器从一个窗口获取到对象的距离信息,并将该值发送到我的Python控制脚本,以便在远程GUI上显示

我面临的主要问题是如何将使用已建立的COM端口的Python代码与Arduino集成,并发送一条消息,告诉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_数据)或float(ping_数据),或者struct.unpack,以防它是一个字节序列,需要先解压为合理的值,但这一切都取决于如何表示传感器数据).

也许可以查看:

pyduino是一个库,它允许您从Python中与加载了Firmata协议的Arduino板通信。它目前支持Firmata协议的第2版


首先,我要说的是,前面的答案是好的、有用的、直接相关的。我的评论更为笼统,适用于任何实现往返Arduino的双向数据流的人。其基本思想是设计您的数据流,以便能够为Arudino草图中的数据进行人工输入,并为Arudino草图中的数据提供可读性。这并不总是可能的,但通常是可能的

关键的想法是用串行监视器运行Arduino草图几次。您可以在IDE菜单的“工具”下找到串行监视器。您还可以键入Ctrl-Shift-M来调用串行监视器

串行监视器显示Arduino草图返回给您的内容。但是,它还允许您键入发送到Arduino草图的数据。换句话说,您只需使用串行监视器即可测试和调试串行数据流的两侧

看看出现了什么。假设您的草图试图通过Serial.print()发送数据,这通常会非常有用。几点注意事项。绝对确保串行监视器内设置的波特率与草图中的波特率完全匹配(在几乎所有情况下,9600都是一个不错的选择)

第二个要点至关重要。启动串行监视器将强制在Arduino板上重置。你的素描(总是)重新开始。这是一件好事,因为它每次都给你一次全新的体验。请注意,您可以强制重置,只需将波特率设置为9600(即使它已经是9600)。这使您可以在串行监视器内运行许多测试,而无需每次重新启动串行监视器