如何通过COM删除从Arduino获取数据的延迟



我有一个连接到操纵杆的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代码来处理的未读消息的队列。

最新更新