Java 使用多个端口通过两对独立的Arducam和arduino Uno发送图像
我试图通过两个端口发送图像,即COM5和COM7。 下面的代码做得最多。代码最重要的部分是捕获和保存图像方法 问题是当我使用两个串行端口时;图像被扭曲了,他们感觉自己被搞混了 我的问题:是否可以同时使用这两个端口?我该怎么做才能避免混淆 不要介意第二个图像的黑圈,这可能是由于第二个摄像头中的一些信号丢失造成的Java 使用多个端口通过两对独立的Arducam和arduino Uno发送图像,java,arduino-uno,serial-communication,Java,Arduino Uno,Serial Communication,我试图通过两个端口发送图像,即COM5和COM7。 下面的代码做得最多。代码最重要的部分是捕获和保存图像方法 问题是当我使用两个串行端口时;图像被扭曲了,他们感觉自己被搞混了 我的问题:是否可以同时使用这两个端口?我该怎么做才能避免混淆 不要介意第二个图像的黑圈,这可能是由于第二个摄像头中的一些信号丢失造成的 public class ReadPort { private static final char[]COMMAND = {'*', 'R', 'D', 'Y', '*'}
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
方法中,我得到了如下输出
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
这应该是输入流的地址。但为什么它在某些情况下没有发生?
(我是串行通信的初学者。)万岁!我已经解决了我的问题。即使解决方案并不优雅 我在
captureAndsaveImage
方法的开头放了一块代码,如下所示
while(inputStream.available()>0){
int temp=read(inputStream);
}
现在我得到了清晰的图像。我对它的工作原理有些模糊的想法
但如果有人能给出这些的逻辑,我会很高兴的
编辑:我观察到扭曲的图像出现在奇数帧中。因此,上面的代码只是跳过那些帧,甚至显示没有混淆的帧/ 万岁!我已经解决了我的问题。即使解决方案并不优雅 我在
captureAndsaveImage
方法的开头放了一块代码,如下所示
while(inputStream.available()>0){
int temp=read(inputStream);
}
现在我得到了清晰的图像。我对它的工作原理有些模糊的想法
但如果有人能给出这些的逻辑,我会很高兴的
编辑:我观察到扭曲的图像出现在奇数帧中。因此,上面的代码只是跳过那些帧,甚至显示没有混淆的帧/ 您的代码似乎非常混乱。例如,当您打开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(InputStream InputStream,int index)引发IOException{
if(索引<命令长度){
if(命令[索引]==读取(输入流)){
返回isImageStart(inputStream,++索引);
}
否则{
返回false;
}
}
返回true;
}
在这里,
isImageStart()
如果发现流中缺少起始字符,则可能返回true。本质上,由于递归调用isImageStart,如果以不包含命令字符的流开始,则将一直运行,直到到达command.length
,此时,下一个递归调用将跳过if(index
,并返回true。因此,如果您开始阅读的时间太早(或太晚),isImageStart()
仍将返回true。然后,在CaptureAndSaveImage()
中,您仍然在继续调用inputstream上的read,并且很可能正在从上一个流中读取过时的数据。除此之外,流可能是有效的,并且取决于数据传入的速度,您将混合使用上一个图像和当前接收的图像。您的代码似乎非常混乱。例如,当您打开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(InputStream InputStream,int index)引发IOException{
if(索引<命令长度){
if(命令[索引]==读取(输入流)){
返回isImageStart(inputStream,++索引);
}
否则{
返回false;
}
}
返回true;
}
在这里,
isImageStart()
如果发现流中缺少起始字符,则可能返回true。本质上,由于递归调用isImageStart,如果以不包含命令字符的流开始,则将一直运行,直到到达command.length
,此时,下一个递归调用将跳过if(index
,并返回true。因此,如果您开始阅读的时间太早(或太晚),isImageStart()
仍将返回true。然后,在CaptureAndSaveImage()
中,您仍然在继续调用inputstream上的read,并且很可能正在从上一个流中读取过时的数据。除此之外,流可能是有效的,并且取决于数据传入的速度,您将混合使用上一个图像和当前接收的图像。我已检查了各个端口,它工作正常。rgb