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来编写和单片机进行通信,在此基础上有兴趣的人还可以做下去,做更多延伸的东西。当然具体是什么,我就不细说了。