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

时间:2014-08-26 09:35:20

标签: java serial-port arduino

  

它解决了。在java代码中打开端口后我放了一个Thread.sleep(4000);,现在它可以工作了。问题是每次打开端口时都会重置arduino。当我发送数据时,arduino还没准备好听。

我是arduino和Java的新手,但我制作的程序非常简单,我不明白为什么不能正常工作。

我将一个String发送到与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

2 个答案:

答案 0 :(得分:3)

它解决了。在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("<-");
          }
     }
}

答案 1 :(得分: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) - 逐渐将字符串的内容写入序列。它使用&#39; noOfChars&#39;以增量步骤写入字符串。每次都是charaacters,暂停&#39;延迟&#39;每次写入之间的毫秒数。写为字符串到串行。建议写String
  4. void serialWrite(char c) - 将单个char写入数据类型为char的串行。
  5. void serialWrite(char c,int delay) - 将单个字符串写入数据类型为char的串行中,并暂停该线程的延迟毫秒数。建议写char