java 串口通信

来源:互联网 发布:窥一叶而知秋 编辑:程序博客网 时间:2024/05/18 03:40
/******************************************* 程序文件名称: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 endpublic 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 endpublic 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(); }}
原创粉丝点击