SerialPort Чтение в Java - PullRequest
       13

SerialPort Чтение в Java

1 голос
/ 15 февраля 2012

Вот проблема в моем последовательном соединении Java ... мое аппаратное устройство jennic подключено с помощью UART. Я хочу получить значения из моего устройства ..

Я получаю байтовый массив строк в SerialPortEvent.DATA_AVAILABLE

        case SerialPortEvent.DATA_AVAILABLE:
            try {
                     int size;
                     while(inputStream.available()!=0) {
                         byte buff[]=new byte[100];
                         size=inputStream.read(buff);
                         inputStream.close();
                         String result = new String(buff,0,size);
                         ZPS_tsAplZdpIeeeAddrRsp IeeRsp = new ZPS_tsAplZdpIeeeAddrRsp(result);
               }

Сначала я читаю байты и сохраняю их в буфере []. затем преобразуйте его в строку и преобразуйте в массив строк после ... но моя проблема в том, что я получаю результат, как только через несколько раз его разрывы.

Пример вывода:

  80011634002078445541560000341201004189

  80011635002078445541560000341201004189

  80011636002078445541560000341201004189
  /*Here is Break my seq */
  800116370020784455

  41560000341201004189/*this two breaking seq generated two separate array and here is the problem*/

  80011638002078445541560000341201004189

есть ли проблема для очистки входного буфера? Я пробовал inputStream.reset (), но он не работает .. может кто-нибудь дать мне подходящее предложение для решения проблемы ..

спасибо ...

Ответы [ 3 ]

1 голос
/ 15 февраля 2012

«Проблема» в ваших ожиданиях. Нигде не говорится, что read () заполнит буфер или что последовательная передача данных сохранит границы ваших сообщений. Это зависит от вас. Все, что вы получаете, это поток байтов.

0 голосов
/ 16 февраля 2012

Вам нужно прочитать данные из порта в буфер, и когда в этом буфере будет целое сообщение, сбросьте эту часть буфера в свои процедуры обработки сообщений. Это означает, что вам нужно определять свои сообщения таким образом, чтобы каждое сообщение можно было независимо идентифицировать и изолировать.

Чтение потока будет работать или блокироваться, когда данные доступны или недоступны; однако чтение из потока не гарантирует, что вы получите свои данные в виде кусков размером с одно сообщение. Вы только получаете уведомление, что есть данные для чтения. Вы заметили общую проблему, когда данные доступны для чтения в буфере последовательного порта, и вы начали читать их до того, как все сообщение стало доступно для чтения. Помните, что может возникнуть другая проблема, возможно, во время другого запуска два или более сообщений могут быть помещены в буфер в буферах последовательного порта, прежде чем ваша программа будет готова прочитать «следующее» сообщение.

Переработать ваш протокол связи для чтения байтов в буфер (класс), который хранит байты до тех пор, пока сообщения не станут доступны для чтения. Затем поместите интерфейс в этот буфер readMessage(), который действует как read(), за исключением уровня сообщений (буферизация до получения полного сообщения).

0 голосов
/ 16 февраля 2012

Как правило, вы не можете ожидать, что «сообщение», отправленное с одного конца последовательного соединения, будет получено как одна группа.Вы можете получить все сразу или несколькими кусками разной длины.Ваша принимающая программа должна использовать то, что она знает о входящих данных, чтобы прочитать байты из последовательного порта, собрать их вместе и понять, когда было получено полное сообщение.

Обычно устройства обрабатывают это в одном изтри способа:

  • Пакеты фиксированной длины - вы читаете, пока не получите X байтов, а затем обрабатываете эти байты X.
  • Длина пакета является частью заголовка пакета, указывающего, сколько дополнительных байтов нужнопрочитайте, прежде чем рассматривать полученные данные до полного пакета.
  • Индикаторы начала / окончания пакета (STX или SOH для начала и ETX для завершения обычно).Вы обрабатываете все данные, полученные между индикатором начала и конца, как один пакет сообщения.
...