Arduino может читать байты из консоли, но не из Java - PullRequest
0 голосов
/ 28 апреля 2019

Я хочу получить несколько байтов на Arduino Uno из Java-программы. Arduino обрабатывает данные, как только они получены, и, таким образом, мне не нужно их хранить, я использую буфер Serial RX в качестве временного хранилища, пока я фактически не читаю байты. После полной реализации около 150 байтов будет отправляться каждый раз, но я изменил размер буфера, чтобы позаботиться об этом. Я использую jSerialComm в качестве моей последовательной библиотеки для Java

Я поместил немного кода Arduino и Java ниже. Код arduino отлично работает, когда я посылаю байты с последовательного монитора IDE, подсвечивая светодиод, как и предполагалось. Но как только я пытаюсь отправить байты с кодом java, светодиод RX на борту мигает, но желтый светодиод никогда не загорается, а ExecuteMove () не срабатывает. Я пытался установить Thread.sleep (), прежде чем пытаться закрыть порт, но это не помогает.

Arduino

int GREEN = 4;
int BLUE = 3;
int YELLOW = 2;

void setup() {
  pinMode(GREEN, OUTPUT);
  pinMode(BLUE, OUTPUT);
  pinMode(YELLOW, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  byte rb = Serial.read();
  if(rb != 255){ //Documentation says it sould be -1, but I'v tested it and 
                   it's 255
    digitalWrite(YELLOW, HIGH);
    ExecuteMove(rb);
    delay(500);
    digitalWrite(YELLOW, LOW);
  }
}

void ExecuteMove(byte _move){ 
  Lights up the green LED if _move == 65, blue if 66 (Works perfectly)  
}

Java

public static void main(String[] args) throws IOException, 
                                              InterruptedException{

    SerialPort sp = SerialPort.getCommPort("COM3");
    sp.setComPortParameters(9600, 8, 1, 0);
    sp.setComPortTimeouts(SerialPort.TIMEOUT_WRITE_BLOCKING, 0, 0);

    if(sp.openPort()) {
        System.out.println("Port is open");
    }else {
        System.out.println("Port failed to open");
        return;
    }

    byte[] message = {65, 66, 65};
    for(int i = 0; i < message.length; i++) {
        sp.getOutputStream().write(message[i]); //Sends the message
        sp.getOutputStream().flush();
    }

    if(sp.closePort()) { 
        System.out.println("Port is closed"); 
    }else { 
        System.out.println("Failed to close port"); 
        return; 
    } 
}  

Как я уже говорил, один код arduino отлично работает с монитором, но когда я использую код Java для отправки байтов, загорается только светодиод RX, но ни один из "моих" светодиодов не работает

1 Ответ

1 голос
/ 12 мая 2019

Для всех, кто спотыкается об этом посте и считает, что у него похожая проблема, это потому, что Windows отправляет сигнал сброса в arduino при открытии порта.Поскольку данные отправляются сразу после этого, Arduino удаляет их из буфера во время сброса и никогда не может их прочитать.Есть два основных способа исправить это, сначала добавив Thread.sleep(5000); между открытием порта и отправкой данных.Вы также можете добавить конденсатор 47 мкФ между контактами RESET и GND.

Источник: https://arduino.stackexchange.com/questions/22267/java-jssc-arduino-windows https://forum.arduino.cc/index.php?topic=96422.0

Надеюсь, что это может помочь любому

...