1

我正在使用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());
         }
4

1 回答 1

1

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

时序图

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

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

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

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

于 2015-06-08T14:35:52.007 回答