与 python 交流 Arduino

Communicate an Arduino with python

我正在尝试使用 python 与 Arduino 进行通信。我能够使用 serial 模块连接它。这是代码:

import serial

while True:
  print "Opening port"
  arduinoData = serial.Serial("com7", 9600)
  print "The port is open"

  while (arduinoData.inWaiting()==0): #I wait for data
    print "There is no data"

  print "Reading data"
  arduinoString = arduinoData.readline()
  print arduinoString

当我想读取数据时,它似乎在挂起,在 arduinoString = arduino.readline().

的行中

可能是什么问题?

您可以使用 if else 语句,而不是在主 while 循环内使用 while 循环。此外,要读取数据,您可以使用带有 arduinoData.inWaiting() 作为参数的读取函数,如下所示:arduinoData.read(arduinoData.inWaiting())。希望这段代码对您有所帮助:

arduinoData = serial.Serial("com7", 9600)

while True:

    if arduinoData.inWaiting() > 0: # check if there is data available
        print "Reading data"
        arduinoString = arduinoData.read(arduinoData.inWaiting()) '''read and decode data'''
        print arduinoString

    else:
        print "There is no data"

好的,您会收到 AttributeError: 'Serial' object has no attribute 'ser' 错误,因为实际上 ser 不存在于 arduinoData 对象中。这是我的错,因为我在想 class 我在我的程序中创建的包含 ser 的程序,它只是另一个串行对象。要解决此问题,只需将 arduinoData.ser 替换为 arduinoData

要补充一点,您可能应该在 while 循环之外声明 arduinoData。你应该这样做,因为每次你创建一个串行对象时,它都需要时间来连接到 Arduino。为此,您的程序可能无法读取数据。

希望这个回答对您有所帮助。

你的代码结构很奇怪。通过在函数中创建 Serial 对象而不使其成为全局对象,我遇到了类似的问题。也许你应该把这一行放在循环之外:

arduinoData = serial.Serial("com7", 9600)

此外,您的初始化似乎有点轻。我通常使用更多参数,但这取决于您的硬件。

ser = serial.Serial( 
    port = 'com4', \
    baudrate = 19200, \
    parity=serial.PARITY_NONE, \
    stopbits=serial.STOPBITS_ONE, \
    bytesize = serial.EIGHTBITS, \
    timeout = 0.25)

您的 readline() 问题的解决方法是改用 read() 函数并检查它是否包含数据。

希望对您有所帮助!