Почему используя socket "команда" через OutputStream.write - проходит, а ответа через InputStream - нет?
Появилась задача управлять знаком из кода, знак подключен по rs485 к ruggedCom rs416(это железка с com- портами), к ней через сеть подключен мой ПК, т.е. у нее есть свой IP и номер com порта. Когда я создаю socket, указываю ip и нужный мне порт. При этом посылая команду через OutputStream.write() - команда проходит и знак переключается, но мне нужно так же принимать подтверждение от знака в виде ответа, что он переключился правильно. Но в итоге, InputStream.in() - возвращает -1, иногда проскакивает 1. У ruggedCom -есть свой софт, который создает виртуальный ком порт с настройками скорости и т.д. и вот если я цепляюсь к этому порту с помощью SerialPort, тогда всё норм. приходит ответ, но мне нужно обойтись без создания виртуального com порта, или создавать его каким то образом из кода или в идеале - получать ответ через InputStream.read(). Знаю задача странная, но очень нужно найти выход, буду благодарен любой подсказке, спасибо.
вот, команда так проходит.
//создание сокета с указание ip адреса и com порта
Socket socket = new Socket(ip,com);
OutputStream out = socket.getOutputStream();
//метод changeWord меняет слово учитывая полосу!
String command = changeWord(commandWord, line, value);
InputStream in = socket.getInputStream();
byte[] buffer = new byte[1000];
// //отправка команды на знак
out.write(hexToByte(command));
System.out.println(in.read(buffer));
socket.close();
но System.out.println(in.read(buffer)) - возвращает -1
а вот так получается получить нужный ответ, но получается что я использую дополнительное приложение которое создает виртуальный com порт.
serialPort = new SerialPort("COM5");
try {
serialPort.openPort(); // открытие порта
serialPort.setParams(
SerialPort.BAUDRATE_19200,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_EVEN); // основные параметры протокола UART
serialPort.setEventsMask(SerialPort.MASK_RXCHAR); //Устанава маски или списка события на которые будет происходить реакция. В данном случае это приход данных в буффер порта
serialPort.addEventListener(new EventListener());//Передача экземпляра класса EventListener порту, где будет обрабатываться события
System.out.println("имя созданого порта "+serialPort.getPortName());
if(serialPort.isOpened()){
System.out.println("порт "+serialPort.getPortName()+" открыт");
for(int i = 0; i <10; i++){
System.out.println("запрос: 1058015916");
serialPort.writeBytes(hexToByte("1058015916"));
}
Ответы (1 шт):
Смог разобраться благодаря статье - https://skipy-ru.livejournal.com/3621.html, моя ошибка была в том что я пытался получить байты методом in.read(), а он возвращает количество считанных байт, а не сами значения. Вопрос для меня был очень важный, хорошо что попалась эта статья, автору спасибо!