arduino 与java通信_维护Arduino和Java程序之间的通信

博主学校项目中的遥控车通过WiFi控制,连接不稳定,易停止连接并重新连接,可能导致事故。博主询问如何保持连接活动状态,并给出了Arduino客户端和Java服务器的程序代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我在学校里有一个项目,包括一辆可以通过WiFi控制的遥控车.它工作正常几秒钟,但它只是停止连接并尝试再次重新连接.事实是,如果我正在制造依赖于不稳定连接的汽车,它可能会导致事故.无论是对自己还是对个人.

也许我做错了什么?我的问题是,我如何始终保持该连接的活动状态?

到目前为止,这是我的程序:

Arduino客户:

#include

#include

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值