Мне удалось найти решение, которое, кажется, решает проблему - кажется, что Input и OutputStreams не полностью закрываются перед последовательным портом, так как они работают в своих собственных потоках и оказываются захваченнымипо своим данным.Это решается добавлением синхронизированных мьютексов, которые обеспечивают правильную очистку этих потоков перед закрытием последовательного порта.
В своем классе SerialConnection я добавил логические поля stopRead и stopWrite, чтобы указать, когда потоки InputStream и OutputStream соответственноследует перестать слушать.Я также добавил мьютексы stopReadMutex и stopWriteMutex для синхронизации этих значений между основными потоками и потоками чтения / записи.На каждой итерации своих циклов читатель и писатель проверяют логические значения stopRead и stopWrite и разбивают их циклы.
Когда вызывается моя функция разъединения, я использую мьютексы для изменения значений stopRead и stopWrite перед вызовом closeфункции соответствующих потоков и serialPort, как показано здесь:
public void disconnect(){
try {
synchronized(stopReadMutex)
{stopRead = true;}
synchronized(stopWriteMutex)
{stopWrite = true;}
portOut.close();
portIn.close();
serialPort.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Кроме того, здесь есть ссылка на соответствующий исходный код, если кто-то захочет поближе взглянуть.http://pastebin.com/C4Fy8mLZ