Używam RXTX od około roku, bez zbyt wielu problemów. Właśnie zacząłem nowy program do interakcji z nowym sprzętem, więc ponownie wykorzystałem metodę connect(), której używałem w innych moich projektach, ale mam dziwny problem, którego nigdy wcześniej nie widziałem.Problemy z odbiorem w RXTX
Problem
Urządzenie działa dobrze, bo kiedy połączyć z HyperTerminal, wysyłam rzeczy i otrzymać to, czego oczekuję, a Serial Port Monitor (SPM) to odzwierciedla.
Jednak po uruchomieniu prostego klonu HyperTerminal, który napisałem, aby zdiagnozować problem, który mam z moją główną aplikacją, bajty są wysyłane, zgodnie z SPM, ale nic nie jest odbierane, a mój SerialPortEventListener nigdy nie odpala. Nawet gdy sprawdzę dostępne dane w głównej pętli, reader.ready()
zwraca false
. Jeśli zignoruje to sprawdzenie, otrzymam wyjątek, szczegóły poniżej.
odpowiedniej sekcji metody connect()
// Configure and open port
port = (SerialPort) CommPortIdentifier.getPortIdentifier(name)
.open(owner,1000)
port.setSerialPortParams(baud, databits, stopbits, parity);
port.setFlowControlMode(fc_mode);
final BufferedReader br = new BufferedReader(
new InputStreamReader(
port.getInputStream(),
"US-ASCII"));
// Add listener to print received characters to screen
port.addEventListener(new SerialPortEventListener(){
public void serialEvent(SerialPortEvent ev) {
try {
System.out.println("Received: "+br.readLine());
} catch (IOException e) { e.printStackTrace(); }
}
});
port.notifyOnDataAvailable();
Wyjątek
java.io.IOException: Underlying input stream returned zero bytes
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:268)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.read(BufferedReader.java:157)
at <my code>
Wielkie pytanie (znowu)
Chyba wyeliminować wszystkie możliwe problemy sprzętowe, więc co może być wro ng z moim kodem lub biblioteką RXTX?
Edit: coś ciekawego
Kiedy otwieram HyperTerminal po wysłaniu kilka poleceń z Java, które powinny dostał odpowiedzi, wszystkie odpowiedzi pojawiają się natychmiast, jak gdyby były one umieszczone w buforze gdzieś, ale niedostępne.
Edit 2: Próbowaliśmy czegoś nowego, same wyniki
wpadłem przykład kodu znalezione here, z tych samych wyników. Nie pojawiły się żadne dane, ale kiedy przełączyłem się na nowy program, przyszło wszystko naraz.
Edycja 3
Sprzęt jest w porządku, a nawet inny komputer ma ten sam problem. Nie używam żadnego adaptera USB.
Również zacząłem używać PortMon, i to daje mi interesujące wyniki. HyperTerminal i RXTX nie używają tych samych ustawień, a RXTX zawsze odpytuje port, w przeciwieństwie do HyperTerminal, ale wciąż nie widzę, jakie ustawienia miałyby na to wpływ. Jak tylko będę mógł odizolować konfigurację od stałego pobierania, opublikuję moje dzienniki PortMon.
Edycja 4
Czy to możliwe, że jakiś aktualizacji systemu Windows w ciągu ostatnich 3 miesięcy mogło spowodować to? Zepsuł jeden z moich programów bazujących na mex'ach MATLAB.
Edycja 5
Ja również zauważyłem kilka rzeczy, które różnią się między HyperTerminal RxTx i osobny program Okazało się, że komunikuje się z urządzeniem (ale nie robić tego, co chcę, co jest dlaczego jestem toczenia mój własny program)
- HyperTerminal - ustawić bez kontroli przepływu, ale RTS portu szeregowego monitora i DTR wskaźniki są zielone
- Inny program - nie wiem, jakie ustawienia myśli, że używa, ale tylko Wskaźnik RTS SPM jest zielony
- RXTX - bez względu na ustawioną kontrolę przepływu, tylko wskaźniki CTS i DTR SPM są włączone.
Od plikach pomocy szeregowego portu monitora'S (sparafrazowanych):
the indicators display the state of the serial control lines
RTS - Request To Send
CTS - Clear To Send
DTR - Data Terminal Ready
Czy mógłbyś opublikować kontrolkę przepływu, której używałeś? z góry dzięki ... – Oso
Mam nadzieję, że ta edycja pomoże –
@drhorrible Widzę, jak ustawić flowcontrol na swoim obiekt szeregowy. To jasne. Jednak próbuję dowiedzieć się, jak można wykryć, że znak kontroli przepływu został wysłany? Używam XON XOFF vs RTS tak jak Ty. Zakładam jednak, że powinna być podobna. 0x13,0x11 to postacie, które spodziewam się zobaczyć w wydaniu serialEvent? Jak mogłeś to wykryć w kodzie? – ril3y