首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读取端口数据通信(SerialEventListener) - Java

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

Stack Overflow用户
提问于 2019-12-15 20:46:45
回答 1查看 52关注 0票数 0

好的?我正在尝试将C#代码转换成Java,…遇到了一些问题

我在试着读一个串口,

代码语言:javascript
复制
Global
private InputStream inputStream;
private OutputStream outputStream;

代码语言:javascript
复制
outputStream = serialPort.getOutputStream();
inputStream = serialPort.getInputStream();

发送数据,是正确的,问题是时间去读它。

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

代码语言:javascript
复制
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如下所示:

代码语言:javascript
复制
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。

我甚至试图把“随机”数字大小改为8。但很明显我有错误.

代码语言:javascript
复制
@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大小的返回,在上面的代码中是:

代码语言:javascript
复制
int t = serialPort.getDataBits();

结果基本上是这样的:

代码语言:javascript
复制
TAM:8
l_frameHex[1]12
TAM:8
l_frameHex[1]23
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-20 05:02:15

嗯,我试了很多次,结果还是很好的:

代码语言:javascript
复制
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;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59347927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档