提问人:zebra14420 提问时间:2/1/2022 更新时间:2/2/2022 访问量:55
为什么这个 sleep() 函数允许此代码运行,但如果没有它就会失败?
Why does this sleep() function allow this code to run, but fail without it?
问:
上面的脚本应该以字符串形式接收用户输入。字符串将类似于“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)
当 sleep(0.01) 调用不包括在 main.py 中时,为什么会有 y 轴移动?
编辑:如果有帮助,我正在使用 Arduino Micro atmega32u4。
答:
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端串联(作为一个字符串)读取。-127
x
您可以通过发送其他分隔符来解决此问题:,
write_read("0,-127,")
下一个:“___”无法解析为变量
评论
ser.flush()
write_read