当前位置: 首页 > 知识库问答 >
问题:

Arduino可以从控制台读取字节,但不能从java读取

向实
2023-03-14

我想从Java程序接收Arduino Uno上的多个字节。arduino在收到数据后立即处理数据,因此我不需要存储它,我使用串行RX缓冲区作为临时存储,直到我实际读取字节为止。完全实现后,每次将发送大约150个字节,但我已经修改了缓冲区大小来解决这个问题。我使用jSerialComm作为java的串行库

我在下面放了一些arduino和java代码。当我从IDE的串行监视器发送字节,按预期点亮led时,arduino代码可以完美地工作。但是,只要我尝试用java代码发送字节,RX板载led就会闪烁,但黄色led从不亮起,ExecuteMove()不会触发。我试着放一根线。在尝试关闭端口之前执行sleep(),但这没有帮助。

阿杜伊诺

int GREEN = 4;
int BLUE = 3;
int YELLOW = 2;

void setup() {
  pinMode(GREEN, OUTPUT);
  pinMode(BLUE, OUTPUT);
  pinMode(YELLOW, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  byte rb = Serial.read();
  if(rb != 255){ //Documentation says it sould be -1, but I'v tested it and 
                   it's 255
    digitalWrite(YELLOW, HIGH);
    ExecuteMove(rb);
    delay(500);
    digitalWrite(YELLOW, LOW);
  }
}

void ExecuteMove(byte _move){ 
  Lights up the green LED if _move == 65, blue if 66 (Works perfectly)  
}

Java语言

public static void main(String[] args) throws IOException, 
                                              InterruptedException{

    SerialPort sp = SerialPort.getCommPort("COM3");
    sp.setComPortParameters(9600, 8, 1, 0);
    sp.setComPortTimeouts(SerialPort.TIMEOUT_WRITE_BLOCKING, 0, 0);

    if(sp.openPort()) {
        System.out.println("Port is open");
    }else {
        System.out.println("Port failed to open");
        return;
    }

    byte[] message = {65, 66, 65};
    for(int i = 0; i < message.length; i++) {
        sp.getOutputStream().write(message[i]); //Sends the message
        sp.getOutputStream().flush();
    }

    if(sp.closePort()) { 
        System.out.println("Port is closed"); 
    }else { 
        System.out.println("Failed to close port"); 
        return; 
    } 
}  

正如我已经说过的,仅arduino代码就可以完美地与显示器配合使用,但当我使用java代码发送字节时,只有RX led点亮,但没有一个“我的”LED点亮

共有1个答案

宦炜
2023-03-14

对于任何偶然发现这篇文章和那篇接缝的人来说,都有类似的问题,这是因为Windows在打开端口时向arduino发送了一个重置信号。因为它会在之后立即发送数据,所以Arduino会在重置时从缓冲区中删除它,并且永远无法读取它。有两种主要方法可以纠正这一点,首先在打开端口和发送数据之间添加一个Thread.sleep(5000);。您还可以在RESET和GND引脚之间添加一个47μF电容器。

资料来源:https://arduino.stackexchange.com/questions/22267/java-jssc-arduino-windows https://forum.arduino.cc/index.php?topic=96422.0

希望这能帮助别人

 类似资料:
  • 我试图通过使用命令“java postfix 错误: 请在java.util.scanner.throwfor(未知源) 在java.util.scanner.next(未知源) 在java.util.scanner.nextInt(未知源) 在java.util.scanner.nextInt(未知源) 在java.util.scanner.nextInt(未知源) 在java.util.sca

  • 如何在java中读取整数输入...我尝试了缓冲阅读器和扫描仪...但它不输出任何东西...我正在使用eclipse Indigo...它会影响输出吗... 示例代码:

  • 问题内容: 我想做一个带有控制台扩展的简单服务器http服务器。我找到了要从命令行数据读取的代码段。 好再问一次问题,我不能简单地使用循环?如果服务器在询问时间接收到输出,也会破坏线路。 问题答案: 您不能执行“ while(done)”循环,因为这将需要阻塞输入,而node.js则不喜欢这样做。 而是设置一个在每次输入内容时都要调用的回调:

  • 本文向大家介绍C#从控制台读取字符串的方法,包括了C#从控制台读取字符串的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#从控制台读取字符串的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 问题内容: 我有此方法,并且从控制台(键盘)读取了一个整数序列,并将所有整数添加到ArrayList中,我使用Scanner类读取了这些数字,但是在for循环中不起作用,它抛出“ java.util.NoSuchElementException”。 问题答案: 首先,使用一个扫描仪,而不是每次都重新创建一个扫描仪。此外,您的for循环还会多循环一次。 这对我来说很好,最后列表包含了我输入的所有数字

  • 我正在尝试从Java应用程序的Google Sheets API。我已经访问了教程中提到的文件,但我无法访问我自己创建的任何文件。 这是我使用的代码: 我在Drive中手动创建了一个电子表格,用字符串填充A1: B,并从URL中复制了id,看起来像“1IeoY5jY3Su86x1uvgc1yJqEU-6dd6FdUKo8Yf5J73k”(不是实际的ID)。 这将生成错误400无法解析范围:类数据!