简体   繁体   English

Arduino - 处理双向通信无法通过串行接收数据

[英]Arduino - Processing bidirectional communication can't receive data via serial

I'm trying to communicate arduino with java using jssc.我正在尝试使用 jssc 将 arduino 与 java 通信。 Just for testing I'm trying to receive the data on Arduino and sending back to PC, pretty straight forward.只是为了测试,我正在尝试接收 Arduino 上的数据并将其发送回 PC,非常简单。 The problem is, board seems to not receive it.问题是,董事会似乎没有收到它。 When a code for arduino to just send, works fine, but it just can't receive any data.当 arduino 的代码仅发送时,工作正常,但它无法接收任何数据。 I first thought the problem was jssc, so I change my application to Processing, same problem.我首先认为问题是 jssc,所以我将我的应用程序更改为处理,同样的问题。 I even try to change the board, no diference, the board is fine and it can communicate normally with Arduino Serial Monitor.我什至尝试更换板子,没有区别,板子很好,它可以与 Arduino 串行监视器正常通信。 So my problem must be the Java and Processing code.所以我的问题一定是 Java 和处理代码。 I know its a very simple problem, and i'm kind of ashamed for posting this, must be a very simple problem that past me.我知道这是一个非常简单的问题,我为发布此问题感到羞耻,这一定是一个非常简单的问题。

One more thing, no errors at all is shown还有一件事,根本没有显示错误

Java code: Java代码:

public class ArduinoTest{
    public static void main(String[] args) throws SerialPortException, InterruptedException {
        SerialPort serialPort = new SerialPort("COM6");
        serialPort.openPort();
        serialPort.setParams(SerialPort.BAUDRATE_9600,
                SerialPort.DATABITS_8,
                SerialPort.STOPBITS_1,
                SerialPort.PARITY_NONE);
        int i;
        serialPort.writeBytes("a".getBytes());
        while(true){
            a=serialPort.readBytes(1);
            i = a[0] & 0xff;
            System.out.println(i);
        }
    }
}

Processing code:处理代码:

import processing.serial.*;

Serial port;
int r;
void setup(){
  port = new Serial(this, "COM6", 9600);
  port.write(1);
}
void draw(){
  if(port.available()>0){
    r = port.read();
    println(r);
  }
}

Arduino code: Arduino 代码:

int r1=0;

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

void loop() {
  if(Serial.available() > 0){
    r1 = Serial.read();
    Serial.write(r1);
  }
}

Here is working communication code for Arduino:这是 Arduino 的工作通信代码:

const int led_pin = 13;    // Initializing the LED pin internal led
String char_output = "";   // Declaring a variable for output


void setup ( ) {
  pinMode(led_pin, OUTPUT); // Declaring the LED pin as output pin
  Serial.begin(9600);       // Starting the serial communication at 9600 baud rate

}

void loop ( ) {


  if (Serial.available ( ) > 0) {   // Checking if the Processing IDE has send a value or not

    char state = Serial.read ( );    // Reading the data received and saving in the state variable

    if (state == '1')  {          // If received data is '1', then turn on LED
      digitalWrite (led_pin, HIGH);
      char_output = "Led on";
    }

    if (state == '0') {     // If received data is '0', then turn off led
      digitalWrite (led_pin, LOW);
      char_output = "Led off";
    }
  }

  delay(50);
  Serial.println (char_output);     // Sending the output to Processing IDE
} 

here is the processing part:这是处理部分:

import processing.serial.*;    // Importing the serial library to communicate with the Arduino

Serial myPort;      // Initializing a vairable named 'myPort' for serial communication
float background_color ;   // Variable for changing the background color

void setup ( ) {
  size (500,  500);     // Size of the serial window, you can increase or decrease as you want
  myPort  =  new Serial (this, "COM3",  9600); // Set the com port and the baud rate according to the Arduino IDE
  myPort.bufferUntil ( '\n' );   // Receiving the data from the Arduino IDE

}
void serialEvent  (Serial myPort) {
  background_color  =  float (myPort.readStringUntil ( '\n' ) ) ;  // Changing the background color according to received data
}

void draw ( ) {
  background ( 150, 50, background_color );   // Initial background color, when we will open the serial window
  if ( mousePressed  &&  ( mouseButton  ==  LEFT ) ) { // if the left mouse button is pressed
    myPort.write ( '1' ) ;       // send a '1' to the Arduino IDE
  }
  if  ( mousePressed  &&  ( mouseButton == RIGHT ) ) {  // if the right mouse button is pressed
    myPort.write ( '0' ) ;     // Send a '0' to the Arduino IDE
  }
}

Read the comments an see that reading from serial and printing to serial are apart阅读评论,看到从串行读取和打印到串行是分开的

Just solved the problem, my code wasn't work cause I was writing on port just after the command to open it, that way, the port was not open yet, solved the question with a Thread.sleep(1000);刚刚解决了这个问题,我的代码不起作用,因为我在命令打开它之后就在端口上写,那样,端口还没有打开,用 Thread.sleep(1000); 解决了这个问题; on Java code.在 Java 代码上。 I have to implement something to tell me when the port is open.我必须实现一些东西来告诉我端口何时打开。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM