我有一个连接到操纵杆的arduino。Arduino通过COM端口将数据发送到我的PC。在PC上,该程序在Python处理的数据,其中圆圈用操纵杆移动。事实是,几分钟后,操纵杆和圆圈之间存在延迟。
Arduino的代码
#define axis_X 0
#define axis_Y 1
int value_X, value_Y = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
value_X = analogRead(axis_X);
Serial.print(value_X, DEC);
Serial.print("|");
value_Y = analogRead(axis_Y);
Serial.print(value_Y, DEC);
Serial.print("n");
delay(20);
}
PC的代码
import Tkinter as tk
import serial
import os
import sys
import time
#connect to COM
ser = serial.Serial('COM11', 9600, dsrdtr = 1,timeout = 0)
def data():
time.sleep(0.02)
serialline = ser.readline().split("n")
coord = []
if serialline[0]:
string = serialline[0]
coord = string.split("|")
return coord
#create window
root = tk.Tk()
canvas = tk.Canvas(root, width=1000, height=700, borderwidth=0, highlightthickness=0, bg="black")
canvas.grid()
def _create_circle(self, x, y, r, **kwargs):
return self.create_oval(x-r, y-r, x+r, y+r, **kwargs)
tk.Canvas.create_circle = _create_circle
r = 50
x = 100
y = 100
sm = 200
cir = canvas.create_circle(x, y, r, fill="blue", outline="#DDD", width=1)
root.wm_title("Circles and Arcs")
while 1:
coord = data()
x = int(coord[0])/5
y = int(coord[1])/5
canvas.coords(cir,x+ sm,y+sm,x+sm + 2*r,y+sm + 2*r)
root.update()
如何解决此问题?
在Arduino代码中,仅在坐标更改时发送坐标:
int value_X = 0, value_Y = 0;
int old_X = 0, old_Y = 0;
void loop() {
value_X = analogRead(axis_X);
value_Y = analogRead(axis_Y);
if ( value_X != old_X || value_Y != old_Y )
{
Serial.print(value_X, DEC);
Serial.print("|");
Serial.print(value_Y, DEC);
Serial.print("n");
old_X = value_X;
old_Y = value_Y;
}
delay(20);
}
在Python代码中,删除延迟(time.sleep(0.02)
)。我的猜测是,Arduino比Python代码接收数据更快地发送数据,因此最终您有一个未阅读的python代码来处理的未读消息的队列。