使用多个端口通过两对独立的Arducam和arduino Uno发送图像

时间:2017-07-18 16:41:42

标签: java arduino-uno serial-communication

我正在尝试通过COM5和COM7这两个端口发送图像。 以下代码做的最多。代码中最重要的部分是captureAndsaveImage方法。

问题是当我使用两个串口时;图像变得扭曲,他们觉得自己变得混乱了。

我的问题:是否有可能同时使用这两个端口?我该怎么做才能没有混淆?

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

}

编辑:我使用了像

这样的调试语句
    if(inputStream.available()>0){
            System.out.println(inputStream.toString());}
captureAndsaveImage方法中

,我得到了像

这样的输出
COM5 opened
COM7 opened
Found image: 
0com.fazecast.jSerialComm.SerialPort$SerialPortInputStream@7f31245a
, Saved image:COM5images/0.bmp
Found image: 
0com.fazecast.jSerialComm.SerialPort$SerialPortInputStream@6d6f6e28
, Saved image:COM7images/0.bmp
 Found image: 
 1com.fazecast.jSerialComm.SerialPort$SerialPortInputStream@7f31245a
 , Saved image:COM5images/1.bmp
 Found image: 
 1com.fazecast.jSerialComm.SerialPort$SerialPortInputStream@6d6f6e28
 , Saved image:COM7images/1.bmp
 Found image: 2, Saved image:COM5images/2.bmp
 Found image: 
 2com.fazecast.jSerialComm.SerialPort$SerialPortInputStream@6d6f6e28
 , Saved image:COM7images/2.bmp
 Found image: 
 3com.fazecast.jSerialComm.SerialPort$SerialPortInputStream@7f31245a
 , Saved image:COM5images/3.bmp
 Found image: 
 3com.fazecast.jSerialComm.SerialPort$SerialPortInputStream@6d6f6e28
 , Saved image:COM7images/3.bmp
 Found image: 4, Saved image:COM5images/4.bmp
 Found image: 
 4com.fazecast.jSerialComm.SerialPort$SerialPortInputStream@6d6f6e28
 , Saved image:COM7images/4.bmp
 Found image: 
 5com.fazecast.jSerialComm.SerialPort$SerialPortInputStream@7f31245a
 , Saved image:COM5images/5.bmp
 Found image: 
5com.fazecast.jSerialComm.SerialPort$SerialPortInputStream@6d6f6e28
, Saved image:COM7images/5.bmp
Found image: 6, Saved image:COM5images/6.bmp
Found image: 6, Saved image:COM7images/6.bmp
Found image: 
7com.fazecast.jSerialComm.SerialPort$SerialPortInputStream@7f31245a
, Saved image:COM5images/7.bmp
Found image: 
7com.fazecast.jSerialComm.SerialPort$SerialPortInputStream@6d6f6e28
, Saved image:COM7images/7.bmp
Found image: 8, Saved image:COM5images/8.bmp
Found image: 
8com.fazecast.jSerialComm.SerialPort$SerialPortInputStream@6d6f6e28
, Saved image:COM7images/8.bmp
Found image: 
9com.fazecast.jSerialComm.SerialPort$SerialPortInputStream@7f31245a
, Saved image:COM5images/9.bmp

我观察到的事情是某些线条就像

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

其中大部分是

 Found image: 
5com.fazecast.jSerialComm.SerialPort$SerialPortInputStream@6d6f6e28
, Saved image:COM7images/5.bmp

是什么原因?据我所知com.fazecast.jSerialComm.SerialPort$SerialPortInputStream@6d6f6e28,这应该是inputStream的地址。但为什么在某些情况下不会发生这种情况呢? (我是串口通讯的初学者。)

2 个答案:

答案 0 :(得分:0)

乌拉!我已经解决了我的问题。尽管解决方案并不优雅。

我在captureAndsaveImage方法的开头添加了一段代码,如

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

        }

现在我正在清理图像。我有一些模糊的想法,它是如何工作的 但如果有人能为这些人提供逻辑,我会很高兴。

编辑:我观察到扭曲的图像出现在奇数帧中。所以上面的代码只是跳过那些框架显示的是甚至没有混淆的帧。 :/

答案 1 :(得分: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,此时,下一个递归调用将跳过{{1}并返回true。所以,如果你有一个案例,你开始阅读太快(或太晚),if (index < COMMAND.length)仍然会返回true。然后,在isImageStart()中,您仍然继续调用输入流上的读取,并且可能正在读取前一个流中的陈旧数据。除此之外,流可能是有效的,并且根据数据进入的速度,您将混合使用上一个图像和当前正在接收的图像。