web-dev-qa-db-ja.com

文字列をJavaからArduinoに送信(簡単な例)

解決しました。 Javaコードでポートを開いた後、Thread.sleep(4000);を入れて、動作するようになりました。問題は、ポートを開くたびにarduinoがリセットされることでした。送信していたときデータ、arduinoは聞く準備ができていませんでした。

私はarduinoとJavaに不慣れですが、プログラムを非常に単純にしたので、なぜ機能しないのかわかりません。

Arduino(COM5)に対応するシリアルポートに文字列を送信します。

import Java.io.*;
import Java.util.*;
import gnu.io.*;

public class SimpleWrite {

static Enumeration portList;
static CommPortIdentifier portId;
static String messageString = "color FF00FFEND";
static SerialPort serialPort;
static OutputStream outputStream;

public static void main(String[] args) {
    portList = CommPortIdentifier.getPortIdentifiers();


    while (portList.hasMoreElements()) {

        portId = (CommPortIdentifier) portList.nextElement();
        if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {

             if (portId.getName().equals("COM5")) {

                try {
                    serialPort = (SerialPort)
                    portId.open("SimpleWriteApp", 2000);

                    outputStream = serialPort.getOutputStream();

                    serialPort.setSerialPortParams(9600,
                        SerialPort.DATABITS_8,
                        SerialPort.STOPBITS_1,
                        SerialPort.PARITY_NONE);

                    outputStream.write(messageString.getBytes());
                    System.out.println(messageString);

                    outputStream.close();
                    serialPort.close();
                } 
                catch (IOException e) {System.out.println("err3");}
                catch (PortInUseException e) {System.out.println("err");}
                catch (IOException e) {System.out.println("err1");}
                catch (UnsupportedCommOperationException e) {System.out.println("err2");}
            }
        }
    }
}
}

そしてその文字列を取得するためのarduinoのコード:

char inputBuffer[10];   

void setup() {                
  Serial.begin(9600);  
}

void loop() {
    while (true) 
    {
      if (Serial.available() > 0) {
          Serial.readBytes(inputBuffer, Serial.available());
          delay(5000);
          Serial.print("I got this ->");
          Serial.print(inputBuffer);
          Serial.println("<-");
      }
    }
}

while(true)はテスト用です。何も印刷されず、どこに問題があるのか​​わかりません。私はarduinoとJavaここにあるすべての投稿を見てきましたが、役立つものは何も見つかりません。助けてくれてありがとう、そしてそれが愚かな質問なら申し訳ありません、これの初心者です

RXTXcomm.jarを使用しています。バージョン:RXTX-2.2-20081207

10
takluiper

解決しました。 Javaコードでポートを開いた後、Thread.sleep(4000)を入れて、動作するようになりました。問題は、ポートを開くたびにArduinoがリセットされるため、送信していましたArduinoが聞く準備ができていなかったときのデータ。

char inputBuffer[10];   

void setup()
{                
    Serial.begin(9600);  
}

void loop()
{
     while (true) 
     {
          if (Serial.available() > 0)
          {
              Serial.readBytes(inputBuffer, 10);
              delay(5000);
              Serial.print("I got this ->");
              Serial.print(inputBuffer);
              Serial.println("<-");
          }
     }
}
3
takluiper

Java-Arduino通信ライブラリを使用できます。ここで見つけることができます: https://sourceforge.net/projects/javaarduinolibrary/ 。 (必ず両方のjarファイルをダウンロードしてください)すると、コードは次のようになります。

import arduino.*;
class JavaArduinoComm {
        public static void main(String[] args) {
        Arduino obj = new Arduino('PortDescription', BAUD_RATE);
        obj.openConnection();
    }
}

次に、次のいずれかの方法を使用できます。

  1. String serialRead(int limit)-limitの値と同じ数の読み取り値を含む文字列を返します。読書におすすめ
  2. void serialWrite(String s)-文字列全体の内容を一度にシリアルに書き込みます。文字列としてシリアルに書き込まれます。
  3. void serialWrite(String s、int noOfChars、int delay)-文字列の内容をシリアルに徐々に書き込みます。毎回「noOfChars」文字を使用して文字列を増分ステップで書き込み、各書き込みの間に「delay」ミリ秒の一時停止を行います。文字列としてシリアルに書き込まれます。文字列を書くことをお勧めします
  4. void serialWrite(char c)-個々のcharをデータ型charのシリアルに書き込みます。
  5. void serialWrite(char c、int delay)-個々のcharをデータ型charのシリアルに書き込み、数ミリ秒後にスレッドを一時停止します。文字を書くことをお勧めします
3
Hirday Gupta