Я пытаюсь установить связь между моим компьютером и печатной платой через последовательный порт, используя javax.comm
. Я написал программу (на основе примеров SimpleRead
и SimpleWrite
), которая будет принимать любые данные, полученные с устройства, печатать их на System.out
, принимать любую строку, набранную в System.in
, и отправлять ее на устройство, затем на \r\n
.
В устройстве имеется функция справки, которую я использую для проверки связи (отправьте hlp
, и устройство ответит списком команд, которые оно примет). При первой отправке hlp
я получаю ожидаемый ответ, но во второй раз при отправке hlp
я не вижу ответа.
Это известная проблема с javax.comm
? Или есть какая-то команда start-of-new-message, которую мне нужно искать и отправлять на мое устройство между сообщениями?
Дополнительная информация:
Я использую ноутбук Toshiba под управлением Windows XP.
Я подключил плату к осциллографу, и контрольная точка «отправки данных» изменяет напряжение при отправке первой hlp
(это когда я вижу текстовый ответ в моей программе. Однако контрольная точка «отправки данных» делает не изменяйте напряжение в ответ на второе и последующие сообщения (когда я не вижу текстового ответа). Таким образом, я совершенно уверен, что проблема заключается в том, что моя программа неправильно отправляет данные (а не моя программа не получает ответ должным образом).
Методы чтения и записи моей программы:
public void run() {
try {
InputStreamReader converter = new InputStreamReader(System.in);
BufferedReader in = new BufferedReader(converter);
String s = in.readLine();
s = s+"\r\n";
serialPort.getOutputStream().write(s.getBytes());
serialPort.getOutputStream().flush();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void serialEvent(SerialPortEvent event) {
switch(event.getEventType()) {
case SerialPortEvent.BI:
case SerialPortEvent.OE:
case SerialPortEvent.FE:
case SerialPortEvent.PE:
case SerialPortEvent.CD:
case SerialPortEvent.CTS:
case SerialPortEvent.DSR:
case SerialPortEvent.RI:
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
break;
case SerialPortEvent.DATA_AVAILABLE:
byte[] readBuffer = new byte[100];
byte[] actualBytes = null;
try {
while (inputStream.available() > 0) {
int numBytes = inputStream.read(readBuffer);
actualBytes = new byte[numBytes];
for(int i =0; i < numBytes; i++){
actualBytes[i] = readBuffer[i];
}
}
System.out.print(new String(actualBytes));
} catch (IOException e) {}
break;
}
}