Кажется, что javax.comm отправляет только одно сообщение - PullRequest
2 голосов
/ 25 июля 2011

Я пытаюсь установить связь между моим компьютером и печатной платой через последовательный порт, используя 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;
    }
}
...