如何将命令发送到串口(JAVA + RXTX)

时间:2013-10-30 12:50:38

标签: java serial-port communication rxtx

将数据输入发送到体重平衡时出现问题。我需要发送ESC P CR LF命令。我使用RXTX lib。我不知道为什么它不起作用。以下是代码。

public static class SerialWriter implements Runnable 
{
    OutputStream out;

    public SerialWriter ( OutputStream out )
    {
        this.out = out;
    }

    public void run ()
    {
        try
        {                

            while ( true )
            {

               this.out.write(new byte[]{0x1B, 0x50, 0x0D, 0x0A});

                Thread.sleep(1000);

            }                
        }
        catch ( IOException | InterruptedException e )
        {
            e.printStackTrace();
        }            
    }
}

我尝试了flush但没有发生任何事情。 我在下面附上完整(修改)的代码。

package model;

import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;

import java.io.FileDescriptor;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class FirstSteps
{
public FirstSteps()
{
    super();
}

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

        if ( commPort instanceof SerialPort )
        {
            System.out.println("Connect 2/2");
            SerialPort serialPort = (SerialPort) commPort;
            System.out.println("BaudRate: " + serialPort.getBaudRate());
            System.out.println("DataBIts: " + serialPort.getDataBits());
            System.out.println("StopBits: " + serialPort.getStopBits());
            System.out.println("Parity: " + serialPort.getParity());
            System.out.println("FlowControl: " + serialPort.getFlowControlMode());
            serialPort.setSerialPortParams(4800,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_ODD);
            serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN);
            System.out.println("BaudRate: " + serialPort.getBaudRate());
            System.out.println("DataBIts: " + serialPort.getDataBits());
            System.out.println("StopBits: " + serialPort.getStopBits());
            System.out.println("Parity: " + serialPort.getParity());
            System.out.println("FlowControl: " + serialPort.getFlowControlMode());
            InputStream in = serialPort.getInputStream();
            OutputStream out = serialPort.getOutputStream();

            (new Thread(new SerialReader(in))).start();
            (new Thread(new SerialWriter(out))).start();

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

/** */
public static class SerialReader implements Runnable 
{
    InputStream in;

    public SerialReader ( InputStream in )
    {
        this.in = in;
    }

    public void run ()
    {
        byte[] buffer = new byte[1024];
        int len = -1;
        try
        {
            while ( ( len = this.in.read(buffer)) > -1 )
            {
                //System.out.println("Received a signal.");
                System.out.print(new String(buffer,0,len));
            }
        }
        catch ( IOException e )
        {
            e.printStackTrace();
        }            
    }
}

/** */
public static class SerialWriter implements Runnable 
{
    OutputStream out;

    public SerialWriter ( OutputStream out )
    {
        this.out = out;
    }

    public void run ()
    {
        try
        {                

            byte[] array = {0x1B, 0x50, 0x0D, 0x0A};
            while ( true )
            {
               this.out.write(new byte[]{0x1B, 0x50, 0x0D, 0x0A});
               this.out.flush();
               Thread.sleep(1000);  
            }                
        }
        catch ( IOException | InterruptedException e )
        {
            e.printStackTrace();
        }            
    }
}

public static void main ( String[] args )
{
    try
    {
        (new FirstSteps()).connect("COM7");
    }
    catch ( Exception e )
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}

2 个答案:

答案 0 :(得分:0)

基于提供的代码,我可以给出的唯一建议是在将数据放入其中后尝试刷新流(out.flush())。

除此之外 - 我需要查看获取输出流的代码。

答案 1 :(得分:0)

添加以下行:

serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);