2017-07-18 2 views
1

J'essaye d'envoyer des images via deux ports à savoir COM5 et COM7. Le code suivant en fait le plus. La partie la plus significative du code est la méthode captureAndsaveImage.Utilisation de plusieurs ports pour envoyer des images via deux paires distinctes d'Arducam et arduino Uno

Le problème est lorsque j'utilise les deux ports série; les images sont déformées, elles ont l'impression d'être mélangées.

Ma question: est-il possible d'utiliser simultanément les deux ports? Que dois-je faire de telle sorte qu'il n'y a pas de mélange?

enter image description here enter image description here

Ne pas l'esprit deuxième cercle noir de l'image, il aurait pu se produire en raison de certaines pertes de signal dans la deuxième caméra.

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; 
    } 

} 

Modifier: J'utilisé une instruction de débogage comme

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

dans la méthode captureAndsaveImage et je me suis sortie comme

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 

Ce que je constate, c'est que certaines lignes sont comme

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

et la plupart d'entre eux sont

Found image: 
5com.fazecast.jSerialComm.SerialPort$SerialPortInpu[email protected] 
, Saved image:COM7images/5.bmp 

Quelle est la raison? Pour autant que je sache [email protected]28 c'est supposé être l'adresse de l'inputStream. Mais pourquoi cela ne se passe-t-il pas dans certains cas? (Je suis débutant en communication série.)

+0

merci @Michael –

Répondre

0

Hurrah! J'ai résolu mon problème. Même si la solution n'est pas élégante.

je mets un bloc de code dans le début de captureAndsaveImage méthode comme

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

     } 

Et maintenant, je reçois l'image effacée. J'ai une vague idée de comment cela a fonctionné, mais j'aimerais si quelqu'un peut donner une logique pour ces derniers.

Édition: Je constate que les images déformées arrivaient dans des trames impaires. Donc, le code ci-dessus saute juste ces images montre même les images qui ne sont pas mélangées. :/

0

Votre code semble être très désorganisé. Par exemple, lorsque vous ouvrez COM5, vos messages de débogage indiquent qu'il ouvre COM7 et vice versa.

Cependant, le bug causant la question que vous soulevez dans votre question est avec ces lignes de code:

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

Comme vous pouvez le voir, vous stockez les données provenant des deux sources d'images dans le même tableau, rgb. Votre code a un rgb2, donc je soupçonne que vous vouliez utiliser l'un de ceux avec COM5 et l'autre pour COM7, bien que les déclarations de tableau étant à des portées différentes est étrange.Je vous suggère de revoir votre code, et peut-être vous concentrer sur le fait de faire fonctionner les choses avec un port série/source de données avant d'en introduire une seconde.

Edit: la lecture de votre commentaire et l'examen de votre erreur, j'ai trouvé un autre bug:

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; 
} 

Ici, isImageStart() pourrait retourner vrai si ça marche que vous avez manqué le caractère de départ dans un cours d'eau. Fondamentalement, puisque vous appelez récursivement isImageStart, si vous commencez avec un flux qui ne contient pas le caractère de commande, vous exécuterez jusqu'à atteindre COMMAND.length, auquel cas l'appel récursif suivant ignorera if (index < COMMAND.length) et retournera vrai. Donc, si vous avez un cas où vous avez commencé à lire trop tôt (ou trop tard), isImageStart() retournera toujours vrai. Ensuite, dans CaptureAndSaveImage(), vous continuez à appeler read sur le flux d'entrée et lisez probablement des données obsolètes du flux précédent. Sauf par ce point, le flux peut être valide et en fonction de la vitesse à laquelle les données arrivent, vous aurez un mélange de l'image précédente et celle en cours de réception.

+0

J'ai vérifié avec les ports individuels et cela fonctionne très bien. Le bloc 'rgb' offre juste un bloc de mémoire lorsque les images sont stockées sur le disque dur. Aussi les données sont introduites dans celui-ci pas lu à partir de celui-ci. Je pense donc qu'il n'y a pas d'utilisation de 'rgb2'. Après avoir connecté les deux ports, je suis ** la plupart du temps en train de voir une distorsion dans les autres images. –

+0

@NeerajPal Voir la réponse mise à jour. – iheanyi

+0

J'ai déclaré deux variables de flux d'entrée pour COM5 et COM7. Alors, comment peuvent-ils confondre? Si je vous suis, alors il n'est pas possible d'utiliser deux ports simultanément. Est-ce le cas? –