Java串口无法改变Raspberry Pi上的速度

时间:2017-05-06 09:51:14

标签: java serial-port raspberry-pi data-transfer

我正在开发一个项目,通过RS485串行连接在两个Raspberry Pi之间发送数据。为此,我编写了一个Java程序来发送数据。 设置正常,但我无法在Java prog中改变数据传输的速度。我使用的测试文件包含25kb的随机数据和两个Raspberry Pi Model 1B。作为一个库我使用RXTX Java库。

我已更改/boot/config.txt/boot/cmdline.txt中的设置,因此我可以使用串口并更改速度。

要测试硬件是否可以执行此操作,我使用简单的控制台命令发送一些数据。一个Raspi发送:

cat 25kTestfile.txt > /dev/ttyAMA0

另一个收到:

cat /dev/ttyAMA0 > 25kTestfile.txt

我用sudo stty改变了速度。 使用此命令行设置,我可以发送高达1Mbs的数据并更改我喜欢的速度。

在我的Java程序中,速度不会改变。无论我将串口设置为115200还是1000000,它发送的速度都保持不变。使用我的程序,发送25k需要不到3秒,控制台0.3秒。

Java程序包含两个文件。我已经在下面列出了该计划中最重要的部分。设置串口连接的一个文件就在这里。

import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class SerialConnect {

  private SerialPort serialPort = null;
  private InputStream in = null;
  private OutputStream out = null;
  private CommPort commPort = null;
  private CommPortIdentifier portIdentifier = null;

  void connect( String portName ) throws Exception {
    portIdentifier = CommPortIdentifier
        .getPortIdentifier( portName );
    if( portIdentifier.isCurrentlyOwned() ) {
      System.out.println( "Error: Port is currently in use" );
    } else {
      int timeout = 2000;
      commPort = portIdentifier.open( this.getClass().getName(), timeout );

      if( commPort instanceof SerialPort ) {
        serialPort = ( SerialPort )commPort;
        serialPort.setSerialPortParams( 1000000,
                                        SerialPort.DATABITS_8,
                                        SerialPort.STOPBITS_1,
                                        SerialPort.PARITY_NONE );
        serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);

        in = serialPort.getInputStream();
        out = serialPort.getOutputStream();

      } else {
        System.out.println( "Error: Only serial ports are handled by this example." );
      }
    }
  }

  [...]

  public void write(byte[] input) {
      try {
        for(int i = 0; i < input.length; i++) {
          this.out.write( input[i] );
        }
        this.out.flush();
      } catch( IOException e ) {
        e.printStackTrace();
      }
  }

  public void write(byte input) {
      try {
         this.out.write(input);
      } catch( IOException e ) {
        e.printStackTrace();
      }
  }


  [...]

  public SerialConnect() {}

  public SerialConnect(String portName) {
    try{
      connect(portName);
    }
    catch (Exception e) {
      System.out.println("Error Failed to connect port.\n");
    }
  }
}

使用串行连接的另一个是:

File outFile = new File("./25kTestfile.txt");
FileInputStream in = new FileInputStream(outFile);
byte[] c = new byte[(int)outFile.length()];
in.read(c);
SerialConnect serialConnection = new SerialConnect("/dev/ttyAMA0"); 
if(serialConnection == null) {
    System.out.println("Could not open Serial port.\n");
    return;
}
serialConnection.write(c);

我的问题是:为什么速度不会改变?我需要设置其他一些东西吗?是否有可能Java在Raspi上如此慢,以至于发送速度不能更快?

1 个答案:

答案 0 :(得分:0)

我发现了这个问题。 用于发送字节数组的写入函数是在循环中逐字节地将数据写入OutputStream。这显然效率很低。 我把write函数改为现在看起来像这样:

public void write(byte[] input) {
      try {
        this.out.write( input );  // no loop
        this.out.flush();
      } catch( IOException e ) {
        e.printStackTrace();
      }
  }

这使得发送过程快了大约10倍。

所以问题不在于连接速度没有变化,而是功能不够快,无法向流提供足够的数据。