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

how to remove the delay in obtaining data from the Arduino via COM?

我有一个连接到操纵杆的 Arduino。 Arduino 通过 COM 端口将数据发送到我的电脑。 PC端,Python中程序处理的数据,其中圆圈随摇杆移动。事实是,几分钟后,操纵杆和圆圈之间存在延迟。

A​​rduino 代码

#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 代码处理。