使用jssc延迟串行通信

时间:2015-06-08 14:01:01

标签: java jssc

我使用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 个答案:

答案 0 :(得分:1)

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

timing diagram

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

如果你正在做一个&#34;设备连接&#34;或者&#34;获取设备信息&#34;风格的设备请求,或者不需要实时响应的请求,您可以让您的模拟器自行完成(通过单独的请求循环)线程或其他东西)并缓存响应,并在服务器请求时将其移回。但是,您必须确保在实时请求通过时中止,因此它几乎比必要的复杂。

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

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