Несоответствие между тем, что я читаю с последовательного порта, и тем, что делает Гипертерминал
Я использую Гипертерминал, чтобы прочитать вход от датчика. Этот датчик отправляет строку, которая должна иметь вид значения 6 цифр или 5 цифр и десятичной точки (однако это может быть как 2 пробела, а затем 3 цифры и один десятичный знак) разделитель табуляции Единица измерения ("Ci","mCi" и т.д.) строка разделителя табуляции, например, вкладка (F-18 или C-11) вкладка разделителя Идентификатор конца строки CRLF.
Если я контролирую этот вход через терминал Hyper, он читает его отлично
0.00 kBq F-18 2D
Однако, когда я читаю это, я получаю сломанные сегменты строки большую часть времени, и иногда я получаю правильную строку, пример того, что я могу получить, показан ниже.
0.00 k□□□□□□□□□□□□□
Bq F-18 2D□□□□□□□□□
0.00 kBq F-18 □□□
0.002D
□□□□□□□□□□
Код, который я использую, взят из библиотеки RXTX.
public void serialEvent (SerialPortEvent event){
if (event.getEventType()== SerialPortEvent.DATA_AVAILABLE){
byte[] readBuffer = new byte[19];
try{
while (inputStream.available() > 0){
int numBytes = inputStream.read(readBuffer);
}
catch (IOException e) {}
input_line = new String (readBuffer);
inter.update(input_line);}}
1 ответ
Это по замыслу. Вы предполагаете, что получите все байты из вызова Read(). Это не то, как это работает, оно даст вам только те байты, которые были получены до сих пор. Это происходит и в Гипертерминале, но вы никогда этого не заметите, потому что ваши глаза не такие быстрые.
Вам нужно будет переместить readBuffer за пределы метода и постепенно заполнять его, пока вы не получите полный ответ. Тогда обработайте это.
Если устройство отправляет только простой текст ASCII и терминатор строки, это часто встречается, тогда вызов SerialPort.ReadLine() - это хороший способ убедиться, что вы получите все символы в ответе. При необходимости настройте свойство NewLine.