java 串口通信

简介:
/** *//******************************************
* 程序文件名称:SendComm.java
*  功能:从串行口COM1中发送数据
******************************************/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.comm.*;

 class S_Frame extends Frame implements Runnable,ActionListener
...{ 
  /**//*检测系统中可用的通讯端口类 */
  static CommPortIdentifier      portId; 
  /**//*Enumeration 为枚举型类,在util中  */
  static Enumeration             portList; 
  OutputStream                   outputStream;
  /**//*RS-232的串行口  */
  SerialPort                     serialPort;    
  Thread                         readThread;
  Panel                          p=new Panel();
  TextField in_message=new  TextField("打开COM1,波特率9600,数据位8,停止位1.");
  TextArea  out_message=new TextArea(); 
  Button    btnOpen=new Button("打开串口,   发送数据");
  Button    btnClose=new Button("关闭串口, 停止发送数据");
  byte      data[]=new byte[10240];
    /**//*设置判断要是否关闭串口的标志*/
  boolean   mark;

 /**//*安排窗体*/
 S_Frame()
 ...{ super("串口发送数据");
   setSize(200,200);
   setVisible(true);
   add(out_message,"Center");
   add(p,"North");
   p.add(btnOpen);
   p.add(btnClose);
   add(in_message,"South");
   btnOpen.addActionListener(this);
   btnClose.addActionListener(this);
 } //R_Frame() end

 /**//*点击按扭打开串口.*/
 public void actionPerformed(ActionEvent event) ...{
 if (event.getSource()==btnClose)...{
      serialPort.close();//关闭串口
      mark=true;  //用于中止线程的run()方法
        in_message.setText("串口COM1已经关闭,停止发送数据.");
   }
 else ...{  mark=false;
     /**//*从文本区按字节读取数据*/
     data=out_message.getText().getBytes();
        /**//*打开串口*/
     start();
        in_message.setText("串口COM1已经打开,正在每2秒钟发送一次数据.....");
      }
 } //actionPerformed() end

  /**//*打开串口,并调用线程发送数据*/
 public void start()...{
  /**//*获取系统中所有的通讯端口  */
  portList=CommPortIdentifier.getPortIdentifiers();
  /**//* 用循环结构找出串口 */
  while (portList.hasMoreElements())...{  
   /**//*强制转换为通讯端口类型*/
    portId=(CommPortIdentifier)portList.nextElement();
    if(portId.getPortType() == CommPortIdentifier.PORT_SERIAL)...{
      if (portId.getName().equals("COM1")) ...{
         /**//*打开串口 */
        try ...{
serialPort = (SerialPort) portId.open("ReadComm", 2000);
          } 
catch (PortInUseException e) ...{  }
           /**//*设置串口输出流*/
        try ...{ 
outputStream = serialPort.getOutputStream();
           } 
catch (IOException e) ...{}
      } //if end
     } //if end
   } //while end
   /**//*调用线程发送数据*/
  try...{ 
     readThread = new Thread(this);
    //线程负责每发送一次数据,休眠2秒钟
 readThread.start();
} 
catch (Exception e) ...{  }
 }  //start() end
 
  /**//*发送数据,休眠2秒钟后重发*/
  public void run() ...{
    /**//*设置串口通讯参数*/
    try ...{
         serialPort.setSerialPortParams(9600,
                SerialPort.DATABITS_8,
                SerialPort.STOPBITS_1,
                SerialPort.PARITY_NONE);
        }
 catch (UnsupportedCommOperationException e) ...{  }
        /**//*发送数据流(将数组data[]中的数据发送出去)*/ 
  try ...{ 
outputStream.write(data);
   }
catch (IOException e) ...{  }
        /**//*发送数据后休眠2秒钟,然后再重发*/
  try ...{ Thread.sleep(2000); 
       if (mark)
       ...{return;   //结束run方法,导致线程死亡
       }
       start();
      } 
       catch (InterruptedException e) ...{  }
   }  //run() end
}  //类S_Frame end

public class SendComm
...{public static void main(String args[])
 ...{ S_Frame S_win=new S_Frame();
   S_win.addWindowListener(new WindowAdapter()
     ...{public void windowClosing(WindowEvent e)
      ...{System.exit(0);   }
     });
   S_win.pack();
 }
}


/** *//******************************************
* 程序文件名称:ReadComm.java
*  功能:从串行口COM1中接收数据
******************************************/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.comm.*;

 class R_Frame extends Frame implements Runnable,ActionListener,SerialPortEventListener
...{ 
  /**//*  检测系统中可用的通讯端口类 */
   static CommPortIdentifier     portId; 
     /**//*  Enumeration 为枚举型类,在java.util中  */
   static Enumeration            portList; 
   InputStream                   inputStream;
     /**//*  声明RS-232串行端口的成员变量  */
   SerialPort     serialPort;    
   Thread         readThread;
   String         str="";
   TextField      out_message=new TextField("上面文本框显示接收到的数据");
   TextArea       in_message=new TextArea(); 
   Button         btnOpen=new Button("打开串口");

 /**//*建立窗体*/
 R_Frame()
 ...{
 super("串口接收数据");
   setSize(200,200);
   setVisible(true);
   btnOpen.addActionListener(this);
   add(out_message,"South");
   add(in_message,"Center");
   add(btnOpen,"North");
 } //R_Frame() end

 /**//*点击按扭所触发的事件:打开串口,并监听串口. */
 public void actionPerformed(ActionEvent event)
 ...{
  /**//*获取系统中所有的通讯端口  */
  portList=CommPortIdentifier.getPortIdentifiers();
  /**//* 用循环结构找出串口 */
  while (portList.hasMoreElements())...{  
   /**//*强制转换为通讯端口类型*/
    portId=(CommPortIdentifier)portList.nextElement();
    if(portId.getPortType() == CommPortIdentifier.PORT_SERIAL)...{
      if (portId.getName().equals("COM1")) ...{
        try ...{
serialPort = (SerialPort) portId.open("ReadComm", 2000);
       out_message.setText("已打开端口COM1 ,正在接收数据..... ");
      }
  catch (PortInUseException e) ...{ }

     /**//*设置串口监听器*/
     try ...{
serialPort.addEventListener(this);
} 
        catch (TooManyListenersException e) ...{ }
        /**//* 侦听到串口有数据,触发串口事件*/
     serialPort.notifyOnDataAvailable(true);
      } //if end
     } //if end
   } //while end
   readThread = new Thread(this);
   readThread.start();//线程负责每接收一次数据休眠20秒钟
 } //actionPerformed() end
 
  /**//*接收数据后休眠20秒钟*/
   public void run() ...{
        try ...{
Thread.sleep(20000); 
} 
        catch (InterruptedException e) ...{  }
   }  //run() end

      /**//*串口监听器触发的事件,设置串口通讯参数,读取数据并写到文本区中*/
   public void serialEvent(SerialPortEvent event) ...{
   /**//*设置串口通讯参数:波特率、数据位、停止位、奇偶校验*/
      try ...{
           serialPort.setSerialPortParams(9600,
                  SerialPort.DATABITS_8,
                  SerialPort.STOPBITS_1,
                  SerialPort.PARITY_NONE);
}
 catch (UnsupportedCommOperationException e) ...{   }
  byte[] readBuffer = new byte[20];
     try ...{
inputStream = serialPort.getInputStream();
}
        catch (IOException e) ...{}
try ...{
   /**//* 从线路上读取数据流 */
         while (inputStream.available() > 0) ...{ 
               int numBytes = inputStream.read(readBuffer);
             }    //while end
   str=new String(readBuffer);
         /**//*接收到的数据存放到文本区中*/
   in_message.append(str+" ");
  }
 catch (IOException e) ...{    }
   } //serialEvent() end
}  //类R_Frame end

public class ReadComm
...{
public static void main(String args[])
  ...{
    /**//*  实例化接收串口数据的窗体类  */
 R_Frame R_win=new R_Frame();
/**//*  定义窗体适配器的关闭按钮功能 */
     R_win.addWindowListener(new WindowAdapter()
             ...{public void windowClosing(WindowEvent e)
                ...{System.exit(0); }
      });
   R_win.pack();
 }
}


http://blog.csdn.net/djsl6071/article/details/1594204
相关文章
实现Java多线程中的线程间通信
实现Java多线程中的线程间通信
|
11月前
|
存储 消息中间件 安全
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
【10月更文挑战第9天】本文介绍了如何利用JUC组件实现Java服务与硬件通过MQTT的同步通信(RRPC)。通过模拟MQTT通信流程,使用`LinkedBlockingQueue`作为消息队列,详细讲解了消息发送、接收及响应的同步处理机制,包括任务超时处理和内存泄漏的预防措施。文中还提供了具体的类设计和方法实现,帮助理解同步通信的内部工作原理。
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
|
10月前
|
Java
JAVA多线程通信:为何wait()与notify()如此重要?
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是实现线程间通信的核心机制。它们通过基于锁的方式,使线程在条件不满足时进入休眠状态,并在条件满足时被唤醒,从而确保数据一致性和同步。相比其他通信方式,如忙等待,这些方法更高效灵活。 示例代码展示了如何在生产者-消费者模型中使用这些方法实现线程间的协调和同步。
105 3
|
11月前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
140 1
|
11月前
|
安全 Java 开发者
Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用
本文深入解析了Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用。通过示例代码展示了如何正确使用这些方法,并分享了最佳实践,帮助开发者避免常见陷阱,提高多线程程序的稳定性和效率。
204 1
|
11月前
|
Java
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是线程间通信的核心机制。
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是线程间通信的核心机制。它们通过基于锁的方式,使线程在条件不满足时进入休眠状态,并在条件成立时被唤醒,从而有效解决数据一致性和同步问题。本文通过对比其他通信机制,展示了 `wait()` 和 `notify()` 的优势,并通过生产者-消费者模型的示例代码,详细说明了其使用方法和重要性。
132 1
|
11月前
|
Java
|
11月前
|
Java
用java实现Client和Server之间的互相通信
本文介绍了如何使用Java实现客户端和服务器之间的通信,包括服务器端创建ServerSocket、接受客户端连接、读取和发送消息,以及客户端创建Socket连接、发送和接收消息的完整过程。
343 0
用java实现Client和Server之间的互相通信
|
消息中间件 Java API
解密微服务架构:如何在Java中实现高效的服务通信
微服务架构作为一种现代软件开发模式,通过将应用拆分成多个独立的服务,提升了系统的灵活性和扩展性。然而,实现微服务之间的高效通信仍然是许多开发者面临的挑战。本文将探讨在Java环境中实现微服务架构时,如何使用不同的通信机制来优化服务之间的交互,包括同步和异步通信的方法,以及相关的最佳实践。
|
12月前
|
传感器 网络协议 Java
三大硬核方式揭秘:Java如何与底层硬件和工业设备轻松通信!
大家好,我是V哥。最近与一位从事工业互联网项目的学员交流,启发我分享Java如何与底层硬件和工业设备通信。本文将介绍三种方法:1)使用`jLibModbus`库通过Modbus协议读取设备寄存器数据;2)使用JNI(Java Native Interface)直接访问硬件;3)使用`JSerialComm`库通过串口通信读取数据。每种方法都有详细步骤和示例代码,帮助你轻松实现与硬件设备的通信。无论是工业自动化还是物联网应用,这些方法都能派上用场。欢迎关注和支持!
357 0