从 Java 发送字符串到 Arduino(简单示例)

问题描述 投票:0回答:2

我是 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)
用于测试目的。我什么也没打印出来。

我正在使用 RXTXcomm.jar。版本:RXTX-2.2-20081207

java serial-port arduino
2个回答
4
投票

解决了。我在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
投票

您可以使用Java-Arduino通信库。可以在这里找到:https://sourceforge.net/projects/javaarduinolibrary/。 (请务必下载这两个罐子)然后您的代码将如下所示:

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”毫秒。以字符串形式写入序列。建议写成String
  4. void serialWrite(char c) - 将单个字符写入数据类型 char 中的序列。
  5. void serialWrite(char c, int delay) - 将单个字符写入数据类型 char 中的串行,并在延迟毫秒后暂停线程。建议写char
© www.soinside.com 2019 - 2024. All rights reserved.