Java未正确发送到串行端口

时间:2013-08-05 06:01:28

标签: java serial-port arduino

我正在为我的旧学校创建一个校园的校园,我正在使用java。目前在我的arduino上我有一个程序,当它从串口收到一个数字时,它会打开铃声,说它有多长。此程序在串行监视器中工作,但不在Java中。这些是我的2个程序:

import java.io.OutputStream;

import gnu.io.SerialPort;



public class Main {
    public static void main(String[] args) throws Exception {
        SerialPort sP = Arduino.connect("COM3");

        Thread.sleep(1500);

        OutputStream out = sP.getOutputStream();

        Thread.sleep(1500);

        out.write("3000".getBytes());
        out.flush();
        Thread.sleep(1500);
        out.close();
    }
}

我的Arduino联合计划;

import gnu.io.*;

public class Arduino {
    public static SerialPort connect(String portName) throws Exception {
        CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);

        if(portIdentifier.isCurrentlyOwned()) {
            System.out.println("ERROR!!! -- Port already in use!");
        }else{
            CommPort commPort = portIdentifier.open("XBell", 0);

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

                return serialPort;
            }else{
                System.out.println("wait wat");
            }
        }
        return null;
    }
}

这是Arduino代码:

int Relay = 13;
//The pin that the relay is attached to
int time;
//Creates temp variable

void setup() {
    //Initialize the Relay pin as an output:
    pinMode(Relay, OUTPUT);
    //Initialize the serial communication:
    Serial.begin(9600);
}

void loop() {
    while(true) {
        //Check if data has been sent from the computer:
        if (Serial.available()) {
            //Assign serial value to temp
            time = Serial.parseInt();
            //Output value to relay
            digitalWrite(Relay, HIGH);
            delay(time);
            digitalWrite(Relay, LOW);

        }
    }
}

如果你能告诉我我做错了什么会非常有帮助。谢谢!

1 个答案:

答案 0 :(得分:2)

一些问题。

  • Java代码集38400,即Arduino 9600波特。

  • 无法确保getBytes()为您提供ASCII。它将返回您的默认编码受到一系列警告的影响。通常,您不能指望这种方法,并且应该始终更喜欢显式控制编码。有无穷无尽的人被烧毁,这里是just one random reference。尝试getBytes(“UTF-8”)

  • 您没有定义号码结尾的终结符。你可能认为发送了“3000”,但你应该用“3”来表示,然后是“0”,然后是“0”,然后是“0”。在Arduino端,对Serial.available()的调用可以在此序列中的任何时候发生。因此,当只收到“3”时,代码可以到达parseInt()行。 Arduino旋转循环()比单个字符传输时间快得多。对于一个字符N81,每秒9600比特和10比特,对于1个字符在线上移动,这超过1毫秒。在16 MHz时钟,Arduino将多次旋转循环()。您需要更改命令协议以包含终结符,并且只有当您拥有完整数字时才需要更改parseInt()。