串行通信中的数据丢失

tzxcd3kk  于 2021-07-13  发布在  Java
关注(0)|答案(0)|浏览(204)

在串行通信中,有时数据在接收端丢失,有时数据在接收端丢失和发送。我观察到数据发送和接收成功当我设置波特率为300800时,请检查以下代码==>接收器==>我正在使用jserial com进行通信也打开端口并设置波特率,partity=1,numdatabits=8,numstopbits=1 comport.adddatalistener(new serialportdatalistener(){

@Override
                    public int getListeningEvents() {
                        {
                            return SerialPort.LISTENING_EVENT_DATA_AVAILABLE;
                        }
                        // return 0;
                    }

                    @Override
                    public void serialEvent(SerialPortEvent serialPortEvent) {

                        if (serialPortEvent.getEventType() != SerialPort.LISTENING_EVENT_DATA_AVAILABLE) {
                            logger.info("in HLIToModbusConversionController" + "event_type="
                                    + serialPortEvent.getEventType());

                            return;
                        }else {
                            logger.info("in HLIToModbusConversionController getCommandFromSerial() getEventType:"   + serialPortEvent.getEventType());
                        }
                        ExecutorService executorService = null;
                        try {
                            //50 ml time out
                            executorService = Executors.newSingleThreadExecutor();
                            long sTime = System.currentTimeMillis();

                            int len = serialPortEvent.getSerialPort().bytesAvailable();

                            byte dataBuffer[] = new byte[len];
                            serialPortEvent.getSerialPort().readBytes(dataBuffer, len);
                            for (int i = 0; i < dataBuffer.length; i++) {
                                byte b = dataBuffer[i];
                                logger.info("in HLIToModbusConversionController" + String.format("%02x ", b));

                            }
                            logger.info("in HLIToModbusConversionController" + dataBuffer);
                            Future<byte[]> future = executorService
                                    .submit(new TimeOutTask(hliToModbusService, dataBuffer));
                            while (!future.isDone()) {
                                long totalTime = System.currentTimeMillis() - sTime;
                                if (totalTime > configurationModel.getModbusTimeout()) {
                                    logger.info("Task is taking long time to execute so cancelling it..");
                                    future.cancel(true);
                                }
                            }
                            byte responseFrame[] =null;
                            //byte responseFrame[] = hliToModbusService.decodeHLICommand(dataBuffer); // service
                            try {
                                responseFrame = future.get((long) configurationModel.getModbusTimeoutSecond(), TimeUnit.SECONDS);
                                logger.info("result:"+responseFrame);
                                fileOperationUtil.writeFramFromCache(responseFrame);
                            } catch (Exception e) {
                                logger.info("50 millisecond time out frame takes from cache");
                                responseFrame =fileOperationUtil.readFramFromCache();
                            }                                                                       // call
                            modbusRequest.setTimeout(false);
                            if (responseFrame != null) {
                                comPort.writeBytes(responseFrame, responseFrame.length);

                                logger.info("in HLIToModbusConversionController response frame sent" + responseFrame);

                                // wait for 100ms

                            } else {
                                logger.info(
                                        "in HLIToModbusConversionController responseFrame is empty" + responseFrame);

                            }
                            String finalFrame="";
                            for(byte data:responseFrame) {
                                finalFrame=finalFrame+","+data;
                            }
                            logger.info(
                                    "in HLIToModbusConversionController final responseFrame:" + finalFrame);
                            startTimer();
                            logger.info("in HLIToModbusConversionController returns from startTimer");
                        } catch (Exception e) {
                            logger.info("in HLIToModbusConversionController exception occurs");
                            e.printStackTrace();

                        }finally{
                            if(executorService != null){
                                executorService.shutdown();
                            }

                    }}
                });
            }

        }
        //comPort = SerialPort.getCommPorts()[0]; // take 1st port

    } catch (Exception e) {
        logger.info("in HLIToModbusConversionController exception occurs");
        e.printStackTrace();
    }
    logger.info("in HLIToModbusConversionController");
    logger.info("Server started");

    logger.info("Waiting for a client ...");
    return "Hli server started";

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题