Java 使用jssc的串行通信延迟

Java 使用jssc的串行通信延迟,java,jssc,Java,Jssc,我正在使用jssc与我制作的模拟器进行串口通信。问题是,每当服务器从我的模拟器请求设备时,我都会遇到延迟,因为模拟器中的设备会在一段时间后响应,而不是在请求之后。为了响应请求数据包,我在串行事件侦听器中使用了jssc方法writeBytes(),它是: SerialPort.writeBytes(packet); 数据包小于20字节,我正在检查串行事件 if(event.isRXCHAR() && event.getEventValue() > 0){} 你们能帮我减少

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


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

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

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

编辑:澄清一下,我不认为是您的串行通信遇到了不适当的延迟,因为串行通信速度很慢。我认为您在设计中没有考虑到这一事实,您希望您潜在的大量设备在一定时间内完成所有通信时间框架。此外,每个设备可能需要不同的时间通过串行方式发送回响应;其中一些设备甚至可能没有正确实施流量控制,导致偶尔的延迟,或者在极少数情况下,发送失败


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

st off,您确定调用在您预期的时间执行吗?是的,我确定。调用正在执行我捕获请求数据包的时间,但它在一段时间后应答,当应答到来时,服务器会创建2到3个进一步的请求。这是系统间通信的预期结果;您不会立即得到响应。事情花点时间通过线路进行计算、编码和传输。如果你希望你的模拟系统更快,那么你应该询问(并提供更多细节)那么有没有办法克服它呢?假设我们不能对服务器做任何事情……那么我们如何在模拟器方面实现解决方案呢?因为我认为方法
writeBytes()
readBytes()
花费的时间太多。我将与您共享一些代码,对于第二个和第三个请求,会有一个答复,而且也很晚。在您发布的代码中,是否需要在所有设备上迭代?一次有多少设备连接到模拟器?是的,我正在迭代所有设备实例的整个过程一次我必须使用100多台设备,但到目前为止,我只使用了10台设备,但仍然存在延迟,有时显示9台设备,有时显示5台或1台设备,情况有所不同。我也尝试过使用线程并同步它们,但问题仍然是一样的。嘿@Shotgun你有什么解决方案吗?
if (packet.equals(REQUEST))
         {
            receiver_Port.writeBytes(device.getReply());
         }