在移动设备上使用CommConnection进行串行通信

时间:2012-01-31 08:58:09

标签: java java-me serial-port midp at-command

移动设备上的串行程序存在两个问题:

    根据文档,
  1. InputStream.available()总是返回0。无法使用DataInputStream,因为数据可能是文件而不是字符串。如果我只是在InputStream上调用read(),那么如果另一侧的字节不存在,它将阻止IO操作。另外,我不知道输入数据的大小是多少。那么如何查找端口是否有数据以及可用数据的大小是多少?
  2. 我正在使用超级终端来测试串口,而移动设备只响应AT commands,就像ata和atd一样。因此,任何字符串如“hello”都会被忽略,我的应用程序无法看到它。这是真的吗?或者我错过了什么?如何才能将数据显示给我的应用?
  3. 有什么建议吗?代码片段可能?

1 个答案:

答案 0 :(得分:0)

您可以向SerialPort添加一个侦听器,只要该端口上有可用数据,就会收到通知。在这个回调中,in.available()也应该返回可以读取的字节数,但在read返回-1之前消耗字节可能更好。

final CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier("COM1");

final SerialPort com1 = (SerialPort)portId.open("Test", 1000);
final InputStream in = com1.getInputStream();

com1.notifyOnDataAvailable(true);
com1.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
com1.addEventListener(new SerialPortEventListener() {
    public void serialEvent(SerialPortEvent event) {
        if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
            try {
                byte[] buffer = new byte[4096];
                int len;
                while (-1 != (len = in.read(buffer))) {
                    // do something with buffer[0..len]
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
});