读取端口数据通信(SerialEventListener)-Java

读取端口数据通信(SerialEventListener)-Java,java,Java,好吗?我正在尝试将C代码转换为Java,但遇到了一些问题 我正在读一个串口 Global private InputStream inputStream; private OutputStream outputStream; 要发送数据,就要正确,问题是读取数据的时间 在C#中,我有一个接收方法: public void recepcaoResposta(int tam, byte[] frameHex) { byte[] l_frameHex = new byte[2000];

好吗?我正在尝试将C代码转换为Java,但遇到了一些问题

我正在读一个串口

Global
private InputStream inputStream;
private OutputStream outputStream;

要发送数据,就要正确,问题是读取数据的时间

在C#中,我有一个接收方法:

public void recepcaoResposta(int tam, byte[] frameHex)
{
    byte[] l_frameHex = new byte[2000];
    byte[] frameEvt = new byte[16];
    string linha, linhaTipo;

    // !! Copia vetor-parâmetro para vetor-local (evita exception nos "if's"
    //caso apenas 1 byte recebido) !!
    Buffer.BlockCopy(frameHex, 0, l_frameHex, 0, tam);
    .....
}
转换为Java的过程如下所示:

public void recepcaoResposta(int tam, byte[] frameHex) {
    byte[] l_frameHex = new byte[2000];
    byte[] frameEvt = new byte[16];
    String linha, linhaTipo;

    // !! Copia vetor-parâmetro para vetor-local (evita exception nos "if's"
    //caso apenas 1 byte recebido) !!
    System.arraycopy(frameHex, 0, l_frameHex, 0, tam);
    ...
}
到目前为止,问题是获取tam的时间,即数组的大小。在java中,我返回的大小是8,无论我做什么,都是8

我甚至尝试将“随机”数字大小的ifs改为8。但很明显我有错误

@Override
public void serialEvent(SerialPortEvent event) {
    switch (event.getEventType()) {
        case SerialPortEvent.DATA_AVAILABLE:
            try {
            while (inputStream.available() > 0) {
//                    int t = inputStream.read();
                int t = serialPort.getDataBits();
                byte[] f = new byte[t];
                inputStream.read(f, 0, t);  // Frame de bytes
                recepcaoResposta(t, f);
            }

        } catch (IOException e) {
            System.out.println("IO Exception in SerialEvent()" + e);
        }
        break;
    }
}
但如前所述,我只有大小为8的返回值,在上面的代码中是:

int t = serialPort.getDataBits();
结果基本上是这样的:

TAM:8
l_frameHex[1]12
TAM:8
l_frameHex[1]23

嗯,经过多次尝试,我得到了它,它工作得非常好:

public static InputStream inputStream;
public static OutputStream outputStream;

@Override
public void serialEvent(SerialPortEvent evt) {
    switch (evt.getEventType()) {
        case SerialPortEvent.BI:
        //Quebra interupção.
        case SerialPortEvent.OE:
        //Erro de saturação.
        case SerialPortEvent.FE:
        //Erro de enquadramento.
        case SerialPortEvent.PE:
        //Erro de pariedade.
        case SerialPortEvent.CD:
        //Detecção de portadora.
        case SerialPortEvent.CTS:
        //Limpa para enviar.
        case SerialPortEvent.DSR:
        //Conjunto de dados prontos.
        case SerialPortEvent.RI:
        //Caminho indicado.
        case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
            /*Buffer de saída está vazio. O evento será gerado depois de uma gravação for concluída,
             quando o buffer do sistema torna-se vazia novamente..."
             */
            break;
        case SerialPortEvent.DATA_AVAILABLE:
            /*Dados disponíveis na porta serial. "
             + "Este evento será gerada uma vez quando dados novos chegam na porta de série. "
             + "Mesmo se o usuário não ler os dados, "
             + "não será gerado novamente até a próxima vez que novos dados chegam");
             */
            try {
            TimeUnit.MILLISECONDS.sleep(500); // 
        } catch (InterruptedException e) {
        }
        byte[] readBuffer = new byte[1024];
        try {
            int numBytes = 0;
            while (inputStream.available() > 0) {
                numBytes = inputStream.read(readBuffer);
            }
            String result = new String(readBuffer);
            result = result.substring(0, numBytes);
            System.out.println(result + "\n");
        } catch (IOException e) {
        }

        break;
    }
}

getDataBits()
返回为串行端口配置的位数(不是字节),该值可以是5、6、7或8。它与当前可以从InputStream读取的字节数无关。是的,在我意识到之前看了一会儿<代码>//byte[]readBuffer=新字节[2000];//int t=inputStream.read(readBuffer);int t=inputStream.available()我这样测试它,但它不断返回随机和错误的值<代码>运行:1 8 1 4 1 3 5
public static InputStream inputStream;
public static OutputStream outputStream;

@Override
public void serialEvent(SerialPortEvent evt) {
    switch (evt.getEventType()) {
        case SerialPortEvent.BI:
        //Quebra interupção.
        case SerialPortEvent.OE:
        //Erro de saturação.
        case SerialPortEvent.FE:
        //Erro de enquadramento.
        case SerialPortEvent.PE:
        //Erro de pariedade.
        case SerialPortEvent.CD:
        //Detecção de portadora.
        case SerialPortEvent.CTS:
        //Limpa para enviar.
        case SerialPortEvent.DSR:
        //Conjunto de dados prontos.
        case SerialPortEvent.RI:
        //Caminho indicado.
        case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
            /*Buffer de saída está vazio. O evento será gerado depois de uma gravação for concluída,
             quando o buffer do sistema torna-se vazia novamente..."
             */
            break;
        case SerialPortEvent.DATA_AVAILABLE:
            /*Dados disponíveis na porta serial. "
             + "Este evento será gerada uma vez quando dados novos chegam na porta de série. "
             + "Mesmo se o usuário não ler os dados, "
             + "não será gerado novamente até a próxima vez que novos dados chegam");
             */
            try {
            TimeUnit.MILLISECONDS.sleep(500); // 
        } catch (InterruptedException e) {
        }
        byte[] readBuffer = new byte[1024];
        try {
            int numBytes = 0;
            while (inputStream.available() > 0) {
                numBytes = inputStream.read(readBuffer);
            }
            String result = new String(readBuffer);
            result = result.substring(0, numBytes);
            System.out.println(result + "\n");
        } catch (IOException e) {
        }

        break;
    }
}