outputStream.write имеет переполнение буфера? - PullRequest
3 голосов
/ 10 ноября 2011

Я пытаюсь отправить byte[] на последовательный порт. Однако outputstream.write(byte[]); работает только тогда, когда byte[].length содержит менее 100 байтов.

Просто чтобы знать:

с использованием набора инструментов пружинного источника (Eclipse) JDK 1,7
DEFAULTBAUDRATE установлен на 9600
byte[] никогда не содержит более 476 байтов
NRSerial - это библиотека, предлагающая независимую от платформы версию библиотеки покойного vaxx.comm
к последовательному порту не подключено оборудование
Я нюхаю последовательный порт с приложением (немного похоже на wireshark)
Я еще студент, поэтому код может быть отстой: P

Этот код работает:

NRSerialPort port = new NRSerialPort(portname, DEFAULTBAUDRATE);
port.connect();
OutputStream outputStream = port.getOutputStream();
for(int i = 0; i<bytes.length; i++){
    if(i%10==0){
        Thread.sleep(1);    
    }
    outputStream.write(bytes[i]);
}
outputStream.flush();
outputStream.close();
port.disconnect();

Преимущество: работает на всех системах
Недостаток: может спать без необходимости

И вот так:

NRSerialPort port = new NRSerialPort(portname, DEFAULTBAUDRATE);
port.connect();
OutputStream outputStream = port.getOutputStream();
for(byte b : bytes){
    outputStream.write(b);
}
outputStream.flush();
outputStream.close();
port.disconnect();

Преимущество: без необходимости спать
Недостаток: может не работать на быстрых системах, потому что они могут обрабатывать каждую намного быстрее

Но приведенный ниже код завершится ошибкой, если байты содержат более 100 байтов:

NRSerialPort port = new NRSerialPort(portname, DEFAULTBAUDRATE);
port.connect();
OutputStream outputStream = port.getOutputStream();
outputStream.write(bytes);
outputStream.flush();
outputStream.close();
port.disconnect();

Хотя write(byte[]) является допустимым методом в библиотеке солнца

У меня есть некоторые идеи по этому поводу:

  • Я переполняю выходной буфер, скорость передачи данных слишком мала для отправки этих данных сразу
  • write(byte[]) не режет byte[] на мелкие кусочки

Вы можете удивиться, почему я задаю этот вопрос, если у меня есть рабочее решение. Ну:

Я хочу знать, какое из моих решений лучше и / или есть ли другой / лучший способ сделать это. кроме того, зачем создавать метод write(byte[]), если его возможности обработки зависят от аппаратного обеспечения (по крайней мере, скажем так в JavaDoc?)

1 Ответ

0 голосов
/ 10 ноября 2011

Предполагая, что я погуглил правильный код, это не похоже на проблему с Java, но с реализацией библиотеки NRSerialPort.

Погружаясь в код, я вижу, что SerialOutputStream обеспечивает реализацию OutputStream и вызывает два разных метода в зависимости от того, используется ли метод write(byte) или write(byte[]):

см. здесь

protected native void writeByte( int b, boolean i ) throws IOException;
protected native void writeArray( byte b[], int off, int len, boolean i ) 
    throws IOException;

Не копаясь в собственном коде, я бы предположил, что в реализации метода writeArray может быть ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...