如何消除通过 COM 从 Arduino 获取数据的延迟?
how to remove the delay in obtaining data from the Arduino via COM?
我有一个连接到操纵杆的 Arduino。 Arduino 通过 COM 端口将数据发送到我的电脑。 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 代码处理。
我有一个连接到操纵杆的 Arduino。 Arduino 通过 COM 端口将数据发送到我的电脑。 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 代码处理。