Отправить строку из Java в Arduino (простой пример)

решено. Я поставил Thread.sleep(4000); после открытия порта в коде java и теперь он работает. Проблема заключалась в том, что 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);
                } catch (PortInUseException e) {System.out.println("err");}
                try {
                    outputStream = serialPort.getOutputStream();
                } catch (IOException e) {System.out.println("err1");}
                try {
                    serialPort.setSerialPortParams(9600,
                        SerialPort.DATABITS_8,
                        SerialPort.STOPBITS_1,
                        SerialPort.PARITY_NONE);
                } catch (UnsupportedCommOperationException e) {System.out.println("err2");}
                try {
                    outputStream.write(messageString.getBytes());
        System.out.println(messageString);

        outputStream.close();
        serialPort.close();

                } catch (IOException e) {System.out.println("err3");}
            }
        }
    }
}
}

и код в 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 здесь, и я не нахожу ничего, что помогает. Спасибо за помощь и извините, если это глупый вопрос, я новичок в этом

Im с помощью RXTXcomm.сосуд. Версия: RXTX-2.2-20081207

2 ответов


решено. Я поставил Thread.sleep(4000) после открытия порта в коде java и теперь он работает. Проблема заключалась в том, что 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("<-");
          }
     }
}

вы можете использовать библиотеку связи 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 (строка s) - записывает содержимое всей строки в последовательный файл сразу. записывается как строка в serial.
  3. void serialWrite (String s, int noofchars, int delay) - записывает содержимое строк в последовательный файл постепенно. Он записывает строку в инкрементных шагах с "noofchars" charaacters каждый раз, с паузой "задержки" миллисекунд между каждой записью. записывается как строка в serial. рекомендуется написать строку
  4. void serialWrite (char c) - записывает отдельный символ в серийный номер в типе данных char.
  5. void serialWrite (char c, int delay) - записывает отдельный символ в последовательный в типе данных char и приостанавливает поток на миллисекунды задержки после. рекомендуется писать char