JSerialComm没有在Mac上读取或关闭端口

时间:2017-01-18 00:29:12

标签: java macos

我有一个微控制器,我想接收并发送数据,所以我尝试使用UART端口来查看是否有可能。我为我的微控制器编写了一个快速程序,它将在LCD屏幕上显示char值(不是字符本身而是ASCII代码),当我按下一个按钮时它会发回76(代码为'L',因为那是所有这个项目都给了我)。然后我为我的Mac下载了CoolTerm(我正在使用Mac,因为这是我学校给我的而不是选择)并插入了this USB到我购买的UART电缆。下载驱动程序后,我启动了CoolTerm,选择了我的端口,并选择了我的波特率。我点击连接并开始按键。当我这样做时,我在我的LCD上得到了正确的相应ASCII值,当我按下微控制器上的按钮时,我的终端确实收到了一个'L'。一切都很完美。然后我下载了jserialcomm并制作了一个小程序,看看我是否可以读取微控制器中的值。当我启动程序时,它只会每隔一个字节读取一次,即使我按下按钮或按住它。它将读取的字节只是1.然后发生了另一个问题。似乎港口没有正确关闭。程序终止后,我尝试再次运行它,它会在尝试打开端口时遇到困难,之后再也不会执行任何代码。当我要终止程序时,它说它“无法终止”然后它,我认为是,强制退出程序。当我回到CoolTerm打开端口时,它会卡在连接和冻结上,我不得不强制退出。为了清楚起见,我使用的是cu。*作为FAQ状态,而不是tty。*

这是我正在使用的Java代码:

 //This is what I use to set up the the Port 
    //This gets all of the ports on the machine
    SerialPort[] q;
    q = SerialPort.getCommPorts();

    //This iterates through the ports and gives a description and the name of the port
    for(SerialPort a: q){
        System.out.println(a.getDescriptivePortName() + " : " + a.getSystemPortName());
    }

    //Allows user to select which port they want
    System.out.println("Which port do you want?");
    Scanner s = new Scanner(System.in);
    int portnumber = s.nextInt();
    s.close();

    //Creates a SerialPort object of the port the user selected and opens it
    SerialPort commPort = q[portnumber];
    System.out.println(commPort.getDescriptivePortName());

    if(commPort.openPort()){
        System.out.println("Port Opened");
    }else{
        System.out.println("Port Failed to Open");
    }

    commPort.setBaudRate(230400);


//This is the first method I tried
commPort.setComPortTimeouts(SerialPort.TIMEOUT_NONBLOCKING, 1000, 0);
    try{
        while(true){
            //Waits till there are bytes available 
            while(commPort.bytesAvailable() == 0){
                Thread.sleep(20);
            }

            //Creates a buffer to read the bytes
            byte[] readBuffer = new byte[commPort.bytesAvailable()];
            int numOfBytes = commPort.readBytes(readBuffer, readBuffer.length);
            //Prints out the number of bytes read and the bytes it read
            System.out.println("Read " + numOfBytes + " bytes. Message:");
            for(byte b: readBuffer){
                System.out.println("::::" + Integer.toBinaryString(b & 0xFF));
            }

        }
    }catch(Exception e){
        e.printStackTrace();

    }


The second method I did was using InputStreams which I would prefer not to use since I rather just read raw bytes in.

1 个答案:

答案 0 :(得分:1)

将您的超时编辑为:

commPort.setComPortTimeouts(SerialPort.TIMEOUT_NONBLOCKING, 0, 0);

或删除该行。在你的情况下,你不需要它。为什么奇怪的波特率?有时USB-to-RS232桥接器无法在每个波特率下工作。

9600波特适用于我。

希望这有帮助,

哈尼