0

我对 Arduino 和 Python 很陌生。我正在使用 Pyserial 在 Arduino Uno 和我的笔记本电脑之间进行通信。我笔记本电脑中的 Python 脚本由 H3D 查看器调用,该查看器链接到 Novint Falcon。

我的笔记本电脑将 Falcon 的位置数据发送到 Arduino,然后发送给机器人。现在我只是想读回我从 Arduino 发送的数据,以确保一切正常。但事实并非如此!

这是我的 Python 脚本的一部分(由 .x3d 文件调用)。

dp_text, = references.getValue()

class display (threading.Thread): 
  def __init__(self, delay):
    threading.Thread.__init__(self)
    self.delay = delay

  def run(self):
    while 1:

        receivedFalconData=[]
        tex=[]
        tex.append("DevicePosX = " + str(localFalconData))

        receivedFalconData=ser.readline()
        ser.flush()
        ser.flushInput()
        tex.append("Input = " + str(receivedFalconData))

        dp_text.string.setValue(tex)
        time.sleep(self.delay)

displaying = display(0.1)
displaying.start()

上述线程负责每 100 毫秒刷新 H3D 查看器中的文本节点。Arduino的代码如下:

#include <SoftwareSerial.h>

char Axispos[6] ={0,0,0,0,0,0};
int xvalue= 0;

SoftwareSerial mySerial(7,6); //RX, TX

void setup() {

  Serial.begin( 9600 );
  Serial.flush();
  mySerial.begin(9600);
}

void loop(){

  while( Serial.available() > 0 ) 
  {
    Serial.readBytes(Axispos,6);
    Serial.flush();

    xvalue = (Axispos[0] << 8) + (Axispos[1] & 0xff);

    Serial.println(xvalue);
    Serial.flush();

    mySerial.write(Axispos);
    mySerial.flush();

    delay(500);

  }
}

Arduino 读取的 x 轴值被发送回笔记本电脑并存储在 receivedFalconData 中。该值应该与 localFalconData 相同,即脚本本身中的 x 轴值。

结果:receivedFalconData 模仿 localFalconData 几秒钟,然后开始疯狂。

不过,它有时会再次显示正确的值,这告诉我这可能是 Pyserial 输入缓冲区溢出的问题?怎么会这样,因为(如果我是正确的)serial.readline() 在读取输入缓冲区后清空输入缓冲区?此外,Arduino 仅每 0.5 秒发送一次数据,而笔记本电脑每 0.1 秒读取一次。

但是当 readline() 部分被放置在用于发送数据的类中时(每当 Falcon 有新数据可用时调用它), receivedFalconData 是完全正确的。

另外,当它以 H3D 显示时,我在 receivedFalconData 后面得到了其中两个 ☐ 符号......

请有Pyserial经验的人帮助我吗?如果您仍然不清楚我的问题,我很乐意提供更多信息。

4

0 回答 0