gpt4 book ai didi

java - 维护Arduino和Java程序之间的通信

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:06:07 27 4
gpt4 key购买 nike

我在学校得到了一个项目,其中包含一辆通过 WiFi 控制的遥控车。它在几秒钟内工作得很好,但随后它只是停止连接并尝试再次重新连接。问题是,如果我制造的汽车依赖于不稳定的连接,它可能会导致事故。对自己或对人。

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

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);
}
}
);
}

}

干杯!
-卡德

最佳答案

我解决了,我做到了让 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!");
}
}

关于java - 维护Arduino和Java程序之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21287087/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com