Вызов функции соответствия внутри try при чтении непрерывных данных с использованием GNU - PullRequest
2 голосов
/ 26 декабря 2011
case SerialPortEvent.DATA_AVAILABLE:

      byte[] readBuffer = new byte[64];
     try {
            // read data
            int numBytes = inputStream.read(readBuffer);
            inputStream.close();
            //-------------------------------
           //send the received data to the GUI
            String result = new String(readBuffer,0,numBytes);
            //-----------------------------
            gui.setjtaReceived(result);

            matcher(result,writer,df);
            //gui.setjtaReceived(result);
     }
     catch (IOException e) {exceptionReport(e);}

В приведенном выше случае переключения для SerialPortEvent.Dat_Available я получаю непрерывные данные в режиме реального времени. Функция matcher вызывает для указанной ниже функции

    private void matcher(String str,FileWriter writer,DateFormat df) {
    Matcher m1 = p1.matcher(str);
    Matcher m2 = p2.matcher(str);
    System.out.println(m1.group());
    Calendar cal = Calendar.getInstance();
    String match_heartBeat = null;
    String match1 = m1.group();
    int length1 = match1.length();
    if(m2.find()){
        String match2 = m2.group();
        int length2 = match2.length();
        match_heartBeat = match2.substring(2, length2-1);
        //System.out.println(match1.subSequence(2, 4) + ";" + match_heartBeat);
    }
    String realTime = df.format(cal.getTime());
    writer.append(realTime);
    writer.append(',');
    writer.append(match1.subSequence(2, length1-1));
    writer.append(',');
    writer.append(match_heartBeat);
    writer.append('\n');
    writer.flush();


 }

Когда я попытался записать во внешний файл CSV или даже сделать System.out.println (m1.group) или System.out.println (match_heartBeat), я не смог записать его в файл или распечатать на экране. однако System.out.println (m1) печатается на экране. Есть идеи как это побороть? Я пытаюсь декодировать данные, полученные в режиме реального времени. Шаблон выглядит следующим образом:

    Pattern p1 = Pattern.compile("\\b(a)\\w*( )\\b");
    Pattern p2 = Pattern.compile("\\b(')\\w*( )\\b");

Он ищет алфавит «а» до пробела и «до пробела». Файл «Writer» генерируется после запуска программы. Но может добавить декодированные данные.

Пример данных:

79 0009a017 009a047 9%0009a047 90009a046 9%0009a0469 0009a045 9%0009a0459'00 90009a045 9%0009a044 90009a044 9%0009a044 9 

Пример вывода CSV файл

System time , 17 , 00

1 Ответ

1 голос
/ 28 января 2013

Давайте уточним спецификацию на основе комментариев.Это строка ввода:

79 0009a017 009a047

Это строка вывода:

017,00

И "017" - это десятичное (не восьмеричное) число.Возможно, будет удобнее отформатировать его как «17» позже.

Как уже упоминалось в комментариях, это регулярное выражение неверно:

Pattern p1 = Pattern.compile("\\b(a)\\w*( )\\b");

Оно должно быть:

Pattern p1 = Pattern.compile("a(\\d+) (\\d{2})");

Быстрая демонстрация:

echo "79 0009a017 009a047" | perl -lne 'print $1,",",$2 if /a(\d+) (\d{2})/'
017,00
...