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

}


已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页