当前位置: 首页 > 知识库问答 >
问题:

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

东方俊明
2023-03-14

好吗?我正试图将C#代码转换为Java,我遇到了一些问题…

我在读串口,

Global
private InputStream inputStream;
private OutputStream outputStream;
outputStream = serialPort.getOutputStream();
inputStream = serialPort.getInputStream();
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);
    .....
}
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);
    ...
}
@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

共有1个答案

锺宜
2023-03-14

好吧,经过多次尝试,我得到了它,它工作得很完美:

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;
    }
}
 类似资料:
  • 我有一个Velleman k8090中继板,我试图从中读取一些数据。我可以很好地写入电路板,但每当我输出读取的数据时,我都会得到奇怪的字符,比如菱形或倒置的问号。以下是我的部分代码: 为什么我会有这些奇怪的角色?文件规定它应该返回年份和星期。 编辑:经过一些搜索和故障排除,我现在非常确定它与Python代码或数据类型有关,而不是与硬件有关。这个论坛包含了一个C语言的例子,它从黑板上读取。我从黑板上

  • 问题内容: 我有一个Java程序,必须读取Arduino发送的信息。我从这里获取了Java代码。现在,我不太了解它是如何工作的,但是我尝试对其进行修改,并且得到了以下信息: 我创建一个对象串行COM口,我需要在主程序,然后我使用和当我需要它。 效果很好,Arduino获取数据并将其显示在LCD显示屏中。问题是。程序运行时,它会不断从串行端口读取数据(大约每40毫秒一次),但这并不意味着Arduin

  • 问题 你想通过串行端口读写数据,典型场景就是和一些硬件设备打交道(比如一个机器人或传感器)。 解决方案 尽管你可以通过使用Python内置的I/O模块来完成这个任务,但对于串行通信最好的选择是使用 pySerial包 。 这个包的使用非常简单,先安装pySerial,使用类似下面这样的代码就能很容易的打开一个串行端口: import serial ser = serial.Serial('/dev

  • 问题内容: 我需要编写一个风暴喷口以从端口读取数据。想知道在逻辑上是否可行。 考虑到这一点,我设计了一个简单的拓扑结构,该拓扑结构设计为只有一个喷嘴和一个螺栓。喷口将收集使用wget发送的HTTP请求,螺栓将显示请求-就是那样。 我的喷口结构如下: 我也实现了其余方法。 将其转换为拓扑并运行它时,发送第一个请求时出现错误: java.lang.RuntimeException:java.io.No

  • 我正在开发一个WPF应用程序,它将读取串行端口上的数据,对其进行解析,并将其显示在UI上。 我必须使用串行端口Buad速率-115200,数据位-8,停止位-1。 我在串行端口上每秒发送10000字节,将由我的WPF应用程序读取。 但是,在这里我面临的问题与用户界面。当我开始阅读COM端口我的UI冻结。它不允许任何人做任何事情。根据我的调查,这是由于数据的高速度。 我在不同的线程上读取com端口,

  • 我试图做一些非常简单的东西,按钮计数器,有一个按钮在我的HTML-php当我点击它我发送数据'按'到我的arduino和它使led闪烁,到目前为止,还不错,但然后我想发送信号,当我在arduino中按下按钮,我想让我的php读取字符串"点击次数: N"的串行端口,N是从arduio的推送计数。 这里的问题是,在arduino串行我可以看到他字符串,一切正常,但在PHP我做