2017-07-18 70 views
1

我試圖通過兩個端口(即COM5和COM7)發送圖像。 以下代碼的功能最強。最重要的部分代碼是captureAndsaveImage方法。使用多個端口通過兩個獨立的Arduam和Arduino Uno發送圖像

問題是,當我使用兩個串行端口;圖像越來越扭曲,他們覺得自己正在混合起來。

我的問題:是否可以同時使用兩個端口?我應該做什麼以免混淆?

enter image description here enter image description here

不要介意第二圖像的黑圈,可能發生由於在第二相機的一些信號損失。

public class ReadPort { 

    private static final char[]COMMAND = {'*', 'R', 'D', 'Y', '*'}; 
    private static final int WIDTH = 320; //640; 
    private static final int HEIGHT = 240; //480; 
    SerialPort serialPort,serialPort2; 

    public int[][] rgb2 = new int[WIDTH][HEIGHT]; 

    public static void main(String[] args) { 
      ReadPort reader= new ReadPort(); 
    } 

    public ReadPort() { 
      int[][]rgb = new int[HEIGHT][WIDTH]; 
      try { 

       serialPort = SerialPort.getCommPort("COM7"); 
       serialPort.openPort(); 
       inputStream = serialPort.getInputStream(); 
       serialPort.setComPortParameters(1000000, 
         8, 
         SerialPort.ONE_STOP_BIT, 
         SerialPort.NO_PARITY); 
       if(serialPort.isOpen()){ 
        System.out.println("COM5 opened"); 
       } 

       serialPort2 = SerialPort.getCommPort("COM5"); 
       serialPort2.openPort(); 
       inputStream2 = serialPort2.getInputStream(); 
       serialPort2.setComPortParameters(1000000, 
         8, 
         SerialPort.ONE_STOP_BIT, 
         SerialPort.NO_PARITY); 
       if(serialPort2.isOpen()){ 
        System.out.println("COM7 opened"); 
       } 


       int counter = 0; 

       while(true) { 

         captureAndsaveImage(inputStream2,counter, rgb, "COM5"); 
         captureAndsaveImage(inputStream, counter, rgb, "COM7"); 
         counter++; 



       } 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

    } 

    public static void captureAndsaveImage(InputStream inputStream, int counter,int[][] rgb,String name) throws IOException{ 


     while(!isImageStart(inputStream, 0)){}; 

     System.out.print("Found image: " + counter); 

     for (int y = 0; y < HEIGHT; y++) { 
      for (int x = 0; x < WIDTH; x++) { 
        int temp =read(inputStream); 
        rgb[y][x] = ((temp&0xFF) << 16) | ((temp&0xFF) << 8) | (temp&0xFF); 
      } 
     } 


     BMP bmp = new BMP(); 
     bmp.saveBMP("c:/out/" +name+"images/"+ counter + ".bmp", rgb); 
     System.out.println(", Saved image:"+name+"images/"+counter+".bmp"); 

} 

    private static int read(InputStream inputStream) throws IOException { 

     int temp = (char) inputStream.read(); 
     //System.out.print(temp); 
     if (temp == -1) { 
      throw new IllegalStateException("Exit"); 
     } 
     return temp; 
     } 


    private static boolean isImageStart(InputStream inputStream, int index) throws IOException { 
     if (index < COMMAND.length) { 
      if (COMMAND[index] == read(inputStream)) { 
       return isImageStart(inputStream, ++index); 
      } else { 
       return false; 
      } 
     } 
     return true; 
    } 

} 

編輯:我在captureAndsaveImage方法所使用的調試語句像

if(inputStream.available()>0){ 
      System.out.println(inputStream.toString());} 

和我有一樣

輸出
COM5 opened 
COM7 opened 
Found image: 
[email protected]45a 
, Saved image:COM5images/0.bmp 
Found image: 
[email protected]e28 
, Saved image:COM7images/0.bmp 
Found image: 
[email protected]45a 
, Saved image:COM5images/1.bmp 
Found image: 
[email protected]e28 
, Saved image:COM7images/1.bmp 
Found image: 2, Saved image:COM5images/2.bmp 
Found image: 
[email protected]e28 
, Saved image:COM7images/2.bmp 
Found image: 
[email protected]45a 
, Saved image:COM5images/3.bmp 
Found image: 
[email protected]e28 
, Saved image:COM7images/3.bmp 
Found image: 4, Saved image:COM5images/4.bmp 
Found image: 
[email protected]e28 
, Saved image:COM7images/4.bmp 
Found image: 
[email protected]45a 
, Saved image:COM5images/5.bmp 
Found image: 
[email protected]e28 
, Saved image:COM7images/5.bmp 
Found image: 6, Saved image:COM5images/6.bmp 
Found image: 6, Saved image:COM7images/6.bmp 
Found image: 
[email protected]45a 
, Saved image:COM5images/7.bmp 
Found image: 
[email protected]e28 
, Saved image:COM7images/7.bmp 
Found image: 8, Saved image:COM5images/8.bmp 
Found image: 
[email protected]e28 
, Saved image:COM7images/8.bmp 
Found image: 
[email protected]45a 
, Saved image:COM5images/9.bmp 

的事情,我看到的是,一些線條像

Found image: 6, Saved image:COM5images/6.bmp 

,其中大部分是

Found image: 
[email protected]e28 
, Saved image:COM7images/5.bmp 

的原因是什麼?據我所知[email protected]28這應該是inputStream的地址。但爲什麼在某些情況下不會發生? (我是串口通訊的初學者。)

+0

謝謝@Michael –

回答

0

萬歲!我已經解決了我的問題。即使解決方案不夠優雅。

我把代碼塊中captureAndsaveImage方法開始像

while(inputStream.available()>0){ 
      int temp=read(inputStream); 

     } 

,現在我得到清除的圖像。我有一些模糊的想法,它如何工作 但我會愛如果任何人都可以給這些邏輯。

編輯:我觀察到扭曲的圖像出現在奇數幀中。所以上面的代碼只是跳過這些幀顯示偶數幀沒有混合起來。 :/

0

您的代碼似乎非常混亂。例如,在您打開COM5的位置,您的調試消息顯示它正在打開COM7,反之亦然。

然而,令你在你的問題中提出的問題的錯誤是這行代碼:

while(true) { 
    captureAndsaveImage(inputStream2,counter, rgb, "COM5"); 
    captureAndsaveImage(inputStream, counter, rgb, "COM7"); 
    counter++; 
} 

正如你所看到的,你從兩個圖像源數據存儲到同一個陣列, rgb。你的代碼有一個rgb2,所以我懷疑你的意圖是使用COM5和COM7中的一個,儘管數組聲明在不同的作用域是奇怪的。我建議你檢查一下你的代碼,並且在引入第二個代碼之前,可能會專注於使用一個串口/數據源來處理事情。

編輯:看了您的評論和審查你的錯誤,我發現了另一個錯誤:

private static boolean isImageStart(InputStream inputStream, int index) throws IOException { 
    if (index < COMMAND.length) { 
     if (COMMAND[index] == read(inputStream)) { 
      return isImageStart(inputStream, ++index); 
     } 
     else { 
      return false; 
     } 
    } 
    return true; 
} 

這裏,isImageStart()如果成功的話,你錯過了一個流開始字符可能返回true。本質上,因爲遞歸調用isImageStart,如果你從一個不包含命令字符的流開始,你將運行到COMMAND.length,此時,下一個遞歸調用將跳過if (index < COMMAND.length)並返回true。所以,如果你有一個情況,你開始閱讀太快(或太晚),isImageStart()仍然會返回true。然後,在CaptureAndSaveImage()中,您仍然繼續在輸入流上調用read,並且可能正在讀取上一個流中的陳舊數據。除此之外,數據流可能是有效的,並且取決於數據傳入的速度,您將混合使用先前的圖像和當前正在接收的圖像。

+0

我檢查過個別端口,它工作正常。 rgb塊只是在圖像存儲在硬盤中時提供一個內存塊。數據也被輸入到它中,而不是從中讀取。因此,我認爲沒有用'rgb2'。連接兩個端口後,我**主要**在交替幀中看到失真。 –

+0

@NeerajPal查看最新的答案。 – iheanyi

+0

我已經爲COM5和COM7聲明瞭兩個輸入流變量。那他們怎麼會混在一起呢?如果我跟着你,那麼不可能使用兩個端口。是這樣嗎? –