Java程序借助W5500与单片机通信

JAVA程序单片机通信

  已经学习了W5500的应用,总是借助着网络调试助手来收发信息,这样就有点鸡肋了,为了使应用跟广泛,于是有了使用Java来编写程序来接收从单片机发来的消息。我是怎么做的呢,那么请听我慢慢道来:

接收从单片机发来的信息:

与普通的Java socket通信一样,也没有什么新奇的东西,不过我是在单片机上嵌入的服务器程序,这样我只需要用Java程序写一个客户端即可。客户端的主要作用就是接收从单片机定时发过来的消息。下面请看我的接收程序:
import java.net.*;  
import java.io.*;  
   
public class Client {  
   
    private Socket client;  
   
    public Client() {  
        try {  
            System.out.println("正在连接服务器......");  
            client = new Socket("192.168.1.199", 5000);//定义服务器的IP和端口号,用于绑定socket
            BufferedReader input = new BufferedReader(new InputStreamReader(System.in));  
            BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));  
            PrintStream out = new PrintStream(client.getOutputStream());;  
            boolean flag = true;  
   
            System.out.println("连接成功!!"); 
            while (flag) {  
                if (isConnected()) {  
                	if(in.readLine()!="?"){	//避免输出乱码
 
	                    System.out.println("主机:" + in.readLine());
                	}
                } else {  
                    System.out.println("发生失败!!");  
                    System.out.println("与服务器断开连接!!");  
                    client.close();  
                    break;  
                }  
            }  
        } catch (Exception e) {  
            System.out.println(e.getMessage());  
        }  
    }  
   
    //判断服务器是否断开的方法,  
    //通过OutputStream发送一段测试数据,如果发送失败就表示远端已经断开连接  
    //但会与正常的传送干扰,所以用sendUrgenData  
    public boolean isConnected() {  
        try {  
            client.sendUrgentData(0xFF);  
            return true;  
        } catch (Exception e) {  
            e.printStackTrace();  
            return false;  
        }  
    }  
   
    public static void main(String[] args) {  
        new Client();  
    }  
}  

下面请看我的运行结果:
这是从单片机接收到的信息。比较尴尬的是只是能接收的话并不是我的目的,既然是通信,那肯定双向的,不然也不是通信了,与就想着从这方面来做。

双向通信

双向通信,这是一个问题,因为双向通信的问题要涉及到线程。因为收和发是一个不同的事情。必须要做到的是在接收的同时还能发送,构建线程,使用不同的线程来解决不同的问题,即一个线程来处理接收到信息,另一个线程来处理要发送的信息。另外要强调的是,在CPU中并不是很多很多的线程来处理问题的,而是CPU以一个极短的时间运行一个线程,然后在切换到另一个线程去执行,由于运行的时间相对较短,让人感觉像是在同时执行一样。想在的很多电脑都是多线程的,比如说我的电脑就是四核的,有四个线程可以同时执行。好点的有8核甚至是更多。

当然多线成的问题就解决了的话,就还有一个问题,就是显示,我们不能在同一个控制台上一边显示接收到的消息,一边还要发送信息,显然这样在控制台下是实现不了的,于是就有一个办法就是,我们用窗口来显示,然后在控制台上来送送我们要发送的消息。这样就解决了这个问题。
然后就是附上我的代码:
import java.net.*; 
import java.io.*;
import java.awt.*;

import javax.swing.*;
public class Client extends JFrame{ 
	private static Socket client;
	private static final long serialVersionUID = 1L;
	private JTextArea taContent = new JTextArea();
    public static void main(String[] args){
    	try {
			client=new Socket("192.168.1.123", 6000);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
    	ClientB TB = new ClientB();
    	TB.setClient(client);
    	TB.start();
    	Client ts=new Client();
    	ts.launchFrame();
}
    public void launchFrame() {
		taContent.setEditable(false);	
		taContent.setBackground(Color.WHITE);
		taContent.setForeground(Color.BLACK);
		this.add(taContent);
		this.setSize(300, 350);
		this.setLocation(400, 200);
		this.setTitle("Client information");
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		tcpMonitor();
	} 
    
	public void tcpMonitor() {
		ClientA TA =new ClientA();
    	TA.setClient(client,taContent);
    	TA.start();
	}
}  

class ClientA extends Thread{
	private Socket client = null;
	private JTextArea taContent=null;
	public void setClient(Socket client,JTextArea taContent){
		this.client = client;
		this.taContent=taContent;
	}
    public void run(){
        try {  
            //BufferedReader input = new BufferedReader(new InputStreamReader(System.in));  
            BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));  
            //PrintStream out = new PrintStream(client.getOutputStream()); 
            boolean flag = true;  
            //System.out.println("成功连接到主机,开始通讯!!");  
            taContent.append("连接成功!!"+"\n");
            while (flag) {
            	//if(in!=null)
                //System.out.println(in);  
                //out.println(input.readLine());  //阻塞  
                //判断是否与主机断开  
                if (isConnected()) {
                	if(in.readLine()!="?"){
                		taContent.append("主机:" + in.readLine()+"\n");
                	}
                } else {  
                	taContent.append("发生失败!!"+"\n");  
                	taContent.append("与服务器断开连接!!"+"\n");  
                    client.close();  
                    break;  
                }  
            }  
        } catch (Exception e) {  
            System.out.println(e.getMessage());  
        }  
    }  
   
    //判断服务器是否断开的方法,  
    //通过OutputStream发送一段测试数据,如果发送失败就表示远端已经断开连接  
    //但会与正常的传送干扰,所以用sendUrgenData  
    public boolean isConnected() {  
        try {  
            client.sendUrgentData(0xFF);  
            return true;  
        } catch (Exception e) {  
            e.printStackTrace();  
            return false;  
        }  
    }
}

class ClientB extends Thread{ 
	private Socket client = null;
	public void setClient(Socket client){
		this.client = client;
	}
	public void run(){
		try{
				BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
				PrintWriter out = new PrintWriter(client.getOutputStream(),true);
				
				while(true){
		            System.out.print("请输入信息:"); 
		            String str = input.readLine();
		            out.println();	//这里有点问题
		            out.println(str);
				}
			}
		 catch (Exception e) {  
	            System.out.println(e.getMessage());  
			}
		}   
}


上面的代码中有一个地方有点问题,(//这里有点问题),我在这里多加了一句话,out.println();有心的人就自己去测试一下我为什么要加上这句话,如果不加会出现什么情况。当然我在这里就先不说明。只要你去测试,就一定会发现这其中的问题。
到此基本就结束了使用Java来编写和单片机进行通信,在此基础上有兴趣的人还可以做下去,做更多延伸的东西。当然具体是什么,我就不细说了。

猜你喜欢

转载自blog.csdn.net/qq_21903491/article/details/72984071