为什么这个 sleep() 函数允许此代码运行,但如果没有它就会失败?

Why does this sleep() function allow this code to run, but fail without it?

提问人:zebra14420 提问时间:2/1/2022 更新时间:2/2/2022 访问量:55

问:

上面的脚本应该以字符串形式接收用户输入。字符串将类似于“120,50”,其中 120 是 x 坐标,50 是 y 坐标。我编写了一个名为“judge”的函数,它将接受用户输入,将其一分为二(x 和 y),然后检查 x 或 y 是否大于 127 或小于 -127。如果是这种情况,它应该从 x/y 值中添加或减去 127。这样做是为了获得差异。然后,它将最初得到差值所需的 127(或减去)相加。计算后,这些值被发送到 arduino,鼠标在其中相应地移动。

主机上的 main.py

import serial, serial.tools.list_ports
import win32api
from time import sleep

# print list of available comports
ports = list(serial.tools.list_ports.comports())

for _ in ports:
    print(_)


# establish connection with given comport
comport = input("Enter comport: COM")
ser = serial.Serial(f"COM{comport}", 115200)

# send coordinates in bytes
def write_read(x):
    ser.write(x.encode("utf-8"))

def judge(num, append_string_x, append_string_y):
    x, y = num.split(",")

    if int(x) > 127:
        append_string_x = str(int(x) - 127)
        # ADD 127 AFTER SENDING
        write_read("127,0")
        sleep(0.01)  # Sleep is used to circumvent a bug I found

    elif int(x) < -127:
        append_string_x = str(int(x) + 127)
        # SUBTRACT 127 AFTER SEND
        write_read("-127,0")
        sleep(0.01)  # Sleep is used to circumvent a bug I found

    else:
        append_string_x = str(x)

    if int(y) > 127:
        append_string_y = str(int(y) - 127)
        # ADD 127 AFTER SENDING
        write_read("0,127")
        sleep(0.01)  # Sleep is used to circumvent a bug I found

    elif int(y) < -127:
        append_string_y = str(int(y) + 127)
        # SUBTRACT 127 AFTER SENDING
        write_read("0,-127")
        sleep(0.01)  # Sleep is used to circumvent a bug I found

    else:
        append_string_y = str(y)

    x_y =  f"{append_string_x},{append_string_y}"
    write_read(x_y)
    sleep(0.01)  # Sleep is used to circumvent a bug I found


# main while loop
while True:
    num = input("Enter a number: ")
    judge(num, append_string_x="", append_string_y="")

Arduino上的main.c

#include "HID-Project.h"

void setup() {

  Serial.begin(115200);
  Serial.setTimeout(1);  // This shit almost gave me a heart attack
  Mouse.begin();

}

void loop() 
{
    if(Serial.available() > 0)
    {
        String str = Serial.readStringUntil(',');
        int dx = str.toInt();
        int dy = Serial.parseInt();
        mouse_move(dx, dy);
    }
}

void mouse_move(int dx, int dy)
{
  Mouse.move(dx, dy);
}

没有调用 main.py 的行为sleep(0.01)

behavior.jpg

当 sleep(0.01) 调用不包括在 main.py 中时,为什么会有 y 轴移动?

编辑:如果有帮助,我正在使用 Arduino Micro atmega32u4。

Python Windows arduino pywin32 pywin

评论

0赞 Samwise 2/1/2022
只是快速浏览了一下pyserial文档--如果你在末尾打一个电话怎么办?ser.flush()write_read
1赞 Keith 2/1/2022
通常,在没有流量控制的情况下处理串行端口时,可能会获得部分读取。睡眠可以克服这个问题,但最好是将数据框起来,或者使用某种分隔符来确保所有数据同步。
0赞 mmixLinus 2/1/2022
您的图表是如何创建的?为什么你的图显示 Y 分量,而右边的数字却没有?此外,绿线对于所有 X >= 128 具有相同的 X 长度

答:

0赞 mmixLinus 2/2/2022 #1

您的 s 之间没有“数字结尾”字符。这可能会导致数字彼此相邻到达,从而导致读取函数读取不正确的整数。ser.write

write_read("0,-127")
...
x_y =  f"{append_string_x},{append_string_y}"
write_read(x_y)

因此,将在Arduino端串联(作为一个字符串)读取。-127x

您可以通过发送其他分隔符来解决此问题:,

write_read("0,-127,")