【问题标题】:Arduino crashes when sending bytes from Java [closed]从 Java 发送字节时 Arduino 崩溃 [关闭]
【发布时间】:2014-06-06 15:38:45
【问题描述】:

我使用了 arduino 网站上的 sample program 来通过串行向我的 Arduino 发送和接收数据。然而,出于某种原因,即使我尝试只发送一个字节,Arduino 也会在一段时间后崩溃。如果我通过 IDE 自己的串行监视器手动发送字符,则不会发生这种情况。

我写了以下方法将字符输出到Arduino:

public synchronized void serialWrite(char sendIt){
    try {
            output.write((byte)'0');
            output.flush();
            for (int j=0;j<1000000000;j++){
            }
        }catch (Exception e){System.out.println("Not connected...");}
    notify();
}

我在上面尝试的是在调用该方法时只发送一个字符。我只发送一个“0”字符进行测试。手动调用该方法两三次后,Arduino 崩溃。 有什么我应该调查的吗?

Arduino 代码:

#include <SoftwareSerial.h>
int buttonState=0;
int lastButtonState=0;
int buttonPushCounter=0;
long previousMillis=0;
long interval=250;
int ledState=LOW;
int ledState2=LOW;
int ledState3=LOW;
long timeElapsed=0;
SoftwareSerial portOne(10,11);

void setup(){
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(2,INPUT); 
  Serial.begin(9600);
  portOne.begin(9600);

}

boolean turnoff; 

void loop(){

  if(portOne.overflow()){
    Serial.println("There's an overflow here!");
  }
  buttonState= digitalRead(2);

  if(buttonState!=lastButtonState){
    if (buttonState==HIGH){
      buttonPushCounter++;
    }
  }
  lastButtonState=buttonState;

  if (turnoff){
    unsigned long currentMillis=millis();

    if (currentMillis-previousMillis>0 && currentMillis-previousMillis<interval){
     ledState=HIGH;
     ledState2=LOW;
     ledState3=LOW;
  }else
     if (currentMillis-previousMillis>interval && currentMillis-previousMillis<interval*2){

     ledState=LOW;
     ledState2=LOW;
     ledState3=HIGH;
  }else
     if (currentMillis-previousMillis>interval*2 && currentMillis-previousMillis<interval*3){

     ledState=LOW;
     ledState2=HIGH;
     ledState3=LOW;
  }else if (currentMillis-previousMillis>interval*3){
    previousMillis=currentMillis;  
  }

    digitalWrite(3,ledState);
   digitalWrite(4,ledState2);
   digitalWrite(5,ledState3);
  }else{
   digitalWrite(3,LOW);
   digitalWrite(4,LOW);
   digitalWrite(5,LOW);

  }


   if (buttonPushCounter==1){
     Serial.print("Button pressed!\n");
    turnoff=!turnoff;
    buttonPushCounter=0;

   }

   noInterrupts();
   char ch=Serial.read();

   delay(1);
   if(ch=='0'){

     Serial.println("Changed by serial"+turnoff);
     Serial.println(ch);
     turnoff=!turnoff;
   } 
   interrupts();


}

读取串行接口的java程序部分是这样的:

public synchronized void serialEvent(SerialPortEvent oEvent) {
    if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
        try {
            String inputLine=input.readLine();
            System.out.println(inputLine);
        } catch (Exception e) {
            System.err.println(e.toString());
        }
    }
    // Ignore all the other eventTypes, but you should consider the other ones.
}

【问题讨论】:

  • 您有堆栈跟踪、内存转储或某种日志吗?
  • @AnubianNoob Arduino 崩溃了,不是 Java。
  • 甚至没有内存转储?
  • 我们需要查看您的 Arduino 代码,以及更详细的“崩溃”描述。我怀疑它可能只是阻止向您发送一些您没有在 Java 程序中读取的输入。
  • 没错。 Arduino是一个崩溃的。在 Java 方面一切都很好。不会抛出任何异常。

标签: java macos serial-port arduino rxtx


【解决方案1】:

您的 Arduino 代码正在通过串行连接发回数据,但您不是从 Java 程序中读取数据。很快各种缓冲区就填满了,然后 Arduino 就等着你解封了。

您需要从串行端口读取输出并对其进行处理。我建议运行一个后台线程来阻止读取串行端口并将字符写入System.out 并在收到时刷新。

【讨论】:

  • 我不这么认为。当我不发送任何字符,而只从 Arduino 接收数据时,它会在屏幕上正常显示。只有当我发送数据时才会崩溃。
  • @francisaugusto 因为当您发送数据时,您的 Arduino 代码会立即发送更多数据,而当您从 Java 发送数据时,您没有准备好接收 Arduino 输出。
  • 但这就是问题所在:我的 java 代码必须编写代码才能接收数据。至少当我按下按钮时它确实显示了它应该显示的数据。收到发送的数据后,它不会显示它会发回的数据吗?
  • @francisaugusto 您没有显示任何此类代码。
  • 我提到这是 arduino 网站上建议的标准 java 代码。这是一个:Arduino and Java
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多