【问题标题】:Reading bytes from inputstream through serial port in java通过java中的串口从输入流中读取字节
【发布时间】:2015-09-23 06:59:46
【问题描述】:

我有一个要通过串行端口发送的字节流。发送完所有字节后,我应该再次通过输入流接收字节流。

输出字节数组

byte[] command={(byte) 0xAA,0x55,0x05,0x00,0x55,(byte) 0xAA};

预期响应

**Serial command received
Admin Mode - IR Learn
In IR Learner Mode
Press IR Key...**

实际反应

**Serial command received
Admin Mode - IR Learn
In IR e - IR**

输入流

public void serialEvent(SerialPortEvent event) {
    try {

        Thread.sleep(100);

    } catch (InterruptedException e2) {
        e2.printStackTrace();
    }
    StringBuilder sb = new StringBuilder();

    try {
        int length = inputStream.available();
        readBuffer = new byte[length];

        Thread.sleep(110);


        while (inputStream.available() > 0) {
            int numBytes = inputStream.read(readBuffer);

            for (byte b : readBuffer) {

                sb.append(new String(new byte[]{b}));
            }
        }
        System.out.println(sb.toString());

        JOptionPane.showMessageDialog(contentPane, "Learned code : " + sb.toString(), "Code", JOptionPane.INFORMATION_MESSAGE);

    } catch (IOException e4) {
        e4.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    readBuffer = null;
}

输出流

for (int i = 0; i < command.length; i++) {
    outputStream.write(command, 0, command.length);
    outputStream.flush();
}

如何在不重复和JOptionPane的情况下获取值?

请帮忙

【问题讨论】:

    标签: java


    【解决方案1】:
    1. 摆脱所有的睡眠。
    2. 您将垃圾添加到StringBuffer. 更改此:

      while (inputStream.available() > 0) 
      {
          int numBytes = inputStream.read(readBuffer);
          for (byte b:readBuffer)
          {
              sb.append(new String(new byte[] {b}));                                               
          }
      }
      

      到这里:

      while (inputStream.available() > 0) 
      {
          int numBytes = inputStream.read(readBuffer);
          if (numBytes < 0)
              break;
          sb.append(new String(readBuffer, 0, numBytes));
      }
      
    3. 在输出端,您要多次编写每个命令。改变这个:

      for(int i=0;i<command.length;i++)
      {
          outputStream.write(command,0,command.length);
          outputStream.flush();
      }
      

      到这里:

      outputStream.write(command,0,command.length);
      outputStream.flush();
      

    【讨论】:

    • 对于输入流,我只得到 serial 的值,而不是完整的值
    • 我怎样才能得到完整的价值
    • 什么序列?谁在发送那个?我怀疑您在这里发送的内容不正确。
    • 我发送字节为 byte[] command={(byte) 0xAA,0x55,0x05,0x00,0x55,(byte) 0xAA};。发送完所有这些字节后,我将必须通过串行端口收到一条消息收到的串行命令管理模式 - IR 学习在 IR 学习模式下按 IR 键...。但我只收到收到的串行命令管理模式 - IR Learn In IR e - IR。如何接收预期的消息
    • 您可能无法在一次活动中全部了解。也许它分成两部分到达?还是更多?
    猜你喜欢
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    相关资源
    最近更新 更多