Arduino的维护和Java程序之间的通信 [英] Maintaining communication between Arduino and Java program

查看:1328
本文介绍了Arduino的维护和Java程序之间的通信的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经得到了学校的一个项目,它包含了被通过WiFi控制的遥控汽车。它的工作原理就好了几秒钟,但它只是停止了连接,并试图再次重新连接。事情是,如果我做的汽车,这依赖于不稳定的连接,可能会导致事故的发生。无论是给自己还是一个人。

I have gotten a project in school that consists of a RC car that gets controlled over WiFi. It works just fine for a few seconds, but then it just stops the connection and tries to reconnect again. Thing is that if i'm making a car that relies on that unstable connection, it can cause accidents. Either to itself or a person.

也许我做错了什么?我的问题是,如何保持该连接在任何时刻?
下面是我的计划至今:

Perhaps i'm doing something wrong? My question is, how do i keep that connection active at all times? Here is my program so far:

Arduino的客户:

Arduino Client:

#include <SPI.h>
#include <WiFi.h>

int status = WL_IDLE_STATUS;
char ssid[] = "mynet";
char pass[] = "password";

IPAddress remoteIp(192,168,80,165);
int port = 37899;

String message = "";

WiFiClient client;

void setup()
{
    // start the serial for debugging
    Serial.begin(9600);
    pinMode(9, OUTPUT);
    digitalWrite(9, LOW);

    //check if the wifi shield is present
    if(WiFi.status() == WL_NO_SHIELD){
        Serial.println("WiFi shield not present! Press reset to try again.");
        while(true); //stops the program
    }

    connectWiFi();
    printWifiStatus();
    connectClient(3);
}

void loop(){

    if(client){
        if(client.available()){

            char c = client.read();

            if(c != '\n'){
                message += c;
            }
            else{
                Serial.println("Received message: "+message);
                checkMessage();
                sendMessage(message);
                message = "";
            }
        }
    }
}

void printWifiStatus() {
    // print the SSID of the network you're attached to:
    Serial.print("SSID: ");
    Serial.println(WiFi.SSID());

    // print your WiFi shield's IP address:
    IPAddress ip = WiFi.localIP();
    Serial.print("IP Address: ");
    Serial.println(ip);
}

void connectWiFi(){

    if( status != WL_CONNECTED){
        while(status != WL_CONNECTED){

            Serial.print("Attempting connection to network...");

            status = WiFi.begin(ssid, pass);
            delay(3000);

            if(status == WL_CONNECTED){
                Serial.println(" SUCSESS");
            }
            else{
                Serial.println(" FAILED");
                delay(3000);
                connectWiFi();
            }
        }
    }   
}

void connectClient(int retries){

    //Attempt connection to server

    if(retries <= 0){
        Serial.println("FAILED");
        Serial.println("Connection to server failed.");
        while(true);
    }

    Serial.print("Attempting conenction to server... ");

    if(client.connect(remoteIp, port)){
        Serial.println("SUCSESS");
        sendMessage("Hello server!");
    }
    else if(retries > 0){
        Serial.println("FAILED");
        connectClient(retries - 1);
    }

}

void checkMessage(){

    if(message == "on"){
        digitalWrite(9, HIGH);
    }

    if(message == "off"){
        digitalWrite(9, LOW);
    }
}

void sendMessage(String toSend){

    if(client){
        client.println(toSend+'\n');
        client.flush();
        Serial.println("Sendt message: "+toSend);
    }
    else{
        Serial.println("Could not send message; Not connected.");
    }
}

Java服务器:

Java Server:

import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Car_Client extends JFrame {

    private JTextField userText;
    private JTextArea chatWindow;

    private static final int serverPort = 37899;

    private ServerSocket server;
    private Socket connection;
    private BufferedWriter output;
    private BufferedReader input;

    private String message = "";

    public Car_Client() {

        userText = new JTextField();
        userText.setEditable(false);
        userText.addActionListener(
                new ActionListener() {
                    public void actionPerformed(ActionEvent event) {
                        sendMessage(event.getActionCommand());
                        userText.setText("");
                    }
                }
        );
        add(userText, BorderLayout.NORTH);
        chatWindow = new JTextArea();
        add(new JScrollPane(chatWindow), BorderLayout.CENTER);
        setSize(400, 300);
        setVisible(true);

    }

    public void startRunning() {
        try {

            server = new ServerSocket(serverPort, 100);
            while (true) {
                try {
                    waitForConnection();
                    setupStreams();
                    whileConnected();
                } catch (EOFException eofException) {
                    showMessage("Client terminated connection");
                } catch (IOException ioException) {
                    showMessage("Could not connect...");
                } finally {
                    closeStreams();
                }
            }

        } catch (IOException ioException) {
            ioException.printStackTrace();
        }

    }

    private void waitForConnection() throws IOException {

        showMessage("Waiting for someone to connect...");
        connection = server.accept(); //once someone asks to connect, it accepts the connection to the socket this gets repeated fast
        showMessage("Now connected to " + connection.getInetAddress().getHostName()); //shows IP adress of client

    }

    private void setupStreams() throws IOException {

        showMessage("creating streams...");
        output = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream()));
        output.flush();
        input = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        showMessage("Streams are setup!");

    }

    private void whileConnected() throws IOException {

        ableToType(true); //makes the user able to type

        do {

            char x = (char) input.read();
            while (x != '\n') {
                message += x;
                x = (char) input.read();
            }
            showMessage(message);
            message = "";

        } while (!message.equals("END")); //if the user has not disconnected, by sending "END"

    }

    private void closeStreams() {

        ableToType(false);

        showMessage("Closing streams...");
        try {
            output.close();
            input.close();
            connection.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    private void sendMessage(String message) {
        try {
            output.write(message + '\n');
            output.flush();
            showMessage("Sent: " + message);
        } catch (IOException ex) {
            chatWindow.append("\nSomething messed up whilst sending messages...");
        }

    }

    private void showMessage(final String message) {
        SwingUtilities.invokeLater(
                new Runnable() {
                    public void run() {
                        chatWindow.append('\n' + message);
                    }
                }
        );

    }

    private void ableToType(final boolean tof) {
        SwingUtilities.invokeLater(
                new Runnable() {
                    public void run() {
                        userText.setEditable(tof);
                    }
                }
        );
    }

}

干杯!

-kad

Cheers!
-kad

推荐答案

我解决了它,我做到了,这样的Arduino的将数据发送到Java程序每15秒。所有的花是在Arduino的程序里的句子:

I solved it, i made it so that the Arduino sends data to the Java program every 15 seconds. All it took was some lines on the Arduino program:

变量:

long lastSendt;

循环功​​能:

void loop(){

    if(client){

        if(millis() >= (lastSendt + 15000)){
            sendCharacter('*')
        }

        if(client.available()){

            char c = client.read();

            if(c != '\n'){
                message += c;
            }
            else{
                Serial.println("Received message: "+message);
                checkMessage();
                sendMessage(message);
                message = "";
            }
        }
    }
}

sendCharacter功能:

void sendCharacter(char toSend){

    if(client){
        client.println(toSend){
        lastSendt = millis();
    }else{
        Serial.println("Could not send character!");
    }
}

这篇关于Arduino的维护和Java程序之间的通信的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆