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