java.io.IOException: Device not configured in writeArray

Hey all,

I'm using the duemilanove board and I wrote some code for it but I get this error message sometimes:

java.io.IOException: Device not configured in writeArray
at gnu.io.RXTXPort.writeArray(Native Method)
at gnu.io.RXTXPort$SerialOutputStream.write(RXTXPort.java:1124)
at processing.app.Serial.write(Serial.java:469)
at processing.app.Serial.write(Serial.java:492)
at processing.app.SerialMonitor.send(SerialMonitor.java:197)
at processing.app.SerialMonitor.access$100(SerialMonitor.java:31)
at processing.app.SerialMonitor$3.actionPerformed(SerialMonitor.java:86)
at javax.swing.JTextField.fireActionPerformed(JTextField.java:492)
at javax.swing.JTextField.postActionEvent(JTextField.java:705)
at javax.swing.JTextField$NotifyAction.actionPerformed(JTextField.java:820)
at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1645)
at javax.swing.JComponent.processKeyBinding(JComponent.java:2851)
at javax.swing.JComponent.processKeyBindings(JComponent.java:2886)
at javax.swing.JComponent.processKeyEvent(JComponent.java:2814)
at java.awt.Component.processEvent(Component.java:6150)
at java.awt.Container.processEvent(Container.java:2085)
at java.awt.Component.dispatchEventImpl(Component.java:4735)
at java.awt.Container.dispatchEventImpl(Container.java:2143)
at java.awt.Component.dispatchEvent(Component.java:4565)
at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1850)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:712)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:990)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:855)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:676)
at java.awt.Component.dispatchEventImpl(Component.java:4607)
at java.awt.Container.dispatchEventImpl(Container.java:2143)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4565)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:679)
at java.awt.EventQueue.access$000(EventQueue.java:85)
at java.awt.EventQueue$1.run(EventQueue.java:638)
at java.awt.EventQueue$1.run(EventQueue.java:636)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
at java.awt.EventQueue$2.run(EventQueue.java:652)
at java.awt.EventQueue$2.run(EventQueue.java:650)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:649)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Here is my code:

#include <TextFinder.h>
#include <Servo.h> 

Servo myservo;

TextFinder  finder(Serial);  
const int NUMBER_OF_FIELDS = 2;    
int values[NUMBER_OF_FIELDS]; 

const int ledPin = 3;
const int ledPin2 = 11;
const int ledPin3 = 13;
const int leftBumperPin = 10;
const int rightBumperPin = 4;
const int alwaysON = 2;
const int analogInPin = A1;

int E1 = 6;
int E2 = 5;
int D1 = 8; 
int D2 = 7;
int pos = 80;
int sensorValue;
int outputValue;
int actual;
int x = 0;
int val = 0;
int leftspeed = 230;  //255 is maximum speed  
int rightspeed = 230; 
int rightspeed_1 = 100;
int leftspeed_1 = 100;

void setup() 
{ 
  int i;
  for(i=5;i<=8;i++);
  pinMode(i, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  Serial.begin(9600); 
  myservo.attach(9);
  pinMode(leftBumperPin, INPUT);
  pinMode(rightBumperPin, INPUT);
  pinMode(alwaysON, OUTPUT);
}  
  
void loop()
{
  int fieldIndex = 0;     
  if(finder.find("v:") )
{  
  while(fieldIndex < NUMBER_OF_FIELDS)
    values[fieldIndex++] = finder.getValue();      
  Serial.println("All fields received:");
  for(fieldIndex=0; fieldIndex < NUMBER_OF_FIELDS; fieldIndex++)
    Serial.println(values[fieldIndex]);    
 
 
//********************************************************************************************** 
 
 
  if(values[0] == 1)
    {
      analogWrite(ledPin2,0);
      Serial.println("GREEN LIGHT");
      
      if(values[1]<=0) analogWrite(ledPin,0);
      else if(values[1]==1) analogWrite(ledPin,255/10);
      else if(values[1]==2) analogWrite(ledPin,255/9);
      else if(values[1]==3) analogWrite(ledPin,255/8);
      else if(values[1]==4) analogWrite(ledPin,255/7);
      else if(values[1]==5) analogWrite(ledPin,255/6);
      else if(values[1]==6) analogWrite(ledPin,255/5);
      else if(values[1]==7) analogWrite(ledPin,255/4);
      else if(values[1]==8) analogWrite(ledPin,255/3);
      else if(values[1]==9) analogWrite(ledPin,255/2);
      else if(values[1]>=10) analogWrite(ledPin,255);
    }
    
    
//**********************************************************************************************
    
    
  else if(values[0] == 2)
    {
      digitalWrite(ledPin2,LOW);
      if(values[1]==0) myservo.write(1);
      else if(values[1]==1) myservo.write(18);
      else if(values[1]==2) myservo.write(36);
      else if(values[1]==3) myservo.write(54);
      else if(values[1]==4) myservo.write(72);
      else if(values[1]==5) myservo.write(90);
      else if(values[1]==6) myservo.write(108);
      else if(values[1]==7) myservo.write(126);
      else if(values[1]==8) myservo.write(144);
      else if(values[1]==9) myservo.write(162);
      else if(values[1]==10) myservo.write(179);
    }
    
    
//**********************************************************************************************     
    
    
  else if(values[0] == 3)
    {
      
     while(values[1] != 0)
    { 
      digitalWrite(alwaysON, HIGH);
  
  while(x==0)
  {
    delay(1000);
    x++;
  }
  
  
  while(pos < 130) 
  {              
    
    pos += 3;
    myservo.write(pos);  
    delay(15); 
    actual = LOW;  
    sensorValue = analogRead(analogInPin);            
    outputValue = map(sensorValue, 98, 500, 0, 180);
    Serial.print("outputValue = ");
    Serial.println(outputValue);
  if (outputValue >= 50)
  {
    actual = HIGH;
    Serial.println("actual is high");
    delay(100);
  }
  digitalWrite(ledPin3, actual);    
  int val_left = digitalRead(leftBumperPin);
  int val_right = digitalRead(rightBumperPin);
  
  if (actual == HIGH)
  {
    digitalWrite(ledPin3, HIGH);
    Serial.println("problem_1");
    Serial.println("problem_1.1");
    right (180,180);
    delay(3000);
     
  }
  else if (val_left == LOW)
  {
    Serial.println("problem_2");
    digitalWrite(ledPin3, HIGH);
    Serial.println("problem_2.1");
    cw_back (100,200);
    delay(3200);
     
  }
  else if(val_right == LOW)
  {
    Serial.println("problem_3");
    digitalWrite(ledPin3, HIGH);
    Serial.println("problem_3.1");
    ccw_back (200,100);
    delay(3200);
     
  }
  else if(val_right == HIGH && val_left == HIGH && actual == LOW)
  {
    digitalWrite(ledPin3, LOW);
    forward (230,230);
    delay(100);
  }
}

 
 
   while(pos > 55)
   {                             
    pos -= 3;
    myservo.write(pos);     
    delay(15);     
    actual = LOW;  
    sensorValue = analogRead(analogInPin);            
  outputValue = map(sensorValue, 98, 500, 0, 180);
  Serial.print("outputValue = ");
    Serial.println(outputValue);
  if (outputValue >= 50)
  {
    actual = HIGH;
    Serial.println("actual is high");
    delay(100);
  }
  digitalWrite(ledPin3, actual);    
   
{

  int val_left = digitalRead(leftBumperPin);
  int val_right = digitalRead(rightBumperPin);
 
  if (actual == HIGH)
  {
    Serial.println("problem_1");
    digitalWrite(ledPin3, HIGH);
    Serial.println("problem_1.1");
    left (180,180);
    delay(3000);
     
  }
   else if (val_left == LOW)
  {
    Serial.println("problem_2");
    digitalWrite(ledPin3, HIGH);
    Serial.println("problem_2.1");
    cw_back (100,200);
    delay(3200);
     
  }
  else if(val_right == LOW)
  {
    Serial.println("problem_3");
    digitalWrite(ledPin3, HIGH);
    Serial.println("problem_3.1");
    ccw_back (200,100);
    delay(3200);
     
  }
  else if(val_right == HIGH && val_left == HIGH && actual == LOW)
  {
    digitalWrite(ledPin3, LOW);
    forward (230,230);
    delay(100);
  }}
}}
    }


//********************************************************************************************** 


  else if(values[0] == 4)
    {
      
      while(val != '.')
      {
     
      while (Serial.available() > 0)
      {
      char val = Serial.read(); 
      Serial.print("val = " );
      Serial.println(val);
  //delay(500);
  switch(val) // Perform an action depending on the command 
  { 
  case 'w'://Move Forward 
    forward (leftspeed,rightspeed); 
    delay(100);
    break; 
  case 's'://Move Backwards 
    backwards (leftspeed,rightspeed); 
    delay(100);
    break; 
  case 'a'://Turn Left 
    left (0,rightspeed); 
    delay(100);
    break; 
  case 'd'://Turn Right 
    right (leftspeed,0); 
    delay(100);
    break; 
  case 'q':
    ccw_front (leftspeed_1,rightspeed);
    delay(100);
    break;
  case 'e':
    cw_front (leftspeed,rightspeed_1);
    delay(100);
    break;
  case 'x':
    ccw_back (leftspeed,rightspeed_1);
    delay(100);
    break;
  case 'z':
    cw_back (leftspeed_1,rightspeed);
    delay(100);
    break;
  case '/':
    halt  (0,0);
    delay(100);
    break;
  
  }}}}
  
//********************************************************************************************** 
  
  
  else
    {
      digitalWrite(ledPin2,HIGH);
      digitalWrite(ledPin,LOW);
      Serial.println("RED LIGHT");
    }
}
}







//Subroutine:

void halt (char a,char b) //Stop 
{ 
  digitalWrite(E1,LOW); 
  digitalWrite(E2,LOW); 
} 
void forward (char a,char b) 
{ 
  analogWrite (E1,a); 
  digitalWrite(D1,LOW); 
  analogWrite (E2,b); 
  digitalWrite(D2,LOW); 
} 
void left (char a,char b) 
{ 
  analogWrite (E1,a); 
  digitalWrite(D1,HIGH); 
  analogWrite (E2,b); 
  digitalWrite(D2,LOW); 
} 
void right (char a,char b) 
{ 
  analogWrite (E1,a); 
  digitalWrite(D1,LOW); 
  analogWrite (E2,b); 
  digitalWrite(D2,HIGH); 
}
void ccw_front (char a,char b)
{
  analogWrite (E1,a); 
  digitalWrite(D1,LOW); 
  analogWrite (E2,b); 
  digitalWrite(D2,LOW);
}
void cw_front (char a,char b)
{
  analogWrite (E1,a); 
  digitalWrite(D1,LOW); 
  analogWrite (E2,b); 
  digitalWrite(D2,LOW);
}
void ccw_back (char a,char b)
{
  analogWrite (E1,a); 
  digitalWrite(D1,HIGH); 
  analogWrite (E2,b); 
  digitalWrite(D2,HIGH);
}
void cw_back (char a,char b)
{
  analogWrite (E1,a); 
  digitalWrite(D1,HIGH); 
  analogWrite (E2,b); 
  digitalWrite(D2,HIGH);
}
void backwards (char a,char b) 
{ 
  analogWrite (E1,a); 
  digitalWrite(D1,HIGH); 
  analogWrite (E2,b); 
  digitalWrite(D2,HIGH); 
}

The error message only comes up when there is a 3 or 4 in the first field of the serial message sent to the board. The weird thing is that it works until the board gets an input from one of the sensors. I know this isn't a very good explanation of the problem but it's complicated to explain. Let me know if there's any additional information you need that would help you help me.

Thanks in advance!

  for(i=5;i<=8;i++);

Lovely place for a semicolon. This code is equivalent to:

  for(i=5;i<=8;i++)
  {
    ;
  }

Not exactly useful, is it?

  while(x==0)
  {
    delay(1000);
    x++;
  }

So, how many times is this going to execute? Once, and only the first time that a 3 is received.

  else if(val_right == HIGH && val_left == HIGH && actual == LOW)
  {
    digitalWrite(ledPin3, LOW);
    forward (230,230);
    delay(100);
  }}
}}
    }

Putting each } on a separate line, and properly indenting the code between a { and its matching } would make your code a lot easier to read.

So would functions. And comments.

Some sample input and output would be good, too.

I'm having exactly the same problem after upgrading from Mac OS 10.6 (Snow Leopard) to 10.7 (Lion). It's really frustrating, as my code worked perfectly a couple of days ago – the only thing that has changed is my operating system. My code is just a version of Tom Igoe's servo controller, so should be working better than anything I could programme :P! It relies on sending a byte to the board that sets pulse width, not quite rocket science.

The error messages I get are:

java.io.IOException: Device not configured in writeArray
	at gnu.io.RXTXPort.writeArray(Native Method)
	at gnu.io.RXTXPort$SerialOutputStream.write(RXTXPort.java:1124)
	at processing.app.Serial.write(Serial.java:469)
	at processing.app.Serial.write(Serial.java:492)
	at processing.app.SerialMonitor.send(SerialMonitor.java:197)
	at processing.app.SerialMonitor.access$100(SerialMonitor.java:31)
	at processing.app.SerialMonitor$3.actionPerformed(SerialMonitor.java:86)
	at javax.swing.JTextField.fireActionPerformed(JTextField.java:492)
	at javax.swing.JTextField.postActionEvent(JTextField.java:705)
	at javax.swing.JTextField$NotifyAction.actionPerformed(JTextField.java:820)
	at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1645)
	at javax.swing.JComponent.processKeyBinding(JComponent.java:2851)
	at javax.swing.JComponent.processKeyBindings(JComponent.java:2886)
	at javax.swing.JComponent.processKeyEvent(JComponent.java:2814)
	at java.awt.Component.processEvent(Component.java:6150)
	at java.awt.Container.processEvent(Container.java:2085)
	at java.awt.Component.dispatchEventImpl(Component.java:4735)
	at java.awt.Container.dispatchEventImpl(Container.java:2143)
	at java.awt.Component.dispatchEvent(Component.java:4565)
	at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1850)
	at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:712)
	at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:990)
	at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:855)
	at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:676)
	at java.awt.Component.dispatchEventImpl(Component.java:4607)
	at java.awt.Container.dispatchEventImpl(Container.java:2143)
	at java.awt.Window.dispatchEventImpl(Window.java:2478)
	at java.awt.Component.dispatchEvent(Component.java:4565)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:679)
	at java.awt.EventQueue.access$000(EventQueue.java:85)
	at java.awt.EventQueue$1.run(EventQueue.java:638)
	at java.awt.EventQueue$1.run(EventQueue.java:636)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
	at java.awt.EventQueue$2.run(EventQueue.java:652)
	at java.awt.EventQueue$2.run(EventQueue.java:650)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:649)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

I'm going to try reinstalling all drivers and the Arduino software itself. Any other thoughts?

the only thing that has changed is my operating system.

Then, it hardly seems like your problem is with your code.

Then, it hardly seems like your problem is with your code.

This is the conclusion I've come to. I have no idea what to do, have reinstalled Java, tried this with Arduino versions 022 right back to 018 (using a Duemillanove board, thought this might work). The code works fine for about 30 seconds, and is able to handle a few bytes of data from my serial monitor,then it all freezes and the big red error messages kick in.

Setup: MacBook Pro 13", 2010 model, OSX 10.7, Arduino 022 / 021 / 020 / 019 / 018 (happens on all versions), Java SE6, Adruino board Duemillenove / Uno (happens on both boards). Below is the error message log again...any ideas?

Thanks!

java.io.IOException: Device not configured in writeArray
	at gnu.io.RXTXPort.writeArray(Native Method)
	at gnu.io.RXTXPort$SerialOutputStream.write(RXTXPort.java:1124)
	at processing.app.Serial.write(Serial.java:469)
	at processing.app.Serial.write(Serial.java:492)
	at processing.app.SerialMonitor.send(SerialMonitor.java:128)
	at processing.app.SerialMonitor.access$100(SerialMonitor.java:29)
	at processing.app.SerialMonitor$3.actionPerformed(SerialMonitor.java:75)
	at javax.swing.JTextField.fireActionPerformed(JTextField.java:492)
	at javax.swing.JTextField.postActionEvent(JTextField.java:705)
	at javax.swing.JTextField$NotifyAction.actionPerformed(JTextField.java:820)
	at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1645)
	at javax.swing.JComponent.processKeyBinding(JComponent.java:2851)
	at javax.swing.JComponent.processKeyBindings(JComponent.java:2886)
	at javax.swing.JComponent.processKeyEvent(JComponent.java:2814)
	at java.awt.Component.processEvent(Component.java:6150)
	at java.awt.Container.processEvent(Container.java:2085)
	at java.awt.Component.dispatchEventImpl(Component.java:4735)
	at java.awt.Container.dispatchEventImpl(Container.java:2143)
	at java.awt.Component.dispatchEvent(Component.java:4565)
	at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1850)
	at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:712)
	at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:990)
	at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:855)
	at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:676)
	at java.awt.Component.dispatchEventImpl(Component.java:4607)
	at java.awt.Container.dispatchEventImpl(Container.java:2143)
	at java.awt.Window.dispatchEventImpl(Window.java:2478)
	at java.awt.Component.dispatchEvent(Component.java:4565)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:679)
	at java.awt.EventQueue.access$000(EventQueue.java:85)
	at java.awt.EventQueue$1.run(EventQueue.java:638)
	at java.awt.EventQueue$1.run(EventQueue.java:636)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
	at java.awt.EventQueue$2.run(EventQueue.java:652)
	at java.awt.EventQueue$2.run(EventQueue.java:650)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:649)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

This is voltage problem. In my case it was caused by poor usb extension cord. Sevo motor consumed power, current flow through the cord was poor, to low power for Arduino and I had a crash. This is not a software issue - in my case. Checked and confirmed.

The actual error message implies the serial connection died, which could be due to various reasons (here it might have been the
USB hardware detecting undervoltage/overcurrent and disconnecting)

BTW don't ever power servos from USB power, its asking for trouble...