维护Arduino与Java程序之间的通信

我在学校得到一个项目,该项目由可通过WiFi控制的遥控车组成。它可以正常工作几秒钟,但随后它会停止连接并尝试重新连接。问题是,如果我制造的汽车依赖于这种不稳定的连接,可能会导致事故。本身或一个人。

也许我做错了什么?我的问题是,我如何始终保持该连接处于活动状态?到目前为止,这是我的程序:

Arduino客户端:

#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服务器:

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

回答:

我解决了它,做到了这一点,以便Arduino每15秒将数据发送到Java程序。只需要在Arduino程序上写几行即可:

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 = "";

}

}

}

}

void sendCharacter(char toSend){

if(client){

client.println(toSend){

lastSendt = millis();

}else{

Serial.println("Could not send character!");

}

}

以上是 维护Arduino与Java程序之间的通信 的全部内容, 来源链接: utcz.com/qa/418918.html

回到顶部