我对 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经验的人帮助我吗?如果您仍然不清楚我的问题,我很乐意提供更多信息。