split
использует регулярные выражения (к сожалению, IMO).^
имеет специальное значение в регулярных выражениях, поэтому вам нужно его экранировать:
String[] bits = readBuf.split("\\^");
(Первая обратная косая черта необходима для экранирования Java. Фактическая строка - это просто одна обратная косая черта и символ каретки.)
В качестве альтернативы используйте Гуава и его Splitter
класс.