Using the cRIO serial port in Java

I am looking for a Jave code snippet of how to configure the cRIO serial port and how to use it. Can it take over the System.Out functionality?

I am also looking for code to do formatted number to string conversion. Is there any native Java class? I need something simple. I do not need all of the Swing overhead.

I am planning on sending data out the cRIO serial port into a PC running HyperTerminal to make an elaborate disgnostic screen. I will send it ANSI escape sequences to control the cursor. I’ve done this in C and it is a great tool for the team to maintain the robot.

Daniel

I’m just a bit confused on what you mean by the serial port…
I thought the serial port from the module was to connect to the digital sidecar…

If you switch the CONSOLE OUT DIP switch off, the serial port will not be controlled by the System.out. You can then use the SerialPort class in WPILib to access the port.

Have you considered using a TCP connection to the PC instead?

-Joe

The serial port on the cRIO is the 9-pin D connector.

I prefer serial RS232 communications because it is simple. No setting of IP address, just plug and go. I’ve used this in the past and liked it.

I am asking for an example of using the SerialPort class that has actually worked. Specifically the constructor with try-catch logic in Java.

package com.shadowh511.mayor.util;

import edu.wpi.first.wpilibj.SerialPort;

/**
 *
 * @author Team 2412
 */
public class Arduino {
    /*
     * Hopefully, i will be able to have an arduino be hooked up to the robot
     * and communicate with the serial port.  I can use this to do many things,
     * such as maintain a LCD screen and display data on it to help the electrical
     * and mechanical teams figure out what went wrong.
     *
     * In all realism, it will most likely just be a fun cool thing for me to
     * play with :D
     */
    private SerialPort serial;

    public Arduino() {
        try {
            serial = new SerialPort(115200);
            this.serial.disableTermination();
            this.serial.print("h");
            System.out.println("Arduino Starting, waiting 0.5 seconds to get data");
            String e = this.getData();
            edu.wpi.first.wpilibj.Timer.delay(0.125);

            if(e.equals("h")) {
                System.out.println("Arduino communications locked in");
            }
        }
        catch (Exception e) {
            System.out.println("something went wrong, " + e.getMessage());
        }
    }

    public String getData() {
        try {
            return this.serial.readString();
        } catch (Exception e) {
            System.out.println("something went wrong, " + e.getMessage());
            return null;
        }
    }

    public boolean sendData(byte] buffer) throws Exception {
        try {
            int count = buffer.length;
            this.serial.write(buffer, count);
            return true;
        } catch (Exception e) {
            System.out.println("something went wrong, " + e.getMessage());
            return false;
        }
    }
    
    public boolean printf(String data) {
        try {
            this.serial.print(data);
            return true;
        } catch (Exception e) {
            System.out.println("something went wrong, " + e.getMessage());
            return false;
        }
    }

    public String requestData() {
        try {
            this.serial.print("r");
            return this.serial.readString();
        } catch (Exception e) {
            System.out.println("something went wrong, " + e.getMessage());
            return null;
        }
    }

    public int requestData(String request) {
        try {
            this.serial.print(request);
            return NumberUtils.stringToInt(this.getData());
        } catch (Exception e) {
            System.out.println("something went wrong, " + e.getMessage());
            return 0;
        }
    }
}

Does this work regardless of the CONSOLE OUT switch position on the cRIO?

I do not want console data mixed in with my diagnostic data, so I prefer the switch in the OFF position. Can I still send data to the Serial port?

I would test that if i were you, I don’t know

Why does netbeans not find the valueOf() function?

Is there a special class to load?

    long l;
    String s;
    s = valueOf(l);

Because you need to use:

long l;
String s;
s = String.valueOf(l);