效果图
随便讲点
这个说是串口调试工具有点尴尬, 因为最开始是为了用电脑在自己做的小车上玩FPV写的一个小程序,所以有个FPV功能。
FPV需要硬件支持,我的操作是USB转串口然后接上433,摄像头是用的那种带USB口的图传接收器,tb搜手机图传应该就有吧。。
小车那边也是用的433做的接受,图像用图传发射,效果还行。延迟方面因为车跑的不快所以也感觉不明显。
FPV模式演示视频:链接:https://pan.baidu.com/s/1NTWxUiKdxLwTA2dOvqAvrg 提取码:52u3
依赖jar包
RXTXcomm.jar
webcam-capture-0.3.12.jar 提取码 inc4
代码
Main类,主要用来选择串口,选择出来的串口会丢给下面的类进行解析和打开
package com.serial;
import java.awt.Choice;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Enumeration;
import javax.swing.JButton;
import javax.swing.JFrame;
import gnu.io.CommPortIdentifier;
public class Main {
public static void main(String[] args) {
//选择串口窗口创建
JFrame xzck = new JFrame("请选择串口");
Choice c = new Choice();
JButton b = new JButton("打开");
Image icon = Toolkit.getDefaultToolkit().getImage("images/logo/logo1.png"); //设置图标
ArrayList<String> sum = findPort();
//判断可用窗口数量是否为零
for(int i = 0;i <= sum.size() - 1;i++){
c.add(sum.get(i));
}
c.setBounds(90, 40, 120, 30);
b.setBounds(110, 90, 80, 30);
xzck.setBounds(300, 250, 300, 200);
xzck.setIconImage(icon); //设置窗口的logo
xzck.setResizable(false);
xzck.setLayout(null);
xzck.add(c);
xzck.add(b);
xzck.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
xzck.setVisible(true);
b.addActionListener(new ActionListener(){
//选择串口界面开启按钮点击监听
public void actionPerformed(ActionEvent e) {
try {
//关闭窗口
xzck.dispose();
(new Serial()).ckks(c.getSelectedItem());
System.out.println("串口开启!!!!");
} catch (InterruptedException e1) {
System.out.println("串口IO流错误");
e1.printStackTrace();
}
}
});
}
//获取可用串口
@SuppressWarnings("unchecked")
public static final ArrayList<String> findPort() {
//System.out.println("开始获取");
//获得当前所有可用串口
Enumeration<CommPortIdentifier> portList = CommPortIdentifier.getPortIdentifiers();
ArrayList<String> portNameList = new ArrayList<>();
//将可用串口名添加到List并返回该List
while (portList.hasMoreElements()) {
String portName = portList.nextElement().getName();
portNameList.add(portName);
}
//[返回可用串口List
return portNameList;
}
}
这是Serial类,主要的类都在里面
package com.serial;
import java.util.Enumeration;
import gnu.io.CommPortIdentifier;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import gnu.io.UnsupportedCommOperationException;
import java.awt.Choice;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.TooManyListenersException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JToggleButton;
import com.github.sarxos.webcam.Webcam;
import com.github.sarxos.webcam.WebcamPanel;
import com.github.sarxos.webcam.WebcamResolution;
class dsfs implements Runnable {
//这个是定时发送线程
private int time = 100;//延时默认100ms
private Thread t;
private String threadName = "定时发送线程";
dsfs(int time) {
this.time = time;
}
@SuppressWarnings("static-access")
public void run() {
while(Serial.zt_ds){
try {
Serial.write(Serial.jtf.getText());
t.sleep(time);//等待时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Serial.log("停止定时发送");
}
public void start () {
if (t == null) {
t = new Thread (this, thre