0

私は古い学校の学校の鐘のためにプログラムを作成しており、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);

        }
    }
}

私が間違っていることを教えていただければ、非常に役に立ちます。ありがとう!

4

1 に答える 1

2

いくつかの問題。

  • Java コードは、Arduino 9600 ボーである 38400 を設定します。

  • getBytes() が ASCII を提供することは保証されていません。デフォルトのエンコーディングがすべての警告の対象となるものを返します。一般に、この方法を期待することはできず、エンコーディングの明示的な制御を常に優先する必要があります。これによってやけどを負った人は無限にいます。getBytes("UTF-8") を試してください

  • 番号の終わりを定義するターミネータがありません。「3000」が送られたと思うかもしれませんが、「3」が送られ、次に「0」、「0」、「0」と考えるべきです。Arduino 側では、Serial.available() の呼び出しは、このシーケンスのいつでも発生する可能性があります。そのため、「3」だけを受け取ったときにコードが parseInt() 行に到達する可能性があります。Arduino は、1 文字の送信時間よりもはるかに速く loop() を介して回転しています。1 秒あたり 9600 ビットで文字 N81 の 10 ビットでは、1 文字がワイヤ上を移動するのに 1 ミリ秒以上かかります。16 MHz クロックで、Arduino は loop() を何度もスピンします。ターミネータを含めるようにコマンド プロトコルを変更する必要があり、完全な数がある場合は parseInt() のみを使用する必要があります。

于 2013-08-05T07:23:32.280 に答える