Java 使用Processing、Arduino和Robot类的鼠标模拟器:函数不一致

Java 使用Processing、Arduino和Robot类的鼠标模拟器:函数不一致,java,windows,arduino,mouse,processing,Java,Windows,Arduino,Mouse,Processing,我为一个严重残疾的人构建了一个鼠标模拟器,它有一系列按+模式排列的按钮,中间的按钮是“点击”。输入被读入Arduino Micro,然后通过USB连接到计算机。使用Arduino库的处理脚本通过使用Robot类移动鼠标来响应这些更改。我为32位和64位windows导出了一个应用程序,但发现.exe文件有问题,于是选择了使用嵌入式Java的.bat文件 这一切在我的电脑(微软Surface,Windows8,64位)上都能完美运行。但是在客户端计算机(Windows7,32位)上,结果是不稳定的

我为一个严重残疾的人构建了一个鼠标模拟器,它有一系列按+模式排列的按钮,中间的按钮是“点击”。输入被读入Arduino Micro,然后通过USB连接到计算机。使用Arduino库的处理脚本通过使用Robot类移动鼠标来响应这些更改。我为32位和64位windows导出了一个应用程序,但发现.exe文件有问题,于是选择了使用嵌入式Java的.bat文件

这一切在我的电脑(微软Surface,Windows8,64位)上都能完美运行。但是在客户端计算机(Windows7,32位)上,结果是不稳定的。每次加载程序时,我都会得到不同的结果。例如,有时向上、向下和单击“工作”。有时,只需打开并单击“工作”。等等单击通常似乎有效,但方向不太可靠,垂直方向比水平方向更有效

我已经证实董事会没有问题。我试着输入一个调试语句,每次移动的“if”语句被触发时都运行println()——我只从那个特定运行的方向得到打印

我看到了这个问题的一些潜在来源:32位和64位窗口之间的差异、Robot类可能存在的问题、USB性能问题(尽管我在客户端笔记本电脑上尝试了多个端口),等等。客户端笔记本电脑的性能通常很差(例如,如果我单击“控制面板”,可能需要整整一分钟才能打开控制面板),因此这也可能与此相关

有人对此有其他见解吗

编辑:根据要求,这里是处理代码的最低版本。Arduino正在运行Firmata:

import processing.serial.*;
import cc.arduino.*; 
import java.awt.*;
import java.awt.event.*;
Arduino arduino;
Robot r;
final int upPin=8;
final int downPin=12;
final int leftPin=10;
final int rightPin=11;
final int buttonPin=9;
final int SPEED=8;
boolean arduinoConnected;
int prevButton=Arduino.LOW;

void setup() {
  arduinoConnected = (Arduino.list().length>0);
  if (arduinoConnected) {
    arduino = new Arduino(this, Arduino.list()[Arduino.list().length-1], 57600);
    arduino.pinMode(buttonPin, Arduino.INPUT);
    arduino.pinMode(upPin, Arduino.INPUT);
    arduino.pinMode(downPin, Arduino.INPUT);
    arduino.pinMode(leftPin, Arduino.INPUT);
    arduino.pinMode(rightPin, Arduino.INPUT);
  } 
  try {
    r = new Robot();
  } 
  catch (Exception e) {
    e.printStackTrace();
  }
}

void draw() {
  arduinoConnected = (Arduino.list().length>0);
  if (arduinoConnected && arduino==null) setup();
  if (arduinoConnected) {
    if (arduino.digitalRead(upPin)==Arduino.HIGH) moveMouse(0,0-SPEED);
    if (arduino.digitalRead(downPin)==Arduino.HIGH) moveMouse(0,SPEED);
    if (arduino.digitalRead(leftPin)==Arduino.HIGH) moveMouse(0-SPEED,0);
    if (arduino.digitalRead(rightPin)==Arduino.HIGH) moveMouse(SPEED,0);
    int button=arduino.digitalRead(buttonPin);
    if (button==Arduino.LOW && prevButton==Arduino.HIGH) clickMouse(InputEvent.BUTTON1_DOWN_MASK);
    prevButton=button;
  }
}

void moveMouse(int x, int y) {
  PointerInfo pinfo = MouseInfo.getPointerInfo();
  Point p = pinfo.getLocation();
  r.mouseMove((int)p.getX()+x, (int)p.getY()+y);
}

void clickMouse(int whichType) {
  r.mousePress(whichType);
  r.mouseRelease(whichType);
  r.waitForIdle();
}

正如你所说的,这可能是许多问题的结果。你能把这个问题归结为一个问题吗?你也可以考虑在处理论坛上发表文章:主要是,我只是想看看有没有“我知道的”问题,但是我会用一些代码来编辑。不幸的是,它将无法验证,因为我无法访问客户端的笔记本电脑。也谢谢你的直接回复-我也会在那里发布。如果可能的话,你应该尝试完全消除arduino部分,特别是因为你说你已经消除了它的罪魁祸首。我们无法运行你的Arduino程序,因此目前无法调试。