2013-11-22 1 views
3

Моя проблема в том, что мне нужно управлять мобильным роботом E-Puck через Bluetooth на Java, отправив ему команды типа «D, 100,100» для установки скорости «E», чтобы получить скорость, и т.д. у меня есть некоторый код:Последовательный порт Java для записи/отправки данных ASCII

String command = "D,100,100"; 
OutputStream mOutputToPort = serialPort.getOutputStream(); 
mOutputToPort.write(command.getBytes()); 

Так с этим методом write я могу только послать byte[] данных, но мой робот не поймет этого. Например, раньше я использую эти команды на Matlab так:

s = serial('COM45'); 
fopen(s); 
fprintf(s,'D,100,100','async'); 

Или по программе Putty типа только:

D,100,100 `enter` 

Дополнительная информация:

Я также понял, что у Matlab есть другое решение для одной и той же вещи.

s = serial('COM45'); 
fopen(s); 
data=[typecast(int8('-D'),'int8') typecast(int16(500),'int8') typecast(int16(500),'int8')]; 

В этом случае:

data = [ -68 -12 1 -12 1]; 
fwrite(s,data,'int8','async'); 

не было бы то же самое в Java:

byte data[] = new byte[5]; 
    data[0] = -'D'; 
    data[1] = (byte)(500 & 0xFF); 
    data[2] = (byte)(500 >> 8); 
    data[3] = (byte)(500 & 0xFF); 
    data[4] = (byte)(500>> 8); 

И потом:

OutputStream mOutputToPort = serialPort.getOutputStream(); 
mOutputToPort.write(data); 
mOutputToPort.flush(); 
+0

В конце концов, это все байт. как вы генерируете байты? – jtahlborn

+3

байт [] - это единственное, что НИЧЕГО понимает, я не вижу твоей проблемы. Может быть, более конкретным. –

+0

Это лучший совет, который я могу дать вам с предоставленной вами информацией. Проверьте соответствие робота. –

ответ

4

Основные сведения в кодовых комментариях. Теперь вы можете изменить скорость колеса, набрав командное окно D,1000,-500 и нажав enter.

public class serialRobot { 

     public static void main(String[] s) { 
       SerialPort serialPort = null; 
       try { 
         CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier("COM71"); 
         if (portIdentifier.isCurrentlyOwned()) { 
           System.out.println("Port in use!"); 
         } else { 
           System.out.println(portIdentifier.getName()); 

           serialPort = (SerialPort) portIdentifier.open(
               "ListPortClass", 300); 
           int b = serialPort.getBaudRate(); 
           System.out.println(Integer.toString(b)); 
           serialPort.setSerialPortParams(115200, SerialPort.DATABITS_8, 
               SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); 
           serialPort.setInputBufferSize(65536); 
           serialPort.setOutputBufferSize(4096); 

           System.out.println("Opened " + portIdentifier.getName()); 

           OutputStream mOutputToPort = serialPort.getOutputStream(); 
           InputStream mInputFromPort = serialPort.getInputStream(); 


           PerpetualThread t = readAndPrint(mInputFromPort); 

           inputAndSend(mOutputToPort); 


           t.stopRunning(); 

           mOutputToPort.close(); 
           mInputFromPort.close(); 
         } 
       } catch (IOException ex) { 
         System.out.println("IOException : " + ex.getMessage()); 
       } catch (UnsupportedCommOperationException ex) { 
         System.out.println("UnsupportedCommOperationException : " + ex.getMessage()); 
       } catch (NoSuchPortException ex) { 
         System.out.println("NoSuchPortException : " + ex.getMessage()); 
       } catch (PortInUseException ex) { 
         System.out.println("PortInUseException : " + ex.getMessage()); 
       } finally { 
         if(serialPort != null) { 
           serialPort.close(); 
         } 
       } 

     } 

     private static PerpetualThread readAndPrint(InputStream in) { 
       final BufferedInputStream b = new BufferedInputStream(in); 
       PerpetualThread thread = new PerpetualThread() { 

         @Override 
         public void run() { 
           byte[] data = new byte[16]; 
           int len = 0; 
           for(;isRunning();) { 
             try { 
               len = b.read(data); 
             } catch (IOException e) { 
               e.printStackTrace(); 
             } 
             if(len > 0) { 
               System.out.print(new String(data, 0, len)); 
             } 
           } 
         } 

       }; 

       thread.start(); 

       return thread; 
     } 

     private static void inputAndSend(OutputStream out) { 
       BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
       int k = 0; 
       for(;;) { 

         String komanda; 
         try { 
           komanda = in.readLine(); 
         } catch (IOException e) { 
           e.printStackTrace(); 
           return; 
         } 
         komanda = komanda.trim(); 

         if(komanda.equalsIgnoreCase("end"))  return; 

         byte komandaSiust[] = proces(komanda); //Command we send after first 

//connection, it's byte array where 0 member is the letter that describes type of command, next two members 

// is about left wheel speed, and the last two - right wheel speed. 



         try { 
           if(k == 0){ 
           String siunc = "P,0,0\n"; // This command must be sent first time, when robot is connected, otherwise other commands won't work 
           ByteBuffer bb = ByteBuffer.wrap(siunc.getBytes("UTF-8")); 
           bb.order(ByteOrder.LITTLE_ENDIAN); 
           out.write(bb.array()); 
           out.flush();  
           }else{ 
           ByteBuffer bb = ByteBuffer.wrap(komandaSiust); 
           bb.order(ByteOrder.LITTLE_ENDIAN); 
           out.write(bb.array()); 
           out.flush(); 
           } 
           k++; 

         } catch (IOException e) { 
           e.printStackTrace(); 
           return; 
         } 
       } 
     } 

     private static byte[] proces(String tekstas){ 
      tekstas = tekstas.trim(); 
      char[] charArray = tekstas.toCharArray(); 
      byte kodas1[]; 



      int fComa = tekstas.indexOf(',', 1); 
      int sComa = tekstas.indexOf(',', 2); 
      int matavimas = charArray.length; 
      int skir1 = sComa - fComa - 1; 
      int skir2 = matavimas - sComa -1; 

      char leftSpeed[] = new char[skir1]; 

      for(int i = 0; i < skir1; i++){ 
        leftSpeed[i] = charArray[fComa + i + 1]; 
      } 

      char rightSpeed[] = new char[skir2]; 

      for(int i = 0; i < skir2; i++){ 
       rightSpeed[i] = charArray[sComa + i + 1]; 
      } 
      String right = String.valueOf(rightSpeed); 
      String left = String.valueOf(leftSpeed); 


      int val1 = Integer.parseInt(left); 
      int val2 = Integer.parseInt(right); 
      kodas1 = new byte[5]; 
      kodas1[0] = (byte)-charArray[0]; 
      kodas1[1] = (byte)(val1 & 0xFF); 
      kodas1[2] = (byte)(val1 >> 8); 
      kodas1[3] = (byte)(val2 & 0xFF); 
      kodas1[4] = (byte)(val2 >> 8); 

      return kodas1; 


     } 

     private static class PerpetualThread extends Thread { 
       private boolean isRunning = true; 

       public boolean isRunning() { return isRunning;  } 

       public void stopRunning()  { 
         isRunning = false; 
         this.interrupt(); 
       } 
     } 
} 
2

По словам the documentation, вы необходимо позвонить setSerialPortParams(int baudrate, int dataBits, int stopBits, int parity) на вашем последовательном порту.

+0

Это не работает :( –

+0

В matlab я нашел параметры подключения: comPort = serial (порт, 'BaudRate', 115200, 'inputBuffersize', 65536, 'OutputBufferSize', 4096, 'ByteOrder', 'littleendian') Возможно, я смогу установить то же самое на последовательном порту с Java? –

+1

@emcsIV Вы можете, эти настройки должны соответствовать точно, что говорит спецификация. –