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总是达不到理想效果
只能先实际测试,做出一个表,进气排气对应的实际压力值
需要达到目标压力值时,先根据预先测得的数据到达目标压力值附近,然后根据传感器反馈一点一点微调,这东西如果精度要求高的话速度快不起来