gpt4 book ai didi

java - 使用jssc进行串行通信时出现延迟

转载 作者:行者123 更新时间:2023-11-30 08:08:49 25 4
gpt4 key购买 nike

我正在使用jssc与我制作的模拟器进行串行端口通信。问题是,每当服务器从我的模拟器请求设备时,我都会遇到延迟,因为模拟器中的设备在一段时间后而不是在请求之后回复。为了回复请求数据包,我在串行事件监听器中使用 jssc 方法 writeBytes() ,它是:

SerialPort.writeBytes(packet);

数据包小于 20 个字节,而且我正在检查我的串行事件

if(event.isRXCHAR() && event.getEventValue() > 0){}

你们能帮我减少这种延迟,以便模拟器设备在请求后立即回复吗?这是一段代码-

public void serialEvent(SerialPortEvent event)
{
if(event.isRXCHAR() && event.getEventValue() > 0)
{
byte Server_PacketByte;
try {
Server_PacketByte = receiver_Port.readBytes(1)[0];
byte[] form_packet = PacketFormation(Server_PacketByte);// for adding bytes to make packet
if(form_packet == null)
{
return;
}

for(Device d : devices)
{
if(form_packet != null)
{
d.processPacket(form_packet);// in the list of devices I have all the information of device and also reply packet
}
}
} catch (Exception e1) {
e1.printStackTrace();
}

}
}

processPacket()内部

if (packet.equals(REQUEST))
{
receiver_Port.writeBytes(device.getReply());
}

最佳答案

所以,我认为您的系统发生的情况是,从模拟器返回到服务器的响应时间太长,或者服务器请求太接近而无用。如果你的模拟器对服务器的响应时间太长,那么它可能会忽略或忽略你的服务器的后续请求,并且你的服务器可能会通过忽略响应(因为它是针对它已经放弃的请求)或更糟糕的方式来处理此问题,认为对请求 #1 的响应是对请求 #3 的响应(可能具有不同的参数,因此无效)。

timing diagram

解决方案是让服务器在尝试另一个请求之前等待更长的时间来响应,或者以某种方式减少模拟器响应服务器请求所需的时间。

如果您只是对设备执行“设备是否已连接”或“获取设备信息”式请求,或者不需要实时响应,则可以让模拟器自行执行此操作(通过单独线程或其他线程上的请求循环)并缓存响应,并在服务器请求时将其返回。但是,您必须确保在实时请求通过时它会中止,因此它几乎比必要的更复杂。

编辑:澄清一下,我不认为您的串行通信遇到了不当的延迟,因为串行通信很慢。我认为您在设计中没有考虑到这一事实,并且您期望潜在大量设备的所有通信在特定时间范围内完成。此外,每个设备可能需要不同的时间来通过串行方式传回响应;其中一些甚至可能没有正确实现流量控制,从而导致偶尔的延迟,或者在极少数情况下导致交付失败。

您的模拟器中应该有一些其他线程定期请求设备更新并将它们存储在表中。这样,当服务器发出询问所有设备的请求时,它们的信息已经存在,并且可以打包并传递回服务器,而无需串行通信。

关于java - 使用jssc进行串行通信时出现延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30711193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com