java串口通信控制单片机外围MFC设备实现压力达到设置值

问题遇到的现象和发生背景

1、问题现象和背景
单片机串口通信,使用串口通信控制设备,pc端界面使用javafx开发,后台使用java语言开发,使用java语言通过串口通信控制单片机外围设备,
控制的设备是MFC设备,控制mfc排气量和进气量,根据压力传感器返回的压力值控制mfc设备排气量和进气量,能够实现压力值稳定到配置的压力
值左右,通过调节mfc的排气和进气量实现实验舱内压力稳定在配置的压力值附近。目前现象是压力值和排气量比例关系不确定。

用代码块功能插入代码,请勿粘贴截图

2、代码块
public void connectSerialPort(String portName, int baudRate) {
commlogger.info("trying to initialize " + portName + " with baud rate of: " + baudRate);
serialPort = SerialPort.getCommPort(portName);
// serialPort.setBaudRate(baudRate);
//一次性设置所有串口参数
serialPort.setComPortParameters(baudRate, 8, 1, SerialPort.NO_PARITY);
// serialPort.openPort();//打开串口
// 是否打开串口,如果已经打开串口则,绑定串口事件处理器
if (serialPort.openPort()) {
commlogger.info("Success connected port: " + portName);
isConnected = true;
// 给串口添加监听器,接收数据
serialPort.addDataListener(new SerialPortDataListener() {
@Override
public int getListeningEvents() {
return SerialPort.LISTENING_EVENT_DATA_AVAILABLE;
}

            @Override
            public void serialEvent(SerialPortEvent event) {
                if (event.getEventType() != SerialPort.LISTENING_EVENT_DATA_AVAILABLE) {
                    return;
                }
                byte[] newData = new byte[serialPort.bytesAvailable()];
                if (newData.length < 9) {
                    logger.info("receive package error! length little 9 " + ProtoUtil.hex(newData));
                    return;
                }
                serialPort.readBytes(newData, newData.length);// 读取串口的数据
                //检查数据的起始标记,俩个字节
                if ((byte) 0xad == newData[0] && (byte) 0xba == newData[1]) {
                    //第4个字节是命令编码el
                    if ("e1".equals(String.format("%2x", newData[3]))) {
                        //只保留完整的数据,就是31个字节
                        if (newData.length == 31) {
                            //保存从串口读取的数据到队列里
                            communicationService.getReceiveQueue().add(newData);
                        }
                    } else {
                        //保存从串口读取的数据到队列里
                        communicationService.getReceiveQueue().add(newData);
                    }
                }
                commlogger.info("RECEIVE: " + ProtoUtil.hex(newData));
                // msgListener.processMessage(newData);
            }
        });

    } else {
        //未打开串口,添加心跳检测定时任务
        isConnected = false;
        logger.info("Failed connect port: " + portName);
        commlogger.info("Failed connect port:" + portName);
        //添加心跳监控
        serialPortHeartBeat(portName);
    }
    //添加心跳监控
    // serialPortHeartBeat(portName);
}
运行结果及报错内容

3、运行结果
有一些数据对应的效果,不能实现预期。

我的解答思路和尝试过的方法

4、我的解答思路
压力差使用分段法,分段控制压力对应的排气量。

我想要达到的结果

5、想要的效果
类似PID算法达到的效果,实际值会接近目标值,开始的时候实际值会快速的接近目标值,到达目标值后实际值就会等于目标值。

和我的一个东西类似,只不过是电机而你这个是气缸类的
这类难点就在于它不是线性而且还有滞后性,PID总是达不到理想效果
只能先实际测试,做出一个表,进气排气对应的实际压力值
需要达到目标压力值时,先根据预先测得的数据到达目标压力值附近,然后根据传感器反馈一点一点微调,这东西如果精度要求高的话速度快不起来