2017-07-18 10 views
1

私は2つのポート、つまりCOM5とCOM7を介して画像を送信しようとしています。 次のコードが最も役に立ちます。コードの最も重要な部分はcaptureAndsaveImageメソッドです。Arducamとarduino Unoの2つの別々のペアを介して複数のポートを使用して画像を送信する

問題は、私が両方のシリアルポートを使用している場合です。画像が歪んで、彼らは混乱しているように感じます。

私の質問:両方のポートを同時に使用することはできますか?混乱しないように私は何をすべきですか?

enter image description here enter image description here

それが原因第2のカメラでいくつかの信号損失に起こったかもしれない第二の画像の黒丸を気にしないでください。

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

ハレイ!私は私の問題を解決しました。ソリューションはエレガントではないにもかかわらず。

私は

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

     } 

ようcaptureAndsaveImageメソッドの開始にコードのブロックを置くそして今、私はクリアされた画像を取得しています。私はそれがどのように働いたのか、あいまいなアイデアを持っていますが、誰かがこれらのロジックを与えることができれば、私は大好きです。

編集:私は歪んだ画像が奇数フレームに来ることを観察しました。したがって、上記のコードは、それらのフレームをスキップするだけで、混ざらない偶数フレームを表示します。 :/

0

あなたのコードは非常に混乱しているようです。たとえば、COM5を開くと、デバッグメッセージにCOM7が開かれていると表示され、その逆もあります。

しかし、あなたはあなたの質問で提起された問題の原因のバグは、コードのこれらの行である:

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

あなたが見ることができるように、あなたは、同じ配列に両方の画像ソースからのデータを保存していますrgb。あなたのコードはrgb2なので、COM5とCOM7のどちらかを使うつもりだと思われますが、配列の宣言は異なるスコープにあるのが変です。私はあなたのコードを見直し、たぶん1つのシリアルポート/データソースで作業することに焦点を当てることを勧めます。

は編集:それはあなたが、ストリーム内の開始文字を逃していることが動作するかどうかここで

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()では、引き続きinputstreamでのread呼び出しを継続し、前のストリームから古いデータを読み込んでいる可能性があります。その点を除いて、ストリームは有効であり、データの到着速度に応じて、前の画像と現在受信している画像が混在します。

+0

私は個々のポートでチェックしており、正常に動作しています。 'rgb'ブロックは、イメージがハードディスクに格納されるにつれてメモリブロックを提供します。また、データはそこから読み込まれずに供給されます。したがって、 'rgb2'の使用はありません。両方のポートを接続した後、私はほとんど**別のフレームで歪みを見ています。 –

+0

@NeerajPal更新された回答を参照してください。 – iheanyi

+0

私はCOM5とCOM7の2つの入力ストリーム変数を宣言しました。だから彼らはどうやって混ざり合うの?私があなたに従えば、2つのポートを同時に使うことはできません。それは事実ですか? –

関連する問題