Я только что присоединился к StackOverflow после того, как нашел много хороших ответов здесь в прошлом.Вот мой первый вопрос:
РЕДАКТИРОВАТЬ: я чувствую себя плохо ... мой первый вопрос к StackOverflow оказался "погоня за дикой гуся".Проблема в data , а не в коде, читающем данные.Я искал решение не в том месте!Я объясню в комментарии ниже.
Пожалуйста, не обращайте внимания на этот вопрос.
В моем приложении данные поступают фрагментарно (это последовательные данные).Я хочу передать данные в метод, который будет их анализировать.Но я только хочу пройти по правильно завершенным линиям.Строки будут оканчиваться на '\ r' (возвращаемый символ).Иногда приходит фрагмент данных, имеющий несколько завершенных строк.Но иногда приходит фрагмент данных, у которого еще нет терминатора (терминатор прибудет позже).
Моя цель - иметь возможность отправлять только правильно завершенные строки (полные строки) в dataProcessor.logSerialData,(Код работает без этого требования, но я мог бы написать намного более чистый код, если бы мог выполнить это требование. Логика синтаксического анализа - здесь не показана - было бы легче поддерживать.)
Вот мой код, которыйРАБОТАЕТ (но не соответствует моему новому требованию):
case SerialPortEvent.DATA_AVAILABLE:
try
{
int len = -1;
while ((len = in.read(readBuffer)) > 0)
{
if (len > 0)
{
String s = new String(readBuffer, 0, len);
if (dataProcessor != null)
{
dataProcessor.logSerialData(s);
}
else
{
Logger.log("ERROR: packetReceiver is null");
}
}
}
}
catch (IOException ex)
{
Logger.log(ex);
return;
}
Вот пример одной из многих вещей, которые я пробовал, но НЕ работает.Это как-то вызывает ошибки в потоке данных.
private static final String REGEX = ".*\\r";
private Pattern p = Pattern.compile(REGEX);
public void serialEvent(SerialPortEvent e)
{
byte[] readBuffer = new byte[11000];//tried many values for buffer size
switch (e.getEventType())
{
case SerialPortEvent.DATA_AVAILABLE:
try
{
int len = -1;
while ((len = in.read(readBuffer)) > 0)
{
if (len > 0)
{
String input = new String(readBuffer, 0, len);
Matcher m = p.matcher(input);
int count = 0;
while (m.find())
{
count++;
String terminatedLine = m.group();
if (!terminatedLine.isEmpty())
{
completedLines.add(terminatedLine);
}
}
}
}
}
catch (IOException ex)
{
Logger.log(ex);
return;
}
for (String line : completedLines)
{
dataProcessor.logSerialData(line);
}
Есть предложения?(На самом деле, есть идеи, почему новый код вносит ошибки в поток данных? Каждый вариант рабочего кода, который я пробовал, работает неправильно. Я пробовал методы регулярных выражений и не-регулярных выражений и любые другие вещи. Единственный код, которыйworks - это рабочий пример, показанный выше. Последовательная обработка данных кажется очень сложной! Я мог бы использовать некоторую помощь.